mirror of
https://github.com/simstudioai/sim.git
synced 2026-02-16 09:26:18 -05:00
Compare commits
413 Commits
feat/group
...
v0.5.91
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b7e377ec4b | ||
|
|
8ebe753bd8 | ||
|
|
40a3962c1e | ||
|
|
d1d43b27bd | ||
|
|
e204628a12 | ||
|
|
6f595f6a2c | ||
|
|
92b4f77228 | ||
|
|
c44211a936 | ||
|
|
5b0532d473 | ||
|
|
3ef6b05035 | ||
|
|
b45f3962fc | ||
|
|
7fbbc7ba7a | ||
|
|
a337aa7dfe | ||
|
|
022e84c4b1 | ||
|
|
602e371a7a | ||
|
|
9a06cae591 | ||
|
|
dce47a101c | ||
|
|
1130f8ddb2 | ||
|
|
ebc2ffa1c5 | ||
|
|
fc97ce007d | ||
|
|
6c006cdfec | ||
|
|
c380e59cb3 | ||
|
|
2944579d21 | ||
|
|
81dfeb0bb0 | ||
|
|
01577a18b4 | ||
|
|
07d50f8fe1 | ||
|
|
52aff4d60b | ||
|
|
3a3bddd6f8 | ||
|
|
639d50d6b9 | ||
|
|
cec74e09c2 | ||
|
|
d5a756c9f2 | ||
|
|
f3e994baf0 | ||
|
|
2f492cacc1 | ||
|
|
27973953f6 | ||
|
|
5792e7e5f9 | ||
|
|
50585273ce | ||
|
|
3d5bd003ef | ||
|
|
13a91113fd | ||
|
|
af01dce2c3 | ||
|
|
8a24b56f51 | ||
|
|
c471627ce1 | ||
|
|
f5dc180d9f | ||
|
|
78fef22d0e | ||
|
|
6d16f216c8 | ||
|
|
f8e9614c9c | ||
|
|
c5dd90e79d | ||
|
|
20b230d1aa | ||
|
|
be3cdcf981 | ||
|
|
73540e3936 | ||
|
|
e321f883b0 | ||
|
|
8b4b3af120 | ||
|
|
190f12fd77 | ||
|
|
e5d30494cb | ||
|
|
b3dbb4487f | ||
|
|
622d0cad22 | ||
|
|
654cb2b407 | ||
|
|
c74922997c | ||
|
|
4193007ab7 | ||
|
|
6c66521d64 | ||
|
|
f9b885f6d5 | ||
|
|
479cd347ad | ||
|
|
0cb6714496 | ||
|
|
7b36f9257e | ||
|
|
99ae5435e3 | ||
|
|
925f06add7 | ||
|
|
193b95cfec | ||
|
|
0ca25bbab6 | ||
|
|
1edaf197b2 | ||
|
|
474b1af145 | ||
|
|
1e21ec1fa3 | ||
|
|
71bd535d04 | ||
|
|
a3a99eda19 | ||
|
|
ed5ed97c07 | ||
|
|
65de27330e | ||
|
|
c0b22a6490 | ||
|
|
9dcf92bd14 | ||
|
|
1a66d48add | ||
|
|
1d4d61a10a | ||
|
|
2d7e6c9796 | ||
|
|
ea3bab1f76 | ||
|
|
552dc56fc3 | ||
|
|
2147309365 | ||
|
|
46822e91f3 | ||
|
|
36ec68d93e | ||
|
|
fce566cc2f | ||
|
|
1933e1aad5 | ||
|
|
793adda986 | ||
|
|
8d846c5983 | ||
|
|
362f4c2918 | ||
|
|
c77e351067 | ||
|
|
a627faabe7 | ||
|
|
f811594875 | ||
|
|
0bc245b7a9 | ||
|
|
0a08ac03b9 | ||
|
|
7977ac88ca | ||
|
|
5b0c2156e0 | ||
|
|
4db6e556b7 | ||
|
|
4ba22527b6 | ||
|
|
c51f266ad7 | ||
|
|
4ca00810b2 | ||
|
|
710bf75bca | ||
|
|
f21fe2309c | ||
|
|
9c3fd1f7af | ||
|
|
a9b7d75d87 | ||
|
|
0449804ffb | ||
|
|
c286f3ed24 | ||
|
|
b738550815 | ||
|
|
2bb68335ee | ||
|
|
c6357f7438 | ||
|
|
b1118935f7 | ||
|
|
3e18b4186c | ||
|
|
e1ac201936 | ||
|
|
8528fbe2d2 | ||
|
|
6cb3977dd9 | ||
|
|
e11758fb43 | ||
|
|
cf2f1abcaf | ||
|
|
4109feecf6 | ||
|
|
37d5e01f5f | ||
|
|
2d799b3272 | ||
|
|
92403e0594 | ||
|
|
31fdd2be13 | ||
|
|
2c4eb9fecb | ||
|
|
aec0de046b | ||
|
|
51565a6e28 | ||
|
|
a280a53034 | ||
|
|
478a53521e | ||
|
|
6cf9841b99 | ||
|
|
656beb8383 | ||
|
|
f7c3de0591 | ||
|
|
2ec9b7f47e | ||
|
|
b0fbf3648d | ||
|
|
f718079593 | ||
|
|
dd2f0c6a6a | ||
|
|
f99518b837 | ||
|
|
2b026ded16 | ||
|
|
dca0758054 | ||
|
|
028bc652c2 | ||
|
|
ae17c90bdf | ||
|
|
1256a15266 | ||
|
|
0b2b7ed9c8 | ||
|
|
c6bf5cd58c | ||
|
|
0d8d9fb238 | ||
|
|
e0f1e66f4f | ||
|
|
20bb7cdec6 | ||
|
|
1469e9c66c | ||
|
|
06d7ce7667 | ||
|
|
1bc476f10b | ||
|
|
9e40342af8 | ||
|
|
0c0f19c717 | ||
|
|
12d529d045 | ||
|
|
57f0837da7 | ||
|
|
5c02d46d55 | ||
|
|
8b2404752b | ||
|
|
c00f05c346 | ||
|
|
78410eef84 | ||
|
|
655fe4f3b7 | ||
|
|
72a2f79701 | ||
|
|
2c2b485f81 | ||
|
|
01e0723a3a | ||
|
|
6814f33243 | ||
|
|
304cf717a4 | ||
|
|
11dc18a80d | ||
|
|
0d0209a108 | ||
|
|
500dcd4734 | ||
|
|
8bdba373c6 | ||
|
|
c8ffda1616 | ||
|
|
b4a389a71f | ||
|
|
65bc21608c | ||
|
|
ef613ef035 | ||
|
|
20b76e67b3 | ||
|
|
7640fdf742 | ||
|
|
bca355c36d | ||
|
|
089427822e | ||
|
|
6b412c578d | ||
|
|
dddd0c8277 | ||
|
|
be7f3db059 | ||
|
|
416c08267a | ||
|
|
ab4e9dc72f | ||
|
|
46ba315701 | ||
|
|
077e702dd8 | ||
|
|
d8df08d3d3 | ||
|
|
51891daf9a | ||
|
|
9ee5dfe185 | ||
|
|
9cba8eee48 | ||
|
|
cb650132c7 | ||
|
|
9dbf56f9cd | ||
|
|
5189473e06 | ||
|
|
37900988eb | ||
|
|
3cc9b1ae56 | ||
|
|
3ccbee187d | ||
|
|
36945deaa5 | ||
|
|
ebf2852733 | ||
|
|
12495ef89c | ||
|
|
d8d85fccf0 | ||
|
|
56bc809c6f | ||
|
|
c7bd48573a | ||
|
|
1c58c35bd8 | ||
|
|
80f00479a3 | ||
|
|
c140e90559 | ||
|
|
d83c418111 | ||
|
|
be2a9ef0f8 | ||
|
|
d63a5cb504 | ||
|
|
1bf5ed4586 | ||
|
|
dc0ed842c4 | ||
|
|
1952b196a0 | ||
|
|
fa03d4d818 | ||
|
|
e14cebeec5 | ||
|
|
404d8c006e | ||
|
|
8bd5d41723 | ||
|
|
ac91d78834 | ||
|
|
6f0a093869 | ||
|
|
c12931bc50 | ||
|
|
bcf6dc8828 | ||
|
|
841cb638fb | ||
|
|
c7db48e3a2 | ||
|
|
4d844651c2 | ||
|
|
9f916940b3 | ||
|
|
3bbf7f5d1d | ||
|
|
68683258c3 | ||
|
|
fc7f56e21b | ||
|
|
8429040921 | ||
|
|
8574e6c71f | ||
|
|
9c3e663cd8 | ||
|
|
48adaa00d8 | ||
|
|
211a7ac3a4 | ||
|
|
0f9b6ad1d2 | ||
|
|
12100e6881 | ||
|
|
23294683e1 | ||
|
|
b913cff46e | ||
|
|
428781ce7d | ||
|
|
f0ee67f3ed | ||
|
|
f44594c380 | ||
|
|
6464cfa7f2 | ||
|
|
7f4edc85ef | ||
|
|
efef91ece0 | ||
|
|
64efeaa2e6 | ||
|
|
9b72b52b33 | ||
|
|
1467862488 | ||
|
|
7f2262857c | ||
|
|
1b309b50e6 | ||
|
|
f765b83a26 | ||
|
|
aa99db6fdd | ||
|
|
e9c4251c1c | ||
|
|
748793e07d | ||
|
|
91da7e183a | ||
|
|
ab09a5ad23 | ||
|
|
fcd0240db6 | ||
|
|
4e4149792a | ||
|
|
9a8b591257 | ||
|
|
f3ae3f8442 | ||
|
|
66dfe2c6b2 | ||
|
|
cc2be33d6b | ||
|
|
376f7cb571 | ||
|
|
42159c23b9 | ||
|
|
2f0f246002 | ||
|
|
900d3ef9ea | ||
|
|
f3fcc28f89 | ||
|
|
7cfdf46724 | ||
|
|
d681451297 | ||
|
|
5987a6d060 | ||
|
|
e2ccefb2f4 | ||
|
|
103b31a569 | ||
|
|
004e058353 | ||
|
|
5157f0bbb2 | ||
|
|
8bbcf31b83 | ||
|
|
9e814315dd | ||
|
|
0ea0256623 | ||
|
|
fb8868c854 | ||
|
|
ea4964052d | ||
|
|
268e2f114f | ||
|
|
45371e521e | ||
|
|
5988d0e46f | ||
|
|
145db9d8c3 | ||
|
|
0ce0f98aa5 | ||
|
|
294b168ed9 | ||
|
|
0dc2c1fe0d | ||
|
|
fb90c4e9b1 | ||
|
|
0af96d06c6 | ||
|
|
1d450578c8 | ||
|
|
c6d408c65b | ||
|
|
16716ea26a | ||
|
|
563098ca0a | ||
|
|
1f1f015031 | ||
|
|
4afb245fa2 | ||
|
|
8344d68ca8 | ||
|
|
a26a1a9737 | ||
|
|
689037a300 | ||
|
|
07f0c01dc4 | ||
|
|
dff1c9d083 | ||
|
|
e4ad31bb6b | ||
|
|
84691fc873 | ||
|
|
2daf34386e | ||
|
|
ac991d4b54 | ||
|
|
69614d2d93 | ||
|
|
6cbadd7110 | ||
|
|
9efd3d5b4c | ||
|
|
e575ba2965 | ||
|
|
5f45db4343 | ||
|
|
81cbfe7af4 | ||
|
|
739341b08e | ||
|
|
3c43779ba3 | ||
|
|
1861f77283 | ||
|
|
72c2ba7443 | ||
|
|
037dad6975 | ||
|
|
408597e12b | ||
|
|
932f8fd654 | ||
|
|
b4c2294e67 | ||
|
|
b09f683072 | ||
|
|
1dbf92db3f | ||
|
|
3a923648cb | ||
|
|
5e2468cfd3 | ||
|
|
7c0f43305b | ||
|
|
ee7572185a | ||
|
|
19a8daedf7 | ||
|
|
0fcd52683a | ||
|
|
b8b20576d3 | ||
|
|
4b8534ebd0 | ||
|
|
f6960a4bd4 | ||
|
|
8740566f6a | ||
|
|
a8bb0db660 | ||
|
|
5de7228dd9 | ||
|
|
75898c69ed | ||
|
|
b14672887b | ||
|
|
d024c1e489 | ||
|
|
d75ea37b3c | ||
|
|
af82820a28 | ||
|
|
fd23220cc3 | ||
|
|
a8d81097fc | ||
|
|
3768c6379c | ||
|
|
aa80116b99 | ||
|
|
78e4ca9d45 | ||
|
|
ce3ddb6ba0 | ||
|
|
8361931cdf | ||
|
|
c863125c6b | ||
|
|
fa63af9222 | ||
|
|
dba57998d2 | ||
|
|
583f5c4cbb | ||
|
|
6ff68b39ce | ||
|
|
55700b9bf4 | ||
|
|
51e376847f | ||
|
|
feb994c819 | ||
|
|
12470a630c | ||
|
|
b813bf7f27 | ||
|
|
81cc88b2e2 | ||
|
|
87e6057033 | ||
|
|
f1796d13df | ||
|
|
6f469a7f37 | ||
|
|
a35f6eca03 | ||
|
|
1cc489e544 | ||
|
|
e499cc4f82 | ||
|
|
5e44357b9f | ||
|
|
debcd76019 | ||
|
|
4372841797 | ||
|
|
929d0d01fd | ||
|
|
e53538d079 | ||
|
|
d4c171c6d7 | ||
|
|
26d0799d22 | ||
|
|
45bd1e8cd7 | ||
|
|
85d6e3e3bd | ||
|
|
ccf268595e | ||
|
|
5eca660c5c | ||
|
|
3db9ad2d95 | ||
|
|
4195cfe1ff | ||
|
|
212933746e | ||
|
|
5af72ea22f | ||
|
|
4899c28421 | ||
|
|
2cee30ff15 | ||
|
|
41f9374b5c | ||
|
|
6c8c3d6368 | ||
|
|
3f1dccd6aa | ||
|
|
468ec2ea81 | ||
|
|
d7e0d9ba43 | ||
|
|
51477c12cc | ||
|
|
a3535639f1 | ||
|
|
d5bd97de32 | ||
|
|
bd7009e316 | ||
|
|
4f04b1efea | ||
|
|
258e96d6b5 | ||
|
|
4b026ad54d | ||
|
|
f6b7c15dc4 | ||
|
|
70ed19fcdb | ||
|
|
d6e4c91e81 | ||
|
|
e3fa40af11 | ||
|
|
6e0055f847 | ||
|
|
ebbe67aae3 | ||
|
|
2b49d15ec8 | ||
|
|
3d037c9b74 | ||
|
|
5e8c843241 | ||
|
|
7bf3d73ee6 | ||
|
|
7ffc11a738 | ||
|
|
be578e2ed7 | ||
|
|
f415e5edc4 | ||
|
|
13a6e6c3fa | ||
|
|
f5ab7f21ae | ||
|
|
bfb6fffe38 | ||
|
|
4fbec0a43f | ||
|
|
585f5e365b | ||
|
|
3792bdd252 | ||
|
|
eb5d1f3e5b | ||
|
|
54ab82c8dd | ||
|
|
f895bf469b | ||
|
|
dd3209af06 | ||
|
|
b6ba3b50a7 | ||
|
|
b304233062 | ||
|
|
57e4b49bd6 | ||
|
|
e12dd204ed | ||
|
|
3d9d9cbc54 | ||
|
|
0f4ec962ad | ||
|
|
4827866f9a | ||
|
|
3e697d9ed9 | ||
|
|
4431a1a484 | ||
|
|
4d1a9a3f22 | ||
|
|
eb07a080fb |
@@ -183,6 +183,109 @@ export const {ServiceName}Block: BlockConfig = {
|
||||
}
|
||||
```
|
||||
|
||||
## File Input Handling
|
||||
|
||||
When your block accepts file uploads, use the basic/advanced mode pattern with `normalizeFileInput`.
|
||||
|
||||
### Basic/Advanced File Pattern
|
||||
|
||||
```typescript
|
||||
// Basic mode: Visual file upload
|
||||
{
|
||||
id: 'uploadFile',
|
||||
title: 'File',
|
||||
type: 'file-upload',
|
||||
canonicalParamId: 'file', // Both map to 'file' param
|
||||
placeholder: 'Upload file',
|
||||
mode: 'basic',
|
||||
multiple: false,
|
||||
required: true,
|
||||
condition: { field: 'operation', value: 'upload' },
|
||||
},
|
||||
// Advanced mode: Reference from other blocks
|
||||
{
|
||||
id: 'fileRef',
|
||||
title: 'File',
|
||||
type: 'short-input',
|
||||
canonicalParamId: 'file', // Both map to 'file' param
|
||||
placeholder: 'Reference file (e.g., {{file_block.output}})',
|
||||
mode: 'advanced',
|
||||
required: true,
|
||||
condition: { field: 'operation', value: 'upload' },
|
||||
},
|
||||
```
|
||||
|
||||
**Critical constraints:**
|
||||
- `canonicalParamId` must NOT match any subblock's `id` in the same block
|
||||
- Values are stored under subblock `id`, not `canonicalParamId`
|
||||
|
||||
### Normalizing File Input in tools.config
|
||||
|
||||
Use `normalizeFileInput` to handle all input variants:
|
||||
|
||||
```typescript
|
||||
import { normalizeFileInput } from '@/blocks/utils'
|
||||
|
||||
tools: {
|
||||
access: ['service_upload'],
|
||||
config: {
|
||||
tool: (params) => {
|
||||
// Check all field IDs: uploadFile (basic), fileRef (advanced), fileContent (legacy)
|
||||
const normalizedFile = normalizeFileInput(
|
||||
params.uploadFile || params.fileRef || params.fileContent,
|
||||
{ single: true }
|
||||
)
|
||||
if (normalizedFile) {
|
||||
params.file = normalizedFile
|
||||
}
|
||||
return `service_${params.operation}`
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
**Why this pattern?**
|
||||
- Values come through as `params.uploadFile` or `params.fileRef` (the subblock IDs)
|
||||
- `canonicalParamId` only controls UI/schema mapping, not runtime values
|
||||
- `normalizeFileInput` handles JSON strings from advanced mode template resolution
|
||||
|
||||
### File Input Types in `inputs`
|
||||
|
||||
Use `type: 'json'` for file inputs:
|
||||
|
||||
```typescript
|
||||
inputs: {
|
||||
uploadFile: { type: 'json', description: 'Uploaded file (UserFile)' },
|
||||
fileRef: { type: 'json', description: 'File reference from previous block' },
|
||||
// Legacy field for backwards compatibility
|
||||
fileContent: { type: 'string', description: 'Legacy: base64 encoded content' },
|
||||
}
|
||||
```
|
||||
|
||||
### Multiple Files
|
||||
|
||||
For multiple file uploads:
|
||||
|
||||
```typescript
|
||||
{
|
||||
id: 'attachments',
|
||||
title: 'Attachments',
|
||||
type: 'file-upload',
|
||||
multiple: true, // Allow multiple files
|
||||
maxSize: 25, // Max size in MB per file
|
||||
acceptedTypes: 'image/*,application/pdf,.doc,.docx',
|
||||
}
|
||||
|
||||
// In tools.config:
|
||||
const normalizedFiles = normalizeFileInput(
|
||||
params.attachments || params.attachmentRefs,
|
||||
// No { single: true } - returns array
|
||||
)
|
||||
if (normalizedFiles) {
|
||||
params.files = normalizedFiles
|
||||
}
|
||||
```
|
||||
|
||||
## Condition Syntax
|
||||
|
||||
Controls when a field is shown based on other field values.
|
||||
@@ -351,14 +454,16 @@ Enables AI-assisted field generation.
|
||||
|
||||
## Tools Configuration
|
||||
|
||||
### Simple Tool Selector
|
||||
**Preferred:** Use tool names directly as dropdown option IDs to avoid switch cases:
|
||||
```typescript
|
||||
tools: {
|
||||
access: ['service_create', 'service_read', 'service_update'],
|
||||
config: {
|
||||
tool: (params) => `service_${params.operation}`,
|
||||
},
|
||||
}
|
||||
// Dropdown options use tool IDs directly
|
||||
options: [
|
||||
{ label: 'Create', id: 'service_create' },
|
||||
{ label: 'Read', id: 'service_read' },
|
||||
]
|
||||
|
||||
// Tool selector just returns the operation value
|
||||
tool: (params) => params.operation,
|
||||
```
|
||||
|
||||
### With Parameter Transformation
|
||||
@@ -577,6 +682,17 @@ export const ServiceBlock: BlockConfig = {
|
||||
|
||||
See the `/add-trigger` skill for creating triggers.
|
||||
|
||||
## Icon Requirement
|
||||
|
||||
If the icon doesn't already exist in `@/components/icons.tsx`, **do NOT search for it yourself**. After completing the block, ask the user to provide the SVG:
|
||||
|
||||
```
|
||||
The block is complete, but I need an icon for {Service}.
|
||||
Please provide the SVG and I'll convert it to a React component.
|
||||
|
||||
You can usually find this in the service's brand/press kit page, or copy it from their website.
|
||||
```
|
||||
|
||||
## Checklist Before Finishing
|
||||
|
||||
- [ ] All subBlocks have `id`, `title` (except switch), and `type`
|
||||
@@ -588,4 +704,5 @@ See the `/add-trigger` skill for creating triggers.
|
||||
- [ ] Tools.config.tool returns correct tool ID
|
||||
- [ ] Outputs match tool outputs
|
||||
- [ ] Block registered in registry.ts
|
||||
- [ ] If icon missing: asked user to provide SVG
|
||||
- [ ] If triggers exist: `triggers` config set, trigger subBlocks spread
|
||||
|
||||
@@ -206,10 +206,15 @@ export const {Service}Block: BlockConfig = {
|
||||
}
|
||||
```
|
||||
|
||||
**Critical:**
|
||||
- `canonicalParamId` must NOT match any other subblock's `id`, must be unique per block, and should only be used to link basic/advanced alternatives for the same parameter.
|
||||
- `mode` only controls UI visibility, NOT serialization. Without `canonicalParamId`, both basic and advanced field values would be sent.
|
||||
- Every subblock `id` must be unique within the block. Duplicate IDs cause conflicts even with different conditions.
|
||||
**Critical Canonical Param Rules:**
|
||||
- `canonicalParamId` must NOT match any subblock's `id` in the block
|
||||
- `canonicalParamId` must be unique per operation/condition context
|
||||
- Only use `canonicalParamId` to link basic/advanced alternatives for the same logical parameter
|
||||
- `mode` only controls UI visibility, NOT serialization. Without `canonicalParamId`, both basic and advanced field values would be sent
|
||||
- Every subblock `id` must be unique within the block. Duplicate IDs cause conflicts even with different conditions
|
||||
- **Required consistency:** If one subblock in a canonical group has `required: true`, ALL subblocks in that group must have `required: true` (prevents bypassing validation by switching modes)
|
||||
- **Inputs section:** Must list canonical param IDs (e.g., `fileId`), NOT raw subblock IDs (e.g., `fileSelector`, `manualFileId`)
|
||||
- **Params function:** Must use canonical param IDs, NOT raw subblock IDs (raw IDs are deleted after canonical transformation)
|
||||
|
||||
## Step 4: Add Icon
|
||||
|
||||
@@ -226,17 +231,26 @@ export function {Service}Icon(props: SVGProps<SVGSVGElement>) {
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
{/* SVG paths from brand assets */}
|
||||
{/* SVG paths from user-provided SVG */}
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
### Finding Icons
|
||||
1. Check the service's brand/press kit page
|
||||
2. Download SVG logo
|
||||
3. Convert to React component
|
||||
4. Ensure it accepts and spreads props
|
||||
### Getting Icons
|
||||
**Do NOT search for icons yourself.** At the end of implementation, ask the user to provide the SVG:
|
||||
|
||||
```
|
||||
I've completed the integration. Before I can add the icon, please provide the SVG for {Service}.
|
||||
You can usually find this in the service's brand/press kit page, or copy it from their website.
|
||||
|
||||
Paste the SVG code here and I'll convert it to a React component.
|
||||
```
|
||||
|
||||
Once the user provides the SVG:
|
||||
1. Extract the SVG paths/content
|
||||
2. Create a React component that spreads props
|
||||
3. Ensure viewBox is preserved from the original SVG
|
||||
|
||||
## Step 5: Create Triggers (Optional)
|
||||
|
||||
@@ -405,6 +419,7 @@ If creating V2 versions (API-aligned outputs):
|
||||
- [ ] If triggers: spread trigger subBlocks with `getTrigger()`
|
||||
|
||||
### Icon
|
||||
- [ ] Asked user to provide SVG
|
||||
- [ ] Added icon to `components/icons.tsx`
|
||||
- [ ] Icon spreads props correctly
|
||||
|
||||
@@ -433,14 +448,244 @@ You: I'll add the Stripe integration. Let me:
|
||||
1. First, research the Stripe API using Context7
|
||||
2. Create the tools for key operations (payments, subscriptions, etc.)
|
||||
3. Create the block with operation dropdown
|
||||
4. Add the Stripe icon
|
||||
5. Register everything
|
||||
6. Generate docs
|
||||
4. Register everything
|
||||
5. Generate docs
|
||||
6. Ask you for the Stripe icon SVG
|
||||
|
||||
[Proceed with implementation...]
|
||||
|
||||
[After completing steps 1-5...]
|
||||
|
||||
I've completed the Stripe integration. Before I can add the icon, please provide the SVG for Stripe.
|
||||
You can usually find this in the service's brand/press kit page, or copy it from their website.
|
||||
|
||||
Paste the SVG code here and I'll convert it to a React component.
|
||||
```
|
||||
|
||||
## Common Gotchas
|
||||
## File Handling
|
||||
|
||||
When your integration handles file uploads or downloads, follow these patterns to work with `UserFile` objects consistently.
|
||||
|
||||
### What is a UserFile?
|
||||
|
||||
A `UserFile` is the standard file representation in Sim:
|
||||
|
||||
```typescript
|
||||
interface UserFile {
|
||||
id: string // Unique identifier
|
||||
name: string // Original filename
|
||||
url: string // Presigned URL for download
|
||||
size: number // File size in bytes
|
||||
type: string // MIME type (e.g., 'application/pdf')
|
||||
base64?: string // Optional base64 content (if small file)
|
||||
key?: string // Internal storage key
|
||||
context?: object // Storage context metadata
|
||||
}
|
||||
```
|
||||
|
||||
### File Input Pattern (Uploads)
|
||||
|
||||
For tools that accept file uploads, **always route through an internal API endpoint** rather than calling external APIs directly. This ensures proper file content retrieval.
|
||||
|
||||
#### 1. Block SubBlocks for File Input
|
||||
|
||||
Use the basic/advanced mode pattern:
|
||||
|
||||
```typescript
|
||||
// Basic mode: File upload UI
|
||||
{
|
||||
id: 'uploadFile',
|
||||
title: 'File',
|
||||
type: 'file-upload',
|
||||
canonicalParamId: 'file', // Maps to 'file' param
|
||||
placeholder: 'Upload file',
|
||||
mode: 'basic',
|
||||
multiple: false,
|
||||
required: true,
|
||||
condition: { field: 'operation', value: 'upload' },
|
||||
},
|
||||
// Advanced mode: Reference from previous block
|
||||
{
|
||||
id: 'fileRef',
|
||||
title: 'File',
|
||||
type: 'short-input',
|
||||
canonicalParamId: 'file', // Same canonical param
|
||||
placeholder: 'Reference file (e.g., {{file_block.output}})',
|
||||
mode: 'advanced',
|
||||
required: true,
|
||||
condition: { field: 'operation', value: 'upload' },
|
||||
},
|
||||
```
|
||||
|
||||
**Critical:** `canonicalParamId` must NOT match any subblock `id`.
|
||||
|
||||
#### 2. Normalize File Input in Block Config
|
||||
|
||||
In `tools.config.tool`, use `normalizeFileInput` to handle all input variants:
|
||||
|
||||
```typescript
|
||||
import { normalizeFileInput } from '@/blocks/utils'
|
||||
|
||||
tools: {
|
||||
config: {
|
||||
tool: (params) => {
|
||||
// Normalize file from basic (uploadFile), advanced (fileRef), or legacy (fileContent)
|
||||
const normalizedFile = normalizeFileInput(
|
||||
params.uploadFile || params.fileRef || params.fileContent,
|
||||
{ single: true }
|
||||
)
|
||||
if (normalizedFile) {
|
||||
params.file = normalizedFile
|
||||
}
|
||||
return `{service}_${params.operation}`
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. Create Internal API Route
|
||||
|
||||
Create `apps/sim/app/api/tools/{service}/{action}/route.ts`:
|
||||
|
||||
```typescript
|
||||
import { createLogger } from '@sim/logger'
|
||||
import { NextResponse, type NextRequest } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { generateRequestId } from '@/lib/core/utils/request'
|
||||
import { FileInputSchema, type RawFileInput } from '@/lib/uploads/utils/file-schemas'
|
||||
import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils'
|
||||
import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server'
|
||||
|
||||
const logger = createLogger('{Service}UploadAPI')
|
||||
|
||||
const RequestSchema = z.object({
|
||||
accessToken: z.string(),
|
||||
file: FileInputSchema.optional().nullable(),
|
||||
// Legacy field for backwards compatibility
|
||||
fileContent: z.string().optional().nullable(),
|
||||
// ... other params
|
||||
})
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
const requestId = generateRequestId()
|
||||
|
||||
const authResult = await checkInternalAuth(request, { requireWorkflowId: false })
|
||||
if (!authResult.success) {
|
||||
return NextResponse.json({ success: false, error: 'Unauthorized' }, { status: 401 })
|
||||
}
|
||||
|
||||
const body = await request.json()
|
||||
const data = RequestSchema.parse(body)
|
||||
|
||||
let fileBuffer: Buffer
|
||||
let fileName: string
|
||||
|
||||
// Prefer UserFile input, fall back to legacy base64
|
||||
if (data.file) {
|
||||
const userFiles = processFilesToUserFiles([data.file as RawFileInput], requestId, logger)
|
||||
if (userFiles.length === 0) {
|
||||
return NextResponse.json({ success: false, error: 'Invalid file' }, { status: 400 })
|
||||
}
|
||||
const userFile = userFiles[0]
|
||||
fileBuffer = await downloadFileFromStorage(userFile, requestId, logger)
|
||||
fileName = userFile.name
|
||||
} else if (data.fileContent) {
|
||||
// Legacy: base64 string (backwards compatibility)
|
||||
fileBuffer = Buffer.from(data.fileContent, 'base64')
|
||||
fileName = 'file'
|
||||
} else {
|
||||
return NextResponse.json({ success: false, error: 'File required' }, { status: 400 })
|
||||
}
|
||||
|
||||
// Now call external API with fileBuffer
|
||||
const response = await fetch('https://api.{service}.com/upload', {
|
||||
method: 'POST',
|
||||
headers: { Authorization: `Bearer ${data.accessToken}` },
|
||||
body: new Uint8Array(fileBuffer), // Convert Buffer for fetch
|
||||
})
|
||||
|
||||
// ... handle response
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. Update Tool to Use Internal Route
|
||||
|
||||
```typescript
|
||||
export const {service}UploadTool: ToolConfig<Params, Response> = {
|
||||
id: '{service}_upload',
|
||||
// ...
|
||||
params: {
|
||||
file: { type: 'file', required: false, visibility: 'user-or-llm' },
|
||||
fileContent: { type: 'string', required: false, visibility: 'hidden' }, // Legacy
|
||||
},
|
||||
request: {
|
||||
url: '/api/tools/{service}/upload', // Internal route
|
||||
method: 'POST',
|
||||
body: (params) => ({
|
||||
accessToken: params.accessToken,
|
||||
file: params.file,
|
||||
fileContent: params.fileContent,
|
||||
}),
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### File Output Pattern (Downloads)
|
||||
|
||||
For tools that return files, use `FileToolProcessor` to store files and return `UserFile` objects.
|
||||
|
||||
#### In Tool transformResponse
|
||||
|
||||
```typescript
|
||||
import { FileToolProcessor } from '@/executor/utils/file-tool-processor'
|
||||
|
||||
transformResponse: async (response, context) => {
|
||||
const data = await response.json()
|
||||
|
||||
// Process file outputs to UserFile objects
|
||||
const fileProcessor = new FileToolProcessor(context)
|
||||
const file = await fileProcessor.processFileData({
|
||||
data: data.content, // base64 or buffer
|
||||
mimeType: data.mimeType,
|
||||
filename: data.filename,
|
||||
})
|
||||
|
||||
return {
|
||||
success: true,
|
||||
output: { file },
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### In API Route (for complex file handling)
|
||||
|
||||
```typescript
|
||||
// Return file data that FileToolProcessor can handle
|
||||
return NextResponse.json({
|
||||
success: true,
|
||||
output: {
|
||||
file: {
|
||||
data: base64Content,
|
||||
mimeType: 'application/pdf',
|
||||
filename: 'document.pdf',
|
||||
},
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
### Key Helpers Reference
|
||||
|
||||
| Helper | Location | Purpose |
|
||||
|--------|----------|---------|
|
||||
| `normalizeFileInput` | `@/blocks/utils` | Normalize file params in block config |
|
||||
| `processFilesToUserFiles` | `@/lib/uploads/utils/file-utils` | Convert raw inputs to UserFile[] |
|
||||
| `downloadFileFromStorage` | `@/lib/uploads/utils/file-utils.server` | Get file Buffer from UserFile |
|
||||
| `FileToolProcessor` | `@/executor/utils/file-tool-processor` | Process tool output files |
|
||||
| `isUserFile` | `@/lib/core/utils/user-file` | Type guard for UserFile objects |
|
||||
| `FileInputSchema` | `@/lib/uploads/utils/file-schemas` | Zod schema for file validation |
|
||||
|
||||
### Common Gotchas
|
||||
|
||||
1. **OAuth serviceId must match** - The `serviceId` in oauth-input must match the OAuth provider configuration
|
||||
2. **Tool IDs are snake_case** - `stripe_create_payment`, not `stripeCreatePayment`
|
||||
@@ -448,3 +693,5 @@ You: I'll add the Stripe integration. Let me:
|
||||
4. **Alphabetical ordering** - Keep imports and registry entries alphabetically sorted
|
||||
5. **Required can be conditional** - Use `required: { field: 'op', value: 'create' }` instead of always true
|
||||
6. **DependsOn clears options** - When a dependency changes, selector options are refetched
|
||||
7. **Never pass Buffer directly to fetch** - Convert to `new Uint8Array(buffer)` for TypeScript compatibility
|
||||
8. **Always handle legacy file params** - Keep hidden `fileContent` params for backwards compatibility
|
||||
|
||||
@@ -55,21 +55,21 @@ export const {serviceName}{Action}Tool: ToolConfig<
|
||||
},
|
||||
|
||||
params: {
|
||||
// Hidden params (system-injected)
|
||||
// Hidden params (system-injected, only use hidden for oauth accessToken)
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'hidden',
|
||||
description: 'OAuth access token',
|
||||
},
|
||||
// User-only params (credentials, IDs user must provide)
|
||||
// User-only params (credentials, api key, IDs user must provide)
|
||||
someId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'The ID of the resource',
|
||||
},
|
||||
// User-or-LLM params (can be provided by user OR computed by LLM)
|
||||
// User-or-LLM params (everything else, can be provided by user OR computed by LLM)
|
||||
query: {
|
||||
type: 'string',
|
||||
required: false, // Use false for optional
|
||||
@@ -114,8 +114,8 @@ export const {serviceName}{Action}Tool: ToolConfig<
|
||||
|
||||
### Visibility Options
|
||||
- `'hidden'` - System-injected (OAuth tokens, internal params). User never sees.
|
||||
- `'user-only'` - User must provide (credentials, account-specific IDs)
|
||||
- `'user-or-llm'` - User provides OR LLM can compute (search queries, content, filters)
|
||||
- `'user-only'` - User must provide (credentials, api keys, account-specific IDs)
|
||||
- `'user-or-llm'` - User provides OR LLM can compute (search queries, content, filters, most fall into this category)
|
||||
|
||||
### Parameter Types
|
||||
- `'string'` - Text values
|
||||
|
||||
@@ -552,6 +552,53 @@ All fields automatically have:
|
||||
- `mode: 'trigger'` - Only shown in trigger mode
|
||||
- `condition: { field: 'selectedTriggerId', value: triggerId }` - Only shown when this trigger is selected
|
||||
|
||||
## Trigger Outputs & Webhook Input Formatting
|
||||
|
||||
### Important: Two Sources of Truth
|
||||
|
||||
There are two related but separate concerns:
|
||||
|
||||
1. **Trigger `outputs`** - Schema/contract defining what fields SHOULD be available. Used by UI for tag dropdown.
|
||||
2. **`formatWebhookInput`** - Implementation that transforms raw webhook payload into actual data. Located in `apps/sim/lib/webhooks/utils.server.ts`.
|
||||
|
||||
**These MUST be aligned.** The fields returned by `formatWebhookInput` should match what's defined in trigger `outputs`. If they differ:
|
||||
- Tag dropdown shows fields that don't exist (broken variable resolution)
|
||||
- Or actual data has fields not shown in dropdown (users can't discover them)
|
||||
|
||||
### When to Add a formatWebhookInput Handler
|
||||
|
||||
- **Simple providers**: If the raw webhook payload structure already matches your outputs, you don't need a handler. The generic fallback returns `body` directly.
|
||||
- **Complex providers**: If you need to transform, flatten, extract nested data, compute fields, or handle conditional logic, add a handler.
|
||||
|
||||
### Adding a Handler
|
||||
|
||||
In `apps/sim/lib/webhooks/utils.server.ts`, add a handler block:
|
||||
|
||||
```typescript
|
||||
if (foundWebhook.provider === '{service}') {
|
||||
// Transform raw webhook body to match trigger outputs
|
||||
return {
|
||||
eventType: body.type,
|
||||
resourceId: body.data?.id || '',
|
||||
timestamp: body.created_at,
|
||||
resource: body.data,
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Key rules:**
|
||||
- Return fields that match your trigger `outputs` definition exactly
|
||||
- No wrapper objects like `webhook: { data: ... }` or `{service}: { ... }`
|
||||
- No duplication (don't spread body AND add individual fields)
|
||||
- Use `null` for missing optional data, not empty objects with empty strings
|
||||
|
||||
### Verify Alignment
|
||||
|
||||
Run the alignment checker:
|
||||
```bash
|
||||
bunx scripts/check-trigger-alignment.ts {service}
|
||||
```
|
||||
|
||||
## Trigger Outputs
|
||||
|
||||
Trigger outputs use the same schema as block outputs (NOT tool outputs).
|
||||
@@ -649,6 +696,11 @@ export const {service}WebhookTrigger: TriggerConfig = {
|
||||
- [ ] Added `delete{Service}Webhook` function to `provider-subscriptions.ts`
|
||||
- [ ] Added provider to `cleanupExternalWebhook` function
|
||||
|
||||
### Webhook Input Formatting
|
||||
- [ ] Added handler in `apps/sim/lib/webhooks/utils.server.ts` (if custom formatting needed)
|
||||
- [ ] Handler returns fields matching trigger `outputs` exactly
|
||||
- [ ] Run `bunx scripts/check-trigger-alignment.ts {service}` to verify alignment
|
||||
|
||||
### Testing
|
||||
- [ ] Run `bun run type-check` to verify no TypeScript errors
|
||||
- [ ] Restart dev server to pick up new triggers
|
||||
|
||||
35
.claude/rules/emcn-components.md
Normal file
35
.claude/rules/emcn-components.md
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/components/emcn/**"
|
||||
---
|
||||
|
||||
# EMCN Components
|
||||
|
||||
Import from `@/components/emcn`, never from subpaths (except CSS files).
|
||||
|
||||
## CVA vs Direct Styles
|
||||
|
||||
**Use CVA when:** 2+ variants (primary/secondary, sm/md/lg)
|
||||
|
||||
```tsx
|
||||
const buttonVariants = cva('base-classes', {
|
||||
variants: { variant: { default: '...', primary: '...' } }
|
||||
})
|
||||
export { Button, buttonVariants }
|
||||
```
|
||||
|
||||
**Use direct className when:** Single consistent style, no variations
|
||||
|
||||
```tsx
|
||||
function Label({ className, ...props }) {
|
||||
return <Primitive className={cn('style-classes', className)} {...props} />
|
||||
}
|
||||
```
|
||||
|
||||
## Rules
|
||||
|
||||
- Use Radix UI primitives for accessibility
|
||||
- Export component and variants (if using CVA)
|
||||
- TSDoc with usage examples
|
||||
- Consistent tokens: `font-medium`, `text-[12px]`, `rounded-[4px]`
|
||||
- `transition-colors` for hover states
|
||||
13
.claude/rules/global.md
Normal file
13
.claude/rules/global.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Global Standards
|
||||
|
||||
## Logging
|
||||
Import `createLogger` from `sim/logger`. Use `logger.info`, `logger.warn`, `logger.error` instead of `console.log`.
|
||||
|
||||
## Comments
|
||||
Use TSDoc for documentation. No `====` separators. No non-TSDoc comments.
|
||||
|
||||
## Styling
|
||||
Never update global styles. Keep all styling local to components.
|
||||
|
||||
## Package Manager
|
||||
Use `bun` and `bunx`, not `npm` and `npx`.
|
||||
56
.claude/rules/sim-architecture.md
Normal file
56
.claude/rules/sim-architecture.md
Normal file
@@ -0,0 +1,56 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/**"
|
||||
---
|
||||
|
||||
# Sim App Architecture
|
||||
|
||||
## Core Principles
|
||||
1. **Single Responsibility**: Each component, hook, store has one clear purpose
|
||||
2. **Composition Over Complexity**: Break down complex logic into smaller pieces
|
||||
3. **Type Safety First**: TypeScript interfaces for all props, state, return types
|
||||
4. **Predictable State**: Zustand for global state, useState for UI-only concerns
|
||||
|
||||
## Root-Level Structure
|
||||
|
||||
```
|
||||
apps/sim/
|
||||
├── app/ # Next.js app router (pages, API routes)
|
||||
├── blocks/ # Block definitions and registry
|
||||
├── components/ # Shared UI (emcn/, ui/)
|
||||
├── executor/ # Workflow execution engine
|
||||
├── hooks/ # Shared hooks (queries/, selectors/)
|
||||
├── lib/ # App-wide utilities
|
||||
├── providers/ # LLM provider integrations
|
||||
├── stores/ # Zustand stores
|
||||
├── tools/ # Tool definitions
|
||||
└── triggers/ # Trigger definitions
|
||||
```
|
||||
|
||||
## Feature Organization
|
||||
|
||||
Features live under `app/workspace/[workspaceId]/`:
|
||||
|
||||
```
|
||||
feature/
|
||||
├── components/ # Feature components
|
||||
├── hooks/ # Feature-scoped hooks
|
||||
├── utils/ # Feature-scoped utilities (2+ consumers)
|
||||
├── feature.tsx # Main component
|
||||
└── page.tsx # Next.js page entry
|
||||
```
|
||||
|
||||
## Naming Conventions
|
||||
- **Components**: PascalCase (`WorkflowList`)
|
||||
- **Hooks**: `use` prefix (`useWorkflowOperations`)
|
||||
- **Files**: kebab-case (`workflow-list.tsx`)
|
||||
- **Stores**: `stores/feature/store.ts`
|
||||
- **Constants**: SCREAMING_SNAKE_CASE
|
||||
- **Interfaces**: PascalCase with suffix (`WorkflowListProps`)
|
||||
|
||||
## Utils Rules
|
||||
|
||||
- **Never create `utils.ts` for single consumer** - inline it
|
||||
- **Create `utils.ts` when** 2+ files need the same helper
|
||||
- **Check existing sources** before duplicating (`lib/` has many utilities)
|
||||
- **Location**: `lib/` (app-wide) → `feature/utils/` (feature-scoped) → inline (single-use)
|
||||
48
.claude/rules/sim-components.md
Normal file
48
.claude/rules/sim-components.md
Normal file
@@ -0,0 +1,48 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/**/*.tsx"
|
||||
---
|
||||
|
||||
# Component Patterns
|
||||
|
||||
## Structure Order
|
||||
|
||||
```typescript
|
||||
'use client' // Only if using hooks
|
||||
|
||||
// Imports (external → internal)
|
||||
// Constants at module level
|
||||
const CONFIG = { SPACING: 8 } as const
|
||||
|
||||
// Props interface
|
||||
interface ComponentProps {
|
||||
requiredProp: string
|
||||
optionalProp?: boolean
|
||||
}
|
||||
|
||||
export function Component({ requiredProp, optionalProp = false }: ComponentProps) {
|
||||
// a. Refs
|
||||
// b. External hooks (useParams, useRouter)
|
||||
// c. Store hooks
|
||||
// d. Custom hooks
|
||||
// e. Local state
|
||||
// f. useMemo
|
||||
// g. useCallback
|
||||
// h. useEffect
|
||||
// i. Return JSX
|
||||
}
|
||||
```
|
||||
|
||||
## Rules
|
||||
|
||||
1. `'use client'` only when using React hooks
|
||||
2. Always define props interface
|
||||
3. Extract constants with `as const`
|
||||
4. Semantic HTML (`aside`, `nav`, `article`)
|
||||
5. Optional chain callbacks: `onAction?.(id)`
|
||||
|
||||
## Component Extraction
|
||||
|
||||
**Extract when:** 50+ lines, used in 2+ files, or has own state/logic
|
||||
|
||||
**Keep inline when:** < 10 lines, single use, purely presentational
|
||||
55
.claude/rules/sim-hooks.md
Normal file
55
.claude/rules/sim-hooks.md
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/**/use-*.ts"
|
||||
- "apps/sim/**/hooks/**/*.ts"
|
||||
---
|
||||
|
||||
# Hook Patterns
|
||||
|
||||
## Structure
|
||||
|
||||
```typescript
|
||||
interface UseFeatureProps {
|
||||
id: string
|
||||
onSuccess?: (result: Result) => void
|
||||
}
|
||||
|
||||
export function useFeature({ id, onSuccess }: UseFeatureProps) {
|
||||
// 1. Refs for stable dependencies
|
||||
const idRef = useRef(id)
|
||||
const onSuccessRef = useRef(onSuccess)
|
||||
|
||||
// 2. State
|
||||
const [data, setData] = useState<Data | null>(null)
|
||||
const [isLoading, setIsLoading] = useState(false)
|
||||
|
||||
// 3. Sync refs
|
||||
useEffect(() => {
|
||||
idRef.current = id
|
||||
onSuccessRef.current = onSuccess
|
||||
}, [id, onSuccess])
|
||||
|
||||
// 4. Operations (useCallback with empty deps when using refs)
|
||||
const fetchData = useCallback(async () => {
|
||||
setIsLoading(true)
|
||||
try {
|
||||
const result = await fetch(`/api/${idRef.current}`).then(r => r.json())
|
||||
setData(result)
|
||||
onSuccessRef.current?.(result)
|
||||
} finally {
|
||||
setIsLoading(false)
|
||||
}
|
||||
}, [])
|
||||
|
||||
return { data, isLoading, fetchData }
|
||||
}
|
||||
```
|
||||
|
||||
## Rules
|
||||
|
||||
1. Single responsibility per hook
|
||||
2. Props interface required
|
||||
3. Refs for stable callback dependencies
|
||||
4. Wrap returned functions in useCallback
|
||||
5. Always try/catch async operations
|
||||
6. Track loading/error states
|
||||
62
.claude/rules/sim-imports.md
Normal file
62
.claude/rules/sim-imports.md
Normal file
@@ -0,0 +1,62 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/**/*.ts"
|
||||
- "apps/sim/**/*.tsx"
|
||||
---
|
||||
|
||||
# Import Patterns
|
||||
|
||||
## Absolute Imports
|
||||
|
||||
**Always use absolute imports.** Never use relative imports.
|
||||
|
||||
```typescript
|
||||
// ✓ Good
|
||||
import { useWorkflowStore } from '@/stores/workflows/store'
|
||||
import { Button } from '@/components/ui/button'
|
||||
|
||||
// ✗ Bad
|
||||
import { useWorkflowStore } from '../../../stores/workflows/store'
|
||||
```
|
||||
|
||||
## Barrel Exports
|
||||
|
||||
Use barrel exports (`index.ts`) when a folder has 3+ exports. Import from barrel, not individual files.
|
||||
|
||||
```typescript
|
||||
// ✓ Good
|
||||
import { Dashboard, Sidebar } from '@/app/workspace/[workspaceId]/logs/components'
|
||||
|
||||
// ✗ Bad
|
||||
import { Dashboard } from '@/app/workspace/[workspaceId]/logs/components/dashboard/dashboard'
|
||||
```
|
||||
|
||||
## No Re-exports
|
||||
|
||||
Do not re-export from non-barrel files. Import directly from the source.
|
||||
|
||||
```typescript
|
||||
// ✓ Good - import from where it's declared
|
||||
import { CORE_TRIGGER_TYPES } from '@/stores/logs/filters/types'
|
||||
|
||||
// ✗ Bad - re-exporting in utils.ts then importing from there
|
||||
import { CORE_TRIGGER_TYPES } from '@/app/workspace/.../utils'
|
||||
```
|
||||
|
||||
## Import Order
|
||||
|
||||
1. React/core libraries
|
||||
2. External libraries
|
||||
3. UI components (`@/components/emcn`, `@/components/ui`)
|
||||
4. Utilities (`@/lib/...`)
|
||||
5. Stores (`@/stores/...`)
|
||||
6. Feature imports
|
||||
7. CSS imports
|
||||
|
||||
## Type Imports
|
||||
|
||||
Use `type` keyword for type-only imports:
|
||||
|
||||
```typescript
|
||||
import type { WorkflowLog } from '@/stores/logs/types'
|
||||
```
|
||||
287
.claude/rules/sim-integrations.md
Normal file
287
.claude/rules/sim-integrations.md
Normal file
@@ -0,0 +1,287 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/tools/**"
|
||||
- "apps/sim/blocks/**"
|
||||
- "apps/sim/triggers/**"
|
||||
---
|
||||
|
||||
# Adding Integrations
|
||||
|
||||
## Overview
|
||||
|
||||
Adding a new integration typically requires:
|
||||
1. **Tools** - API operations (`tools/{service}/`)
|
||||
2. **Block** - UI component (`blocks/blocks/{service}.ts`)
|
||||
3. **Icon** - SVG icon (`components/icons.tsx`)
|
||||
4. **Trigger** (optional) - Webhooks/polling (`triggers/{service}/`)
|
||||
|
||||
Always look up the service's API docs first.
|
||||
|
||||
## 1. Tools (`tools/{service}/`)
|
||||
|
||||
```
|
||||
tools/{service}/
|
||||
├── index.ts # Export all tools
|
||||
├── types.ts # Params/response types
|
||||
├── {action}.ts # Individual tool (e.g., send_message.ts)
|
||||
└── ...
|
||||
```
|
||||
|
||||
**Tool file structure:**
|
||||
|
||||
```typescript
|
||||
// tools/{service}/{action}.ts
|
||||
import type { {Service}Params, {Service}Response } from '@/tools/{service}/types'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const {service}{Action}Tool: ToolConfig<{Service}Params, {Service}Response> = {
|
||||
id: '{service}_{action}',
|
||||
name: '{Service} {Action}',
|
||||
description: 'What this tool does',
|
||||
version: '1.0.0',
|
||||
oauth: { required: true, provider: '{service}' }, // if OAuth
|
||||
params: { /* param definitions */ },
|
||||
request: {
|
||||
url: '/api/tools/{service}/{action}',
|
||||
method: 'POST',
|
||||
headers: () => ({ 'Content-Type': 'application/json' }),
|
||||
body: (params) => ({ ...params }),
|
||||
},
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
if (!data.success) throw new Error(data.error)
|
||||
return { success: true, output: data.output }
|
||||
},
|
||||
outputs: { /* output definitions */ },
|
||||
}
|
||||
```
|
||||
|
||||
**Register in `tools/registry.ts`:**
|
||||
|
||||
```typescript
|
||||
import { {service}{Action}Tool } from '@/tools/{service}'
|
||||
// Add to registry object
|
||||
{service}_{action}: {service}{Action}Tool,
|
||||
```
|
||||
|
||||
## 2. Block (`blocks/blocks/{service}.ts`)
|
||||
|
||||
```typescript
|
||||
import { {Service}Icon } from '@/components/icons'
|
||||
import type { BlockConfig } from '@/blocks/types'
|
||||
import type { {Service}Response } from '@/tools/{service}/types'
|
||||
|
||||
export const {Service}Block: BlockConfig<{Service}Response> = {
|
||||
type: '{service}',
|
||||
name: '{Service}',
|
||||
description: 'Short description',
|
||||
longDescription: 'Detailed description',
|
||||
category: 'tools',
|
||||
bgColor: '#hexcolor',
|
||||
icon: {Service}Icon,
|
||||
subBlocks: [ /* see SubBlock Properties below */ ],
|
||||
tools: {
|
||||
access: ['{service}_{action}', ...],
|
||||
config: {
|
||||
tool: (params) => `{service}_${params.operation}`,
|
||||
params: (params) => ({ ...params }),
|
||||
},
|
||||
},
|
||||
inputs: { /* input definitions */ },
|
||||
outputs: { /* output definitions */ },
|
||||
}
|
||||
```
|
||||
|
||||
### SubBlock Properties
|
||||
|
||||
```typescript
|
||||
{
|
||||
id: 'fieldName', // Unique identifier
|
||||
title: 'Field Label', // UI label
|
||||
type: 'short-input', // See SubBlock Types below
|
||||
placeholder: 'Hint text',
|
||||
required: true, // See Required below
|
||||
condition: { ... }, // See Condition below
|
||||
dependsOn: ['otherField'], // See DependsOn below
|
||||
mode: 'basic', // 'basic' | 'advanced' | 'both' | 'trigger'
|
||||
}
|
||||
```
|
||||
|
||||
**SubBlock Types:** `short-input`, `long-input`, `dropdown`, `code`, `switch`, `slider`, `oauth-input`, `channel-selector`, `user-selector`, `file-upload`, etc.
|
||||
|
||||
### `condition` - Show/hide based on another field
|
||||
|
||||
```typescript
|
||||
// Show when operation === 'send'
|
||||
condition: { field: 'operation', value: 'send' }
|
||||
|
||||
// Show when operation is 'send' OR 'read'
|
||||
condition: { field: 'operation', value: ['send', 'read'] }
|
||||
|
||||
// Show when operation !== 'send'
|
||||
condition: { field: 'operation', value: 'send', not: true }
|
||||
|
||||
// Complex: NOT in list AND another condition
|
||||
condition: {
|
||||
field: 'operation',
|
||||
value: ['list_channels', 'list_users'],
|
||||
not: true,
|
||||
and: { field: 'destinationType', value: 'dm', not: true }
|
||||
}
|
||||
```
|
||||
|
||||
### `required` - Field validation
|
||||
|
||||
```typescript
|
||||
// Always required
|
||||
required: true
|
||||
|
||||
// Conditionally required (same syntax as condition)
|
||||
required: { field: 'operation', value: 'send' }
|
||||
```
|
||||
|
||||
### `dependsOn` - Clear field when dependencies change
|
||||
|
||||
```typescript
|
||||
// Clear when credential changes
|
||||
dependsOn: ['credential']
|
||||
|
||||
// Clear when authMethod changes AND (credential OR botToken) changes
|
||||
dependsOn: { all: ['authMethod'], any: ['credential', 'botToken'] }
|
||||
```
|
||||
|
||||
### `mode` - When to show field
|
||||
|
||||
- `'basic'` - Only in basic mode (default UI)
|
||||
- `'advanced'` - Only in advanced mode (manual input)
|
||||
- `'both'` - Show in both modes (default)
|
||||
- `'trigger'` - Only when block is used as trigger
|
||||
|
||||
### `canonicalParamId` - Link basic/advanced alternatives
|
||||
|
||||
Use to map multiple UI inputs to a single logical parameter:
|
||||
|
||||
```typescript
|
||||
// Basic mode: Visual selector
|
||||
{
|
||||
id: 'fileSelector',
|
||||
type: 'file-selector',
|
||||
mode: 'basic',
|
||||
canonicalParamId: 'fileId',
|
||||
required: true,
|
||||
},
|
||||
// Advanced mode: Manual input
|
||||
{
|
||||
id: 'manualFileId',
|
||||
type: 'short-input',
|
||||
mode: 'advanced',
|
||||
canonicalParamId: 'fileId',
|
||||
required: true,
|
||||
},
|
||||
```
|
||||
|
||||
**Critical Rules:**
|
||||
- `canonicalParamId` must NOT match any subblock's `id`
|
||||
- `canonicalParamId` must be unique per operation/condition context
|
||||
- **Required consistency:** All subblocks in a canonical group must have the same `required` status
|
||||
- **Inputs section:** Must list canonical param IDs (e.g., `fileId`), NOT raw subblock IDs
|
||||
- **Params function:** Must use canonical param IDs (raw IDs are deleted after canonical transformation)
|
||||
|
||||
**Register in `blocks/registry.ts`:**
|
||||
|
||||
```typescript
|
||||
import { {Service}Block } from '@/blocks/blocks/{service}'
|
||||
// Add to registry object (alphabetically)
|
||||
{service}: {Service}Block,
|
||||
```
|
||||
|
||||
## 3. Icon (`components/icons.tsx`)
|
||||
|
||||
```typescript
|
||||
export function {Service}Icon(props: SVGProps<SVGSVGElement>) {
|
||||
return (
|
||||
<svg {...props} viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
{/* SVG path from service's brand assets */}
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
## 4. Trigger (`triggers/{service}/`) - Optional
|
||||
|
||||
```
|
||||
triggers/{service}/
|
||||
├── index.ts # Export all triggers
|
||||
├── webhook.ts # Webhook handler
|
||||
├── utils.ts # Shared utilities
|
||||
└── {event}.ts # Specific event handlers
|
||||
```
|
||||
|
||||
**Register in `triggers/registry.ts`:**
|
||||
|
||||
```typescript
|
||||
import { {service}WebhookTrigger } from '@/triggers/{service}'
|
||||
// Add to TRIGGER_REGISTRY
|
||||
{service}_webhook: {service}WebhookTrigger,
|
||||
```
|
||||
|
||||
## File Handling
|
||||
|
||||
When integrations handle file uploads/downloads, use `UserFile` objects consistently.
|
||||
|
||||
### File Input (Uploads)
|
||||
|
||||
1. **Block subBlocks:** Use basic/advanced mode pattern with `canonicalParamId`
|
||||
2. **Normalize in block config:** Use `normalizeFileInput` from `@/blocks/utils`
|
||||
3. **Internal API route:** Create route that uses `downloadFileFromStorage` to get file content
|
||||
4. **Tool routes to internal API:** Don't call external APIs directly with files
|
||||
|
||||
```typescript
|
||||
// In block tools.config:
|
||||
import { normalizeFileInput } from '@/blocks/utils'
|
||||
|
||||
const normalizedFile = normalizeFileInput(
|
||||
params.uploadFile || params.fileRef || params.fileContent,
|
||||
{ single: true }
|
||||
)
|
||||
if (normalizedFile) params.file = normalizedFile
|
||||
```
|
||||
|
||||
### File Output (Downloads)
|
||||
|
||||
Use `FileToolProcessor` in tool `transformResponse` to store files:
|
||||
|
||||
```typescript
|
||||
import { FileToolProcessor } from '@/executor/utils/file-tool-processor'
|
||||
|
||||
const processor = new FileToolProcessor(context)
|
||||
const file = await processor.processFileData({
|
||||
data: base64Content,
|
||||
mimeType: 'application/pdf',
|
||||
filename: 'doc.pdf',
|
||||
})
|
||||
```
|
||||
|
||||
### Key Helpers
|
||||
|
||||
| Helper | Location | Purpose |
|
||||
|--------|----------|---------|
|
||||
| `normalizeFileInput` | `@/blocks/utils` | Normalize file params in block config |
|
||||
| `processFilesToUserFiles` | `@/lib/uploads/utils/file-utils` | Convert raw inputs to UserFile[] |
|
||||
| `downloadFileFromStorage` | `@/lib/uploads/utils/file-utils.server` | Get Buffer from UserFile |
|
||||
| `FileToolProcessor` | `@/executor/utils/file-tool-processor` | Process tool output files |
|
||||
|
||||
## Checklist
|
||||
|
||||
- [ ] Look up API docs for the service
|
||||
- [ ] Create `tools/{service}/types.ts` with proper types
|
||||
- [ ] Create tool files for each operation
|
||||
- [ ] Create `tools/{service}/index.ts` barrel export
|
||||
- [ ] Register tools in `tools/registry.ts`
|
||||
- [ ] Add icon to `components/icons.tsx`
|
||||
- [ ] Create block in `blocks/blocks/{service}.ts`
|
||||
- [ ] Register block in `blocks/registry.ts`
|
||||
- [ ] (Optional) Create triggers in `triggers/{service}/`
|
||||
- [ ] (Optional) Register triggers in `triggers/registry.ts`
|
||||
- [ ] (If file uploads) Create internal API route with `downloadFileFromStorage`
|
||||
- [ ] (If file uploads) Use `normalizeFileInput` in block config
|
||||
66
.claude/rules/sim-queries.md
Normal file
66
.claude/rules/sim-queries.md
Normal file
@@ -0,0 +1,66 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/hooks/queries/**/*.ts"
|
||||
---
|
||||
|
||||
# React Query Patterns
|
||||
|
||||
All React Query hooks live in `hooks/queries/`.
|
||||
|
||||
## Query Key Factory
|
||||
|
||||
Every query file defines a keys factory:
|
||||
|
||||
```typescript
|
||||
export const entityKeys = {
|
||||
all: ['entity'] as const,
|
||||
list: (workspaceId?: string) => [...entityKeys.all, 'list', workspaceId ?? ''] as const,
|
||||
detail: (id?: string) => [...entityKeys.all, 'detail', id ?? ''] as const,
|
||||
}
|
||||
```
|
||||
|
||||
## File Structure
|
||||
|
||||
```typescript
|
||||
// 1. Query keys factory
|
||||
// 2. Types (if needed)
|
||||
// 3. Private fetch functions
|
||||
// 4. Exported hooks
|
||||
```
|
||||
|
||||
## Query Hook
|
||||
|
||||
```typescript
|
||||
export function useEntityList(workspaceId?: string, options?: { enabled?: boolean }) {
|
||||
return useQuery({
|
||||
queryKey: entityKeys.list(workspaceId),
|
||||
queryFn: () => fetchEntities(workspaceId as string),
|
||||
enabled: Boolean(workspaceId) && (options?.enabled ?? true),
|
||||
staleTime: 60 * 1000,
|
||||
placeholderData: keepPreviousData,
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
## Mutation Hook
|
||||
|
||||
```typescript
|
||||
export function useCreateEntity() {
|
||||
const queryClient = useQueryClient()
|
||||
return useMutation({
|
||||
mutationFn: async (variables) => { /* fetch POST */ },
|
||||
onSuccess: () => queryClient.invalidateQueries({ queryKey: entityKeys.all }),
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
## Optimistic Updates
|
||||
|
||||
For optimistic mutations syncing with Zustand, use `createOptimisticMutationHandlers` from `@/hooks/queries/utils/optimistic-mutation`.
|
||||
|
||||
## Naming
|
||||
|
||||
- **Keys**: `entityKeys`
|
||||
- **Query hooks**: `useEntity`, `useEntityList`
|
||||
- **Mutation hooks**: `useCreateEntity`, `useUpdateEntity`
|
||||
- **Fetch functions**: `fetchEntity` (private)
|
||||
71
.claude/rules/sim-stores.md
Normal file
71
.claude/rules/sim-stores.md
Normal file
@@ -0,0 +1,71 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/**/store.ts"
|
||||
- "apps/sim/**/stores/**/*.ts"
|
||||
---
|
||||
|
||||
# Zustand Store Patterns
|
||||
|
||||
Stores live in `stores/`. Complex stores split into `store.ts` + `types.ts`.
|
||||
|
||||
## Basic Store
|
||||
|
||||
```typescript
|
||||
import { create } from 'zustand'
|
||||
import { devtools } from 'zustand/middleware'
|
||||
import type { FeatureState } from '@/stores/feature/types'
|
||||
|
||||
const initialState = { items: [] as Item[], activeId: null as string | null }
|
||||
|
||||
export const useFeatureStore = create<FeatureState>()(
|
||||
devtools(
|
||||
(set, get) => ({
|
||||
...initialState,
|
||||
setItems: (items) => set({ items }),
|
||||
addItem: (item) => set((state) => ({ items: [...state.items, item] })),
|
||||
reset: () => set(initialState),
|
||||
}),
|
||||
{ name: 'feature-store' }
|
||||
)
|
||||
)
|
||||
```
|
||||
|
||||
## Persisted Store
|
||||
|
||||
```typescript
|
||||
import { create } from 'zustand'
|
||||
import { persist } from 'zustand/middleware'
|
||||
|
||||
export const useFeatureStore = create<FeatureState>()(
|
||||
persist(
|
||||
(set) => ({
|
||||
width: 300,
|
||||
setWidth: (width) => set({ width }),
|
||||
_hasHydrated: false,
|
||||
setHasHydrated: (v) => set({ _hasHydrated: v }),
|
||||
}),
|
||||
{
|
||||
name: 'feature-state',
|
||||
partialize: (state) => ({ width: state.width }),
|
||||
onRehydrateStorage: () => (state) => state?.setHasHydrated(true),
|
||||
}
|
||||
)
|
||||
)
|
||||
```
|
||||
|
||||
## Rules
|
||||
|
||||
1. Use `devtools` middleware (named stores)
|
||||
2. Use `persist` only when data should survive reload
|
||||
3. `partialize` to persist only necessary state
|
||||
4. `_hasHydrated` pattern for persisted stores needing hydration tracking
|
||||
5. Immutable updates only
|
||||
6. `set((state) => ...)` when depending on previous state
|
||||
7. Provide `reset()` action
|
||||
|
||||
## Outside React
|
||||
|
||||
```typescript
|
||||
const items = useFeatureStore.getState().items
|
||||
useFeatureStore.setState({ items: newItems })
|
||||
```
|
||||
41
.claude/rules/sim-styling.md
Normal file
41
.claude/rules/sim-styling.md
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/**/*.tsx"
|
||||
- "apps/sim/**/*.css"
|
||||
---
|
||||
|
||||
# Styling Rules
|
||||
|
||||
## Tailwind
|
||||
|
||||
1. **No inline styles** - Use Tailwind classes
|
||||
2. **No duplicate dark classes** - Skip `dark:` when value matches light mode
|
||||
3. **Exact values** - `text-[14px]`, `h-[26px]`
|
||||
4. **Transitions** - `transition-colors` for interactive states
|
||||
|
||||
## Conditional Classes
|
||||
|
||||
```typescript
|
||||
import { cn } from '@/lib/utils'
|
||||
|
||||
<div className={cn(
|
||||
'base-classes',
|
||||
isActive && 'active-classes',
|
||||
disabled ? 'opacity-60' : 'hover:bg-accent'
|
||||
)} />
|
||||
```
|
||||
|
||||
## CSS Variables
|
||||
|
||||
For dynamic values (widths, heights) synced with stores:
|
||||
|
||||
```typescript
|
||||
// In store
|
||||
setWidth: (width) => {
|
||||
set({ width })
|
||||
document.documentElement.style.setProperty('--sidebar-width', `${width}px`)
|
||||
}
|
||||
|
||||
// In component
|
||||
<aside style={{ width: 'var(--sidebar-width)' }} />
|
||||
```
|
||||
58
.claude/rules/sim-testing.md
Normal file
58
.claude/rules/sim-testing.md
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/**/*.test.ts"
|
||||
- "apps/sim/**/*.test.tsx"
|
||||
---
|
||||
|
||||
# Testing Patterns
|
||||
|
||||
Use Vitest. Test files: `feature.ts` → `feature.test.ts`
|
||||
|
||||
## Structure
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* @vitest-environment node
|
||||
*/
|
||||
import { databaseMock, loggerMock } from '@sim/testing'
|
||||
import { describe, expect, it, vi } from 'vitest'
|
||||
|
||||
vi.mock('@sim/db', () => databaseMock)
|
||||
vi.mock('@sim/logger', () => loggerMock)
|
||||
|
||||
import { myFunction } from '@/lib/feature'
|
||||
|
||||
describe('myFunction', () => {
|
||||
beforeEach(() => vi.clearAllMocks())
|
||||
it.concurrent('isolated tests run in parallel', () => { ... })
|
||||
})
|
||||
```
|
||||
|
||||
## @sim/testing Package
|
||||
|
||||
Always prefer over local mocks.
|
||||
|
||||
| Category | Utilities |
|
||||
|----------|-----------|
|
||||
| **Mocks** | `loggerMock`, `databaseMock`, `setupGlobalFetchMock()` |
|
||||
| **Factories** | `createSession()`, `createWorkflowRecord()`, `createBlock()`, `createExecutorContext()` |
|
||||
| **Builders** | `WorkflowBuilder`, `ExecutionContextBuilder` |
|
||||
| **Assertions** | `expectWorkflowAccessGranted()`, `expectBlockExecuted()` |
|
||||
|
||||
## Rules
|
||||
|
||||
1. `@vitest-environment node` directive at file top
|
||||
2. `vi.mock()` calls before importing mocked modules
|
||||
3. `@sim/testing` utilities over local mocks
|
||||
4. `it.concurrent` for isolated tests (no shared mutable state)
|
||||
5. `beforeEach(() => vi.clearAllMocks())` to reset state
|
||||
|
||||
## Hoisted Mocks
|
||||
|
||||
For mutable mock references:
|
||||
|
||||
```typescript
|
||||
const mockFn = vi.hoisted(() => vi.fn())
|
||||
vi.mock('@/lib/module', () => ({ myFunction: mockFn }))
|
||||
mockFn.mockResolvedValue({ data: 'test' })
|
||||
```
|
||||
21
.claude/rules/sim-typescript.md
Normal file
21
.claude/rules/sim-typescript.md
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
paths:
|
||||
- "apps/sim/**/*.ts"
|
||||
- "apps/sim/**/*.tsx"
|
||||
---
|
||||
|
||||
# TypeScript Rules
|
||||
|
||||
1. **No `any`** - Use proper types or `unknown` with type guards
|
||||
2. **Props interface** - Always define for components
|
||||
3. **Const assertions** - `as const` for constant objects/arrays
|
||||
4. **Ref types** - Explicit: `useRef<HTMLDivElement>(null)`
|
||||
5. **Type imports** - `import type { X }` for type-only imports
|
||||
|
||||
```typescript
|
||||
// ✗ Bad
|
||||
const handleClick = (e: any) => {}
|
||||
|
||||
// ✓ Good
|
||||
const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {}
|
||||
```
|
||||
7
.cursor/commands/council.md
Normal file
7
.cursor/commands/council.md
Normal file
@@ -0,0 +1,7 @@
|
||||
Based on the given area of interest, please:
|
||||
|
||||
1. Dig around the codebase in terms of that given area of interest, gather general information such as keywords and architecture overview.
|
||||
2. Spawn off n=10 (unless specified otherwise) task agents to dig deeper into the codebase in terms of that given area of interest, some of them should be out of the box for variance.
|
||||
3. Once the task agents are done, use the information to do what the user wants.
|
||||
|
||||
If user is in plan mode, use the information to create the plan.
|
||||
@@ -8,7 +8,7 @@ alwaysApply: true
|
||||
You are a professional software engineer. All code must follow best practices: accurate, readable, clean, and efficient.
|
||||
|
||||
## Logging
|
||||
Import `createLogger` from `sim/logger`. Use `logger.info`, `logger.warn`, `logger.error` instead of `console.log`.
|
||||
Import `createLogger` from `@sim/logger`. Use `logger.info`, `logger.warn`, `logger.error` instead of `console.log`.
|
||||
|
||||
## Comments
|
||||
Use TSDoc for documentation. No `====` separators. No non-TSDoc comments.
|
||||
|
||||
@@ -155,6 +155,36 @@ dependsOn: { all: ['authMethod'], any: ['credential', 'botToken'] }
|
||||
- `'both'` - Show in both modes (default)
|
||||
- `'trigger'` - Only when block is used as trigger
|
||||
|
||||
### `canonicalParamId` - Link basic/advanced alternatives
|
||||
|
||||
Use to map multiple UI inputs to a single logical parameter:
|
||||
|
||||
```typescript
|
||||
// Basic mode: Visual selector
|
||||
{
|
||||
id: 'fileSelector',
|
||||
type: 'file-selector',
|
||||
mode: 'basic',
|
||||
canonicalParamId: 'fileId',
|
||||
required: true,
|
||||
},
|
||||
// Advanced mode: Manual input
|
||||
{
|
||||
id: 'manualFileId',
|
||||
type: 'short-input',
|
||||
mode: 'advanced',
|
||||
canonicalParamId: 'fileId',
|
||||
required: true,
|
||||
},
|
||||
```
|
||||
|
||||
**Critical Rules:**
|
||||
- `canonicalParamId` must NOT match any subblock's `id`
|
||||
- `canonicalParamId` must be unique per operation/condition context
|
||||
- **Required consistency:** All subblocks in a canonical group must have the same `required` status
|
||||
- **Inputs section:** Must list canonical param IDs (e.g., `fileId`), NOT raw subblock IDs
|
||||
- **Params function:** Must use canonical param IDs (raw IDs are deleted after canonical transformation)
|
||||
|
||||
**Register in `blocks/registry.ts`:**
|
||||
|
||||
```typescript
|
||||
@@ -193,6 +223,52 @@ import { {service}WebhookTrigger } from '@/triggers/{service}'
|
||||
{service}_webhook: {service}WebhookTrigger,
|
||||
```
|
||||
|
||||
## File Handling
|
||||
|
||||
When integrations handle file uploads/downloads, use `UserFile` objects consistently.
|
||||
|
||||
### File Input (Uploads)
|
||||
|
||||
1. **Block subBlocks:** Use basic/advanced mode pattern with `canonicalParamId`
|
||||
2. **Normalize in block config:** Use `normalizeFileInput` from `@/blocks/utils`
|
||||
3. **Internal API route:** Create route that uses `downloadFileFromStorage` to get file content
|
||||
4. **Tool routes to internal API:** Don't call external APIs directly with files
|
||||
|
||||
```typescript
|
||||
// In block tools.config:
|
||||
import { normalizeFileInput } from '@/blocks/utils'
|
||||
|
||||
const normalizedFile = normalizeFileInput(
|
||||
params.uploadFile || params.fileRef || params.fileContent,
|
||||
{ single: true }
|
||||
)
|
||||
if (normalizedFile) params.file = normalizedFile
|
||||
```
|
||||
|
||||
### File Output (Downloads)
|
||||
|
||||
Use `FileToolProcessor` in tool `transformResponse` to store files:
|
||||
|
||||
```typescript
|
||||
import { FileToolProcessor } from '@/executor/utils/file-tool-processor'
|
||||
|
||||
const processor = new FileToolProcessor(context)
|
||||
const file = await processor.processFileData({
|
||||
data: base64Content,
|
||||
mimeType: 'application/pdf',
|
||||
filename: 'doc.pdf',
|
||||
})
|
||||
```
|
||||
|
||||
### Key Helpers
|
||||
|
||||
| Helper | Location | Purpose |
|
||||
|--------|----------|---------|
|
||||
| `normalizeFileInput` | `@/blocks/utils` | Normalize file params in block config |
|
||||
| `processFilesToUserFiles` | `@/lib/uploads/utils/file-utils` | Convert raw inputs to UserFile[] |
|
||||
| `downloadFileFromStorage` | `@/lib/uploads/utils/file-utils.server` | Get Buffer from UserFile |
|
||||
| `FileToolProcessor` | `@/executor/utils/file-tool-processor` | Process tool output files |
|
||||
|
||||
## Checklist
|
||||
|
||||
- [ ] Look up API docs for the service
|
||||
@@ -205,3 +281,5 @@ import { {service}WebhookTrigger } from '@/triggers/{service}'
|
||||
- [ ] Register block in `blocks/registry.ts`
|
||||
- [ ] (Optional) Create triggers in `triggers/{service}/`
|
||||
- [ ] (Optional) Register triggers in `triggers/registry.ts`
|
||||
- [ ] (If file uploads) Create internal API route with `downloadFileFromStorage`
|
||||
- [ ] (If file uploads) Use `normalizeFileInput` in block config
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM oven/bun:1.3.3-alpine
|
||||
FROM oven/bun:1.3.9-alpine
|
||||
|
||||
# Install necessary packages for development
|
||||
RUN apk add --no-cache \
|
||||
|
||||
@@ -44,7 +44,7 @@ services:
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 4G
|
||||
memory: 1G
|
||||
environment:
|
||||
- NODE_ENV=development
|
||||
- DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
|
||||
|
||||
35
.github/workflows/ci.yml
vendored
35
.github/workflows/ci.yml
vendored
@@ -10,6 +10,9 @@ concurrency:
|
||||
group: ci-${{ github.ref }}
|
||||
cancel-in-progress: false
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
test-build:
|
||||
name: Test and Build
|
||||
@@ -27,10 +30,11 @@ jobs:
|
||||
steps:
|
||||
- name: Extract version from commit message
|
||||
id: extract
|
||||
env:
|
||||
COMMIT_MSG: ${{ github.event.head_commit.message }}
|
||||
run: |
|
||||
COMMIT_MSG="${{ github.event.head_commit.message }}"
|
||||
# Only tag versions on main branch
|
||||
if [ "${{ github.ref }}" = "refs/heads/main" ] && [[ "$COMMIT_MSG" =~ ^(v[0-9]+\.[0-9]+\.[0-9]+): ]]; then
|
||||
if [ "$GITHUB_REF" = "refs/heads/main" ] && [[ "$COMMIT_MSG" =~ ^(v[0-9]+\.[0-9]+\.[0-9]+): ]]; then
|
||||
VERSION="${BASH_REMATCH[1]}"
|
||||
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
||||
echo "is_release=true" >> $GITHUB_OUTPUT
|
||||
@@ -277,3 +281,30 @@ jobs:
|
||||
if: needs.check-docs-changes.outputs.docs_changed == 'true'
|
||||
uses: ./.github/workflows/docs-embeddings.yml
|
||||
secrets: inherit
|
||||
|
||||
# Create GitHub Release (only for version commits on main, after all builds complete)
|
||||
create-release:
|
||||
name: Create GitHub Release
|
||||
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||
needs: [create-ghcr-manifests, detect-version]
|
||||
if: needs.detect-version.outputs.is_release == 'true'
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Install dependencies
|
||||
run: bun install --frozen-lockfile
|
||||
|
||||
- name: Create release
|
||||
env:
|
||||
GH_PAT: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: bun run scripts/create-single-release.ts ${{ needs.detect-version.outputs.version }}
|
||||
|
||||
5
.github/workflows/docs-embeddings.yml
vendored
5
.github/workflows/docs-embeddings.yml
vendored
@@ -4,6 +4,9 @@ on:
|
||||
workflow_call:
|
||||
workflow_dispatch: # Allow manual triggering
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
process-docs-embeddings:
|
||||
name: Process Documentation Embeddings
|
||||
@@ -17,7 +20,7 @@ jobs:
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: 1.3.3
|
||||
bun-version: 1.3.9
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
28
.github/workflows/i18n.yml
vendored
28
.github/workflows/i18n.yml
vendored
@@ -1,11 +1,7 @@
|
||||
name: 'Auto-translate Documentation'
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ staging ]
|
||||
paths:
|
||||
- 'apps/docs/content/docs/en/**'
|
||||
- 'apps/docs/i18n.json'
|
||||
workflow_dispatch: # Manual trigger only (scheduled runs disabled)
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
@@ -20,13 +16,14 @@ jobs:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: staging
|
||||
token: ${{ secrets.GH_PAT }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: 1.3.3
|
||||
bun-version: 1.3.9
|
||||
|
||||
- name: Cache Bun dependencies
|
||||
uses: actions/cache@v4
|
||||
@@ -68,12 +65,11 @@ jobs:
|
||||
title: "feat(i18n): update translations"
|
||||
body: |
|
||||
## Summary
|
||||
Automated translation updates triggered by changes to documentation.
|
||||
|
||||
This PR was automatically created after content changes were made, updating translations for all supported languages using Lingo.dev AI translation engine.
|
||||
|
||||
**Original trigger**: ${{ github.event.head_commit.message }}
|
||||
**Commit**: ${{ github.sha }}
|
||||
Automated weekly translation updates for documentation.
|
||||
|
||||
This PR was automatically created by the scheduled weekly i18n workflow, updating translations for all supported languages using Lingo.dev AI translation engine.
|
||||
|
||||
**Triggered**: Weekly scheduled run
|
||||
**Workflow**: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
|
||||
## Type of Change
|
||||
@@ -107,7 +103,7 @@ jobs:
|
||||
## Screenshots/Videos
|
||||
<!-- Translation changes are text-based - no visual changes expected -->
|
||||
<!-- Reviewers should check the documentation site renders correctly for all languages -->
|
||||
branch: auto-translate/staging-merge-${{ github.run_id }}
|
||||
branch: auto-translate/weekly-${{ github.run_id }}
|
||||
base: staging
|
||||
labels: |
|
||||
i18n
|
||||
@@ -126,7 +122,7 @@ jobs:
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: 1.3.3
|
||||
bun-version: 1.3.9
|
||||
|
||||
- name: Cache Bun dependencies
|
||||
uses: actions/cache@v4
|
||||
@@ -145,6 +141,8 @@ jobs:
|
||||
bun install --frozen-lockfile
|
||||
|
||||
- name: Build documentation to verify translations
|
||||
env:
|
||||
DATABASE_URL: postgresql://dummy:dummy@localhost:5432/dummy
|
||||
run: |
|
||||
cd apps/docs
|
||||
bun run build
|
||||
@@ -153,7 +151,7 @@ jobs:
|
||||
run: |
|
||||
cd apps/docs
|
||||
echo "## Translation Status Report" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Triggered by merge to staging branch**" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Weekly scheduled translation run**" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
en_count=$(find content/docs/en -name "*.mdx" | wc -l)
|
||||
|
||||
5
.github/workflows/migrations.yml
vendored
5
.github/workflows/migrations.yml
vendored
@@ -4,6 +4,9 @@ on:
|
||||
workflow_call:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
migrate:
|
||||
name: Apply Database Migrations
|
||||
@@ -16,7 +19,7 @@ jobs:
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: 1.3.3
|
||||
bun-version: 1.3.9
|
||||
|
||||
- name: Cache Bun dependencies
|
||||
uses: actions/cache@v4
|
||||
|
||||
5
.github/workflows/publish-cli.yml
vendored
5
.github/workflows/publish-cli.yml
vendored
@@ -6,6 +6,9 @@ on:
|
||||
paths:
|
||||
- 'packages/cli/**'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
publish-npm:
|
||||
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||
@@ -16,7 +19,7 @@ jobs:
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: 1.3.3
|
||||
bun-version: 1.3.9
|
||||
|
||||
- name: Setup Node.js for npm publishing
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
3
.github/workflows/publish-python-sdk.yml
vendored
3
.github/workflows/publish-python-sdk.yml
vendored
@@ -6,6 +6,9 @@ on:
|
||||
paths:
|
||||
- 'packages/python-sdk/**'
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
publish-pypi:
|
||||
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||
|
||||
5
.github/workflows/publish-ts-sdk.yml
vendored
5
.github/workflows/publish-ts-sdk.yml
vendored
@@ -6,6 +6,9 @@ on:
|
||||
paths:
|
||||
- 'packages/ts-sdk/**'
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
publish-npm:
|
||||
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||
@@ -16,7 +19,7 @@ jobs:
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: 1.3.3
|
||||
bun-version: 1.3.9
|
||||
|
||||
- name: Setup Node.js for npm publishing
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
5
.github/workflows/test-build.yml
vendored
5
.github/workflows/test-build.yml
vendored
@@ -4,6 +4,9 @@ on:
|
||||
workflow_call:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
test-build:
|
||||
name: Test and Build
|
||||
@@ -16,7 +19,7 @@ jobs:
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: 1.3.3
|
||||
bun-version: 1.3.9
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
19
CLAUDE.md
19
CLAUDE.md
@@ -265,6 +265,23 @@ Register in `blocks/registry.ts` (alphabetically).
|
||||
|
||||
**dependsOn:** `['field']` or `{ all: ['a'], any: ['b', 'c'] }`
|
||||
|
||||
**File Input Pattern (basic/advanced mode):**
|
||||
```typescript
|
||||
// Basic: file-upload UI
|
||||
{ id: 'uploadFile', type: 'file-upload', canonicalParamId: 'file', mode: 'basic' },
|
||||
// Advanced: reference from other blocks
|
||||
{ id: 'fileRef', type: 'short-input', canonicalParamId: 'file', mode: 'advanced' },
|
||||
```
|
||||
|
||||
In `tools.config.tool`, normalize with:
|
||||
```typescript
|
||||
import { normalizeFileInput } from '@/blocks/utils'
|
||||
const file = normalizeFileInput(params.uploadFile || params.fileRef, { single: true })
|
||||
if (file) params.file = file
|
||||
```
|
||||
|
||||
For file uploads, create an internal API route (`/api/tools/{service}/upload`) that uses `downloadFileFromStorage` to get file content from `UserFile` objects.
|
||||
|
||||
### 3. Icon (`components/icons.tsx`)
|
||||
|
||||
```typescript
|
||||
@@ -293,3 +310,5 @@ Register in `triggers/registry.ts`.
|
||||
- [ ] Create block in `blocks/blocks/{service}.ts`
|
||||
- [ ] Register block in `blocks/registry.ts`
|
||||
- [ ] (Optional) Create and register triggers
|
||||
- [ ] (If file uploads) Create internal API route with `downloadFileFromStorage`
|
||||
- [ ] (If file uploads) Use `normalizeFileInput` in block config
|
||||
|
||||
29
README.md
29
README.md
@@ -9,12 +9,12 @@
|
||||
<p align="center">
|
||||
<a href="https://sim.ai" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/badge/sim.ai-6F3DFA" alt="Sim.ai"></a>
|
||||
<a href="https://discord.gg/Hr4UWYEcTT" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/badge/Discord-Join%20Server-5865F2?logo=discord&logoColor=white" alt="Discord"></a>
|
||||
<a href="https://x.com/simdotai" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/twitter/follow/simstudioai?style=social" alt="Twitter"></a>
|
||||
<a href="https://x.com/simdotai" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/twitter/follow/simdotai?style=social" alt="Twitter"></a>
|
||||
<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>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://cursor.com/link/prompt?text=Help%20me%20set%20up%20Sim%20Studio%20locally.%20Follow%20these%20steps%3A%0A%0A1.%20First%2C%20verify%20Docker%20is%20installed%20and%20running%3A%0A%20%20%20docker%20--version%0A%20%20%20docker%20info%0A%0A2.%20Clone%20the%20repository%3A%0A%20%20%20git%20clone%20https%3A%2F%2Fgithub.com%2Fsimstudioai%2Fsim.git%0A%20%20%20cd%20sim%0A%0A3.%20Start%20the%20services%20with%20Docker%20Compose%3A%0A%20%20%20docker%20compose%20-f%20docker-compose.prod.yml%20up%20-d%0A%0A4.%20Wait%20for%20all%20containers%20to%20be%20healthy%20(this%20may%20take%201-2%20minutes)%3A%0A%20%20%20docker%20compose%20-f%20docker-compose.prod.yml%20ps%0A%0A5.%20Verify%20the%20app%20is%20accessible%20at%20http%3A%2F%2Flocalhost%3A3000%0A%0AIf%20there%20are%20any%20errors%2C%20help%20me%20troubleshoot%20them.%20Common%20issues%3A%0A-%20Port%203000%2C%203002%2C%20or%205432%20already%20in%20use%0A-%20Docker%20not%20running%0A-%20Insufficient%20memory%20(needs%2012GB%2B%20RAM)%0A%0AFor%20local%20AI%20models%20with%20Ollama%2C%20use%20this%20instead%20of%20step%203%3A%0A%20%20%20docker%20compose%20-f%20docker-compose.ollama.yml%20--profile%20setup%20up%20-d"><img src="https://img.shields.io/badge/Set%20Up%20with-Cursor-000000?logo=cursor&logoColor=white" alt="Set Up with Cursor"></a>
|
||||
<a href="https://deepwiki.com/simstudioai/sim" target="_blank" rel="noopener noreferrer"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a> <a href="https://cursor.com/link/prompt?text=Help%20me%20set%20up%20Sim%20locally.%20Follow%20these%20steps%3A%0A%0A1.%20First%2C%20verify%20Docker%20is%20installed%20and%20running%3A%0A%20%20%20docker%20--version%0A%20%20%20docker%20info%0A%0A2.%20Clone%20the%20repository%3A%0A%20%20%20git%20clone%20https%3A%2F%2Fgithub.com%2Fsimstudioai%2Fsim.git%0A%20%20%20cd%20sim%0A%0A3.%20Start%20the%20services%20with%20Docker%20Compose%3A%0A%20%20%20docker%20compose%20-f%20docker-compose.prod.yml%20up%20-d%0A%0A4.%20Wait%20for%20all%20containers%20to%20be%20healthy%20(this%20may%20take%201-2%20minutes)%3A%0A%20%20%20docker%20compose%20-f%20docker-compose.prod.yml%20ps%0A%0A5.%20Verify%20the%20app%20is%20accessible%20at%20http%3A%2F%2Flocalhost%3A3000%0A%0AIf%20there%20are%20any%20errors%2C%20help%20me%20troubleshoot%20them.%20Common%20issues%3A%0A-%20Port%203000%2C%203002%2C%20or%205432%20already%20in%20use%0A-%20Docker%20not%20running%0A-%20Insufficient%20memory%20(needs%2012GB%2B%20RAM)%0A%0AFor%20local%20AI%20models%20with%20Ollama%2C%20use%20this%20instead%20of%20step%203%3A%0A%20%20%20docker%20compose%20-f%20docker-compose.ollama.yml%20--profile%20setup%20up%20-d"><img src="https://img.shields.io/badge/Set%20Up%20with-Cursor-000000?logo=cursor&logoColor=white" alt="Set Up with Cursor"></a>
|
||||
</p>
|
||||
|
||||
### Build Workflows with Ease
|
||||
@@ -172,31 +172,6 @@ Key environment variables for self-hosted deployments. See [`.env.example`](apps
|
||||
| `API_ENCRYPTION_KEY` | Yes | Encrypts API keys (`openssl rand -hex 32`) |
|
||||
| `COPILOT_API_KEY` | No | API key from sim.ai for Copilot features |
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Ollama models not showing in dropdown (Docker)
|
||||
|
||||
If you're running Ollama on your host machine and Sim in Docker, change `OLLAMA_URL` from `localhost` to `host.docker.internal`:
|
||||
|
||||
```bash
|
||||
OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
See [Using an External Ollama Instance](#using-an-external-ollama-instance) for details.
|
||||
|
||||
### Database connection issues
|
||||
|
||||
Ensure PostgreSQL has the pgvector extension installed. When using Docker, wait for the database to be healthy before running migrations.
|
||||
|
||||
### Port conflicts
|
||||
|
||||
If ports 3000, 3002, or 5432 are in use, configure alternatives:
|
||||
|
||||
```bash
|
||||
# Custom ports
|
||||
NEXT_PUBLIC_APP_URL=http://localhost:3100 POSTGRES_PORT=5433 docker compose up -d
|
||||
```
|
||||
|
||||
## Tech Stack
|
||||
|
||||
- **Framework**: [Next.js](https://nextjs.org/) (App Router)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import type React from 'react'
|
||||
import { findNeighbour } from 'fumadocs-core/page-tree'
|
||||
import { Pre } from 'fumadocs-ui/components/codeblock'
|
||||
import defaultMdxComponents from 'fumadocs-ui/mdx'
|
||||
import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/page'
|
||||
import { ChevronLeft, ChevronRight } from 'lucide-react'
|
||||
@@ -21,6 +22,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
|
||||
const data = page.data as PageData
|
||||
const MDX = data.body
|
||||
const baseUrl = 'https://docs.sim.ai'
|
||||
const markdownContent = await data.getText('processed')
|
||||
|
||||
const pageTreeRecord = source.pageTree as Record<string, any>
|
||||
const pageTree =
|
||||
@@ -185,11 +187,6 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
|
||||
tableOfContent={{
|
||||
style: 'clerk',
|
||||
enabled: true,
|
||||
header: (
|
||||
<div key='toc-header' className='mb-2 font-medium text-sm'>
|
||||
On this page
|
||||
</div>
|
||||
),
|
||||
footer: <TOCFooter />,
|
||||
single: false,
|
||||
}}
|
||||
@@ -205,7 +202,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
|
||||
<div className='relative mt-6 sm:mt-0'>
|
||||
<div className='absolute top-1 right-0 flex items-center gap-2'>
|
||||
<div className='hidden sm:flex'>
|
||||
<LLMCopyButton markdownUrl={`${page.url}.mdx`} />
|
||||
<LLMCopyButton content={markdownContent} />
|
||||
</div>
|
||||
<PageNavigationArrows previous={neighbours?.previous} next={neighbours?.next} />
|
||||
</div>
|
||||
@@ -216,7 +213,11 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
|
||||
<MDX
|
||||
components={{
|
||||
...defaultMdxComponents,
|
||||
CodeBlock,
|
||||
pre: (props: React.HTMLAttributes<HTMLPreElement>) => (
|
||||
<CodeBlock {...props}>
|
||||
<Pre>{props.children}</Pre>
|
||||
</CodeBlock>
|
||||
),
|
||||
h1: (props: React.HTMLAttributes<HTMLHeadingElement>) => (
|
||||
<Heading as='h1' {...props} />
|
||||
),
|
||||
|
||||
@@ -3,13 +3,14 @@ import { defineI18nUI } from 'fumadocs-ui/i18n'
|
||||
import { DocsLayout } from 'fumadocs-ui/layouts/docs'
|
||||
import { RootProvider } from 'fumadocs-ui/provider/next'
|
||||
import { Geist_Mono, Inter } from 'next/font/google'
|
||||
import Image from 'next/image'
|
||||
import Script from 'next/script'
|
||||
import {
|
||||
SidebarFolder,
|
||||
SidebarItem,
|
||||
SidebarSeparator,
|
||||
} from '@/components/docs-layout/sidebar-components'
|
||||
import { Navbar } from '@/components/navbar/navbar'
|
||||
import { SimLogoFull } from '@/components/ui/sim-logo'
|
||||
import { i18n } from '@/lib/i18n'
|
||||
import { source } from '@/lib/source'
|
||||
import '../global.css'
|
||||
@@ -17,11 +18,13 @@ import '../global.css'
|
||||
const inter = Inter({
|
||||
subsets: ['latin'],
|
||||
variable: '--font-geist-sans',
|
||||
display: 'swap',
|
||||
})
|
||||
|
||||
const geistMono = Geist_Mono({
|
||||
subsets: ['latin'],
|
||||
variable: '--font-geist-mono',
|
||||
display: 'swap',
|
||||
})
|
||||
|
||||
const { provider } = defineI18nUI(i18n, {
|
||||
@@ -93,25 +96,15 @@ 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'>
|
||||
<Script src='https://assets.onedollarstats.com/stonks.js' strategy='lazyOnload' />
|
||||
<RootProvider i18n={provider(lang)}>
|
||||
<Navbar />
|
||||
<DocsLayout
|
||||
tree={source.pageTree[lang]}
|
||||
nav={{
|
||||
title: (
|
||||
<Image
|
||||
src='/static/logo.png'
|
||||
alt='Sim'
|
||||
width={72}
|
||||
height={28}
|
||||
className='h-7 w-auto'
|
||||
priority
|
||||
/>
|
||||
),
|
||||
title: <SimLogoFull className='h-7 w-auto' />,
|
||||
}}
|
||||
sidebar={{
|
||||
defaultOpenLevel: 0,
|
||||
|
||||
@@ -9,7 +9,7 @@ export default function NotFound() {
|
||||
<DocsPage>
|
||||
<DocsBody>
|
||||
<div className='flex min-h-[60vh] flex-col items-center justify-center text-center'>
|
||||
<h1 className='mb-4 bg-gradient-to-b from-[#8357FF] to-[#6F3DFA] bg-clip-text font-bold text-8xl text-transparent'>
|
||||
<h1 className='mb-4 bg-gradient-to-b from-[#47d991] to-[#33c482] bg-clip-text font-bold text-8xl text-transparent'>
|
||||
404
|
||||
</h1>
|
||||
<h2 className='mb-2 font-semibold text-2xl text-foreground'>Page Not Found</h2>
|
||||
|
||||
@@ -33,15 +33,41 @@ async function loadGoogleFont(font: string, weights: string, text: string): Prom
|
||||
throw new Error('Failed to load font data')
|
||||
}
|
||||
|
||||
/**
|
||||
* Sim logo with icon and "Sim" text for OG image.
|
||||
*/
|
||||
function SimLogoFull() {
|
||||
return (
|
||||
<svg height='28' viewBox='720 440 1020 320' fill='none'>
|
||||
{/* Green icon - top left shape with cutout */}
|
||||
<path
|
||||
fillRule='evenodd'
|
||||
clipRule='evenodd'
|
||||
d='M875.791 577.171C875.791 581.922 873.911 586.483 870.576 589.842L870.098 590.323C866.764 593.692 862.234 595.575 857.517 595.575H750.806C740.978 595.575 733 603.6 733 613.498V728.902C733 738.799 740.978 746.826 750.806 746.826H865.382C875.209 746.826 883.177 738.799 883.177 728.902V620.853C883.177 616.448 884.912 612.222 888.008 609.104C891.093 605.997 895.29 604.249 899.664 604.249H1008.16C1017.99 604.249 1025.96 596.224 1025.96 586.327V470.923C1025.96 461.025 1017.99 453 1008.16 453H893.586C883.759 453 875.791 461.025 875.791 470.923V577.171ZM910.562 477.566H991.178C996.922 477.566 1001.57 482.254 1001.57 488.029V569.22C1001.57 574.995 996.922 579.683 991.178 579.683H910.562C904.828 579.683 900.173 574.995 900.173 569.22V488.029C900.173 482.254 904.828 477.566 910.562 477.566Z'
|
||||
fill='#33C482'
|
||||
/>
|
||||
{/* Green icon - bottom right square */}
|
||||
<path
|
||||
d='M1008.3 624.59H923.113C912.786 624.59 904.414 633.022 904.414 643.423V728.171C904.414 738.572 912.786 747.004 923.113 747.004H1008.3C1018.63 747.004 1027 738.572 1027 728.171V643.423C1027 633.022 1018.63 624.59 1008.3 624.59Z'
|
||||
fill='#33C482'
|
||||
/>
|
||||
{/* "Sim" text - white for dark background */}
|
||||
<path
|
||||
d='M1210.54 515.657C1226.65 515.657 1240.59 518.51 1252.31 524.257H1252.31C1264.3 529.995 1273.63 538.014 1280.26 548.319H1280.26C1287.19 558.635 1290.78 570.899 1291.08 585.068L1291.1 586.089H1249.11L1249.09 585.115C1248.8 574.003 1245.18 565.493 1238.32 559.451C1231.45 553.399 1221.79 550.308 1209.21 550.308C1196.3 550.308 1186.48 553.113 1179.61 558.588C1172.76 564.046 1169.33 571.499 1169.33 581.063C1169.33 588.092 1171.88 593.978 1177.01 598.783C1182.17 603.618 1189.99 607.399 1200.56 610.061H1200.56L1238.77 619.451C1257.24 623.65 1271.21 630.571 1280.57 640.293L1281.01 640.739C1290.13 650.171 1294.64 662.97 1294.64 679.016C1294.64 692.923 1290.88 705.205 1283.34 715.822L1283.33 715.834C1275.81 726.134 1265.44 734.14 1252.26 739.866L1252.25 739.871C1239.36 745.302 1224.12 748 1206.54 748C1180.9 748 1160.36 741.696 1145.02 728.984C1129.67 716.258 1122 699.269 1122 678.121V677.121H1163.99V678.121C1163.99 688.869 1167.87 697.367 1175.61 703.722L1176.34 704.284C1184.04 709.997 1194.37 712.902 1207.43 712.902C1222.13 712.902 1233.3 710.087 1241.07 704.588C1248.8 698.812 1252.64 691.21 1252.64 681.699C1252.64 674.769 1250.5 669.057 1246.25 664.49L1246.23 664.478L1246.22 664.464C1242.28 659.929 1234.83 656.119 1223.64 653.152L1185.43 644.208L1185.42 644.204C1166.05 639.407 1151.49 632.035 1141.83 622.012L1141.83 622.006L1141.82 622C1132.43 611.94 1127.78 598.707 1127.78 582.405C1127.78 568.81 1131.23 556.976 1138.17 546.949L1138.18 546.941L1138.19 546.933C1145.41 536.936 1155.18 529.225 1167.48 523.793L1167.48 523.79C1180.07 518.36 1194.43 515.657 1210.54 515.657ZM1323.39 521.979C1331.68 525.008 1337.55 526.482 1343.51 526.482C1349.48 526.482 1355.64 525.005 1364.49 521.973L1365.82 521.52V742.633H1322.05V521.489L1323.39 521.979ZM1642.01 515.657C1667.11 515.657 1686.94 523.031 1701.39 537.876C1715.83 552.716 1723 572.968 1723 598.507V742.633H1680.12V608.794C1680.12 591.666 1675.72 578.681 1667.07 569.681L1667.06 569.669L1667.04 569.656C1658.67 560.359 1647.26 555.675 1632.68 555.675C1622.47 555.675 1613.47 558.022 1605.64 562.69L1605.63 562.696C1598.11 567.064 1592.17 573.475 1587.8 581.968C1583.44 590.448 1581.25 600.424 1581.25 611.925V742.633H1537.92V608.347C1537.92 591.208 1533.67 578.376 1525.31 569.68L1525.31 569.674L1525.3 569.668C1516.93 560.664 1505.52 556.122 1490.93 556.122C1480.72 556.122 1471.72 558.469 1463.89 563.138L1463.88 563.144C1456.36 567.511 1450.41 573.922 1446.05 582.415L1446.05 582.422L1446.04 582.428C1441.69 590.602 1439.5 600.423 1439.5 611.925V742.633H1395.72V521.919H1435.05V554.803C1439.92 544.379 1447.91 535.465 1458.37 528.356C1470.71 519.875 1485.58 515.657 1502.93 515.657C1522.37 515.657 1538.61 520.931 1551.55 531.538C1560.38 538.771 1567.1 547.628 1571.72 558.091C1576.05 547.619 1582.83 538.757 1592.07 531.524C1605.61 520.93 1622.28 515.657 1642.01 515.657ZM1343.49 452C1351.45 452 1358.23 454.786 1363.75 460.346C1369.27 465.905 1372.04 472.721 1372.04 480.73C1372.04 488.452 1369.27 495.254 1363.77 501.096L1363.76 501.105L1363.75 501.115C1358.23 506.675 1351.45 509.461 1343.49 509.461C1335.81 509.461 1329.05 506.669 1323.25 501.134L1323.23 501.115L1323.21 501.096C1317.71 495.254 1314.94 488.452 1314.94 480.73C1314.94 472.721 1317.7 465.905 1323.23 460.346L1323.24 460.337L1323.25 460.327C1329.05 454.792 1335.81 452 1343.49 452Z'
|
||||
fill='#fafafa'
|
||||
/>
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates dynamic Open Graph images for documentation pages.
|
||||
* Style matches Cursor docs: dark background, title at top, logo bottom-left, domain bottom-right.
|
||||
*/
|
||||
export async function GET(request: NextRequest) {
|
||||
const { searchParams } = new URL(request.url)
|
||||
const title = searchParams.get('title') || 'Documentation'
|
||||
|
||||
const baseUrl = new URL(request.url).origin
|
||||
|
||||
const allText = `${title}docs.sim.ai`
|
||||
const fontData = await loadGoogleFont('Geist', '400;500;600', allText)
|
||||
|
||||
@@ -52,84 +78,39 @@ export async function GET(request: NextRequest) {
|
||||
width: '100%',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
background: '#0c0c0c',
|
||||
position: 'relative',
|
||||
justifyContent: 'space-between',
|
||||
padding: '56px 64px',
|
||||
background: '#121212', // Dark mode background matching docs (hsla 0, 0%, 7%)
|
||||
fontFamily: 'Geist',
|
||||
}}
|
||||
>
|
||||
{/* Base gradient layer - subtle purple tint across the entire image */}
|
||||
<div
|
||||
{/* Title at top */}
|
||||
<span
|
||||
style={{
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
left: 0,
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
background:
|
||||
'radial-gradient(ellipse 150% 100% at 50% 100%, rgba(88, 28, 135, 0.15) 0%, rgba(88, 28, 135, 0.08) 25%, rgba(88, 28, 135, 0.03) 50%, transparent 80%)',
|
||||
display: 'flex',
|
||||
}}
|
||||
/>
|
||||
|
||||
{/* Secondary glow - adds depth without harsh edges */}
|
||||
<div
|
||||
style={{
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
left: 0,
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
background:
|
||||
'radial-gradient(ellipse 100% 80% at 80% 90%, rgba(112, 31, 252, 0.12) 0%, rgba(112, 31, 252, 0.04) 40%, transparent 70%)',
|
||||
display: 'flex',
|
||||
}}
|
||||
/>
|
||||
|
||||
{/* Top darkening - creates natural vignette */}
|
||||
<div
|
||||
style={{
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
left: 0,
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
background:
|
||||
'linear-gradient(180deg, rgba(0, 0, 0, 0.3) 0%, transparent 40%, transparent 100%)',
|
||||
display: 'flex',
|
||||
}}
|
||||
/>
|
||||
|
||||
{/* Content */}
|
||||
<div
|
||||
style={{
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
padding: '56px 72px',
|
||||
height: '100%',
|
||||
justifyContent: 'space-between',
|
||||
fontSize: getTitleFontSize(title),
|
||||
fontWeight: 500,
|
||||
color: '#fafafa', // Light text matching docs
|
||||
lineHeight: 1.2,
|
||||
letterSpacing: '-0.02em',
|
||||
}}
|
||||
>
|
||||
{/* Logo */}
|
||||
<img src={`${baseUrl}/static/logo.png`} alt='sim' height={32} />
|
||||
{title}
|
||||
</span>
|
||||
|
||||
{/* Title */}
|
||||
<span
|
||||
style={{
|
||||
fontSize: getTitleFontSize(title),
|
||||
fontWeight: 600,
|
||||
color: '#ffffff',
|
||||
lineHeight: 1.1,
|
||||
letterSpacing: '-0.02em',
|
||||
}}
|
||||
>
|
||||
{title}
|
||||
</span>
|
||||
|
||||
{/* Footer */}
|
||||
{/* Footer: icon left, domain right */}
|
||||
<div
|
||||
style={{
|
||||
display: 'flex',
|
||||
justifyContent: 'space-between',
|
||||
alignItems: 'center',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<SimLogoFull />
|
||||
<span
|
||||
style={{
|
||||
fontSize: 20,
|
||||
fontWeight: 500,
|
||||
fontWeight: 400,
|
||||
color: '#71717a',
|
||||
}}
|
||||
>
|
||||
|
||||
@@ -86,27 +86,112 @@ export async function GET(request: NextRequest) {
|
||||
)
|
||||
.limit(candidateLimit)
|
||||
|
||||
const seenIds = new Set<string>()
|
||||
const mergedResults = []
|
||||
const knownLocales = ['en', 'es', 'fr', 'de', 'ja', 'zh']
|
||||
|
||||
for (let i = 0; i < Math.max(vectorResults.length, keywordResults.length); i++) {
|
||||
if (i < vectorResults.length && !seenIds.has(vectorResults[i].chunkId)) {
|
||||
mergedResults.push(vectorResults[i])
|
||||
seenIds.add(vectorResults[i].chunkId)
|
||||
}
|
||||
if (i < keywordResults.length && !seenIds.has(keywordResults[i].chunkId)) {
|
||||
mergedResults.push(keywordResults[i])
|
||||
seenIds.add(keywordResults[i].chunkId)
|
||||
const vectorRankMap = new Map<string, number>()
|
||||
vectorResults.forEach((r, idx) => vectorRankMap.set(r.chunkId, idx + 1))
|
||||
|
||||
const keywordRankMap = new Map<string, number>()
|
||||
keywordResults.forEach((r, idx) => keywordRankMap.set(r.chunkId, idx + 1))
|
||||
|
||||
const allChunkIds = new Set([
|
||||
...vectorResults.map((r) => r.chunkId),
|
||||
...keywordResults.map((r) => r.chunkId),
|
||||
])
|
||||
|
||||
const k = 60
|
||||
type ResultWithRRF = (typeof vectorResults)[0] & { rrfScore: number }
|
||||
const scoredResults: ResultWithRRF[] = []
|
||||
|
||||
for (const chunkId of allChunkIds) {
|
||||
const vectorRank = vectorRankMap.get(chunkId) ?? Number.POSITIVE_INFINITY
|
||||
const keywordRank = keywordRankMap.get(chunkId) ?? Number.POSITIVE_INFINITY
|
||||
|
||||
const rrfScore = 1 / (k + vectorRank) + 1 / (k + keywordRank)
|
||||
|
||||
const result =
|
||||
vectorResults.find((r) => r.chunkId === chunkId) ||
|
||||
keywordResults.find((r) => r.chunkId === chunkId)
|
||||
|
||||
if (result) {
|
||||
scoredResults.push({ ...result, rrfScore })
|
||||
}
|
||||
}
|
||||
|
||||
const filteredResults = mergedResults.slice(0, limit)
|
||||
const searchResults = filteredResults.map((result) => {
|
||||
scoredResults.sort((a, b) => b.rrfScore - a.rrfScore)
|
||||
|
||||
const localeFilteredResults = scoredResults.filter((result) => {
|
||||
const firstPart = result.sourceDocument.split('/')[0]
|
||||
if (knownLocales.includes(firstPart)) {
|
||||
return firstPart === locale
|
||||
}
|
||||
return locale === 'en'
|
||||
})
|
||||
|
||||
const queryLower = query.toLowerCase()
|
||||
const getTitleBoost = (result: ResultWithRRF): number => {
|
||||
const fileName = result.sourceDocument
|
||||
.replace('.mdx', '')
|
||||
.split('/')
|
||||
.pop()
|
||||
?.toLowerCase()
|
||||
?.replace(/_/g, ' ')
|
||||
|
||||
if (fileName === queryLower) return 0.01
|
||||
if (fileName?.includes(queryLower)) return 0.005
|
||||
return 0
|
||||
}
|
||||
|
||||
localeFilteredResults.sort((a, b) => {
|
||||
return b.rrfScore + getTitleBoost(b) - (a.rrfScore + getTitleBoost(a))
|
||||
})
|
||||
|
||||
const pageMap = new Map<string, ResultWithRRF>()
|
||||
|
||||
for (const result of localeFilteredResults) {
|
||||
const pageKey = result.sourceDocument
|
||||
const existing = pageMap.get(pageKey)
|
||||
|
||||
if (!existing || result.rrfScore > existing.rrfScore) {
|
||||
pageMap.set(pageKey, result)
|
||||
}
|
||||
}
|
||||
|
||||
const deduplicatedResults = Array.from(pageMap.values())
|
||||
.sort((a, b) => b.rrfScore + getTitleBoost(b) - (a.rrfScore + getTitleBoost(a)))
|
||||
.slice(0, limit)
|
||||
|
||||
const searchResults = deduplicatedResults.map((result) => {
|
||||
const title = result.headerText || result.sourceDocument.replace('.mdx', '')
|
||||
|
||||
const pathParts = result.sourceDocument
|
||||
.replace('.mdx', '')
|
||||
.split('/')
|
||||
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
||||
.filter((part) => part !== 'index' && !knownLocales.includes(part))
|
||||
.map((part) => {
|
||||
return part
|
||||
.replace(/_/g, ' ')
|
||||
.split(' ')
|
||||
.map((word) => {
|
||||
const acronyms = [
|
||||
'api',
|
||||
'mcp',
|
||||
'sdk',
|
||||
'url',
|
||||
'http',
|
||||
'json',
|
||||
'xml',
|
||||
'html',
|
||||
'css',
|
||||
'ai',
|
||||
]
|
||||
if (acronyms.includes(word.toLowerCase())) {
|
||||
return word.toUpperCase()
|
||||
}
|
||||
return word.charAt(0).toUpperCase() + word.slice(1)
|
||||
})
|
||||
.join(' ')
|
||||
})
|
||||
|
||||
return {
|
||||
id: result.chunkId,
|
||||
|
||||
@@ -9,11 +9,20 @@ body {
|
||||
}
|
||||
|
||||
@theme {
|
||||
--color-fd-primary: #802fff; /* Purple from control-bar component */
|
||||
--color-fd-primary: #33c482; /* Green from Sim logo */
|
||||
--font-geist-sans: var(--font-geist-sans);
|
||||
--font-geist-mono: var(--font-geist-mono);
|
||||
}
|
||||
|
||||
/* Ensure primary color is set in both light and dark modes */
|
||||
:root {
|
||||
--color-fd-primary: #33c482;
|
||||
}
|
||||
|
||||
.dark {
|
||||
--color-fd-primary: #33c482;
|
||||
}
|
||||
|
||||
/* Font family utilities */
|
||||
.font-sans {
|
||||
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
|
||||
@@ -34,7 +43,7 @@ body {
|
||||
:root {
|
||||
--fd-border: transparent !important;
|
||||
--fd-border-sidebar: transparent !important;
|
||||
--fd-nav-height: 64px; /* Custom navbar height (h-16 = 4rem = 64px) */
|
||||
--fd-nav-height: 65px; /* Custom navbar height (h-16 = 64px + 1px border) */
|
||||
/* Content container width used to center main content */
|
||||
--spacing-fd-container: 1400px;
|
||||
/* Edge gutter = leftover space on each side of centered container */
|
||||
@@ -119,15 +128,28 @@ aside#nd-sidebar {
|
||||
}
|
||||
}
|
||||
|
||||
/* Hide TOC popover on tablet/medium screens (768px - 1279px) */
|
||||
/* Keeps it visible on mobile (<768px) for easy navigation */
|
||||
/* Desktop (>=1280px) already hides it via fumadocs xl:hidden */
|
||||
@media (min-width: 768px) and (max-width: 1279px) {
|
||||
#nd-docs-layout {
|
||||
--fd-toc-popover-height: 0px !important;
|
||||
}
|
||||
|
||||
[data-toc-popover] {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Desktop only: Apply custom navbar offset, sidebar width and margin offsets */
|
||||
/* On mobile, let fumadocs handle the layout natively */
|
||||
@media (min-width: 1024px) {
|
||||
:root {
|
||||
--fd-banner-height: 64px !important;
|
||||
--fd-banner-height: 65px !important; /* 64px navbar + 1px border */
|
||||
}
|
||||
|
||||
#nd-docs-layout {
|
||||
--fd-docs-height: calc(100dvh - 64px) !important;
|
||||
--fd-docs-height: calc(100dvh - 65px) !important; /* 64px navbar + 1px border */
|
||||
--fd-sidebar-width: 300px !important;
|
||||
margin-left: var(--sidebar-offset) !important;
|
||||
margin-right: var(--toc-offset) !important;
|
||||
@@ -214,19 +236,19 @@ html:not(.dark) #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*
|
||||
letter-spacing: 0.05em !important;
|
||||
}
|
||||
|
||||
/* Override active state (NO PURPLE) */
|
||||
/* Override active state */
|
||||
#nd-sidebar a[data-active="true"],
|
||||
#nd-sidebar button[data-active="true"],
|
||||
#nd-sidebar a.bg-fd-primary\/10,
|
||||
#nd-sidebar a.text-fd-primary,
|
||||
#nd-sidebar a[class*="bg-fd-primary"],
|
||||
#nd-sidebar a[class*="text-fd-primary"],
|
||||
/* Override custom sidebar purple classes */
|
||||
/* Override custom sidebar green classes */
|
||||
#nd-sidebar
|
||||
a.bg-purple-50\/80,
|
||||
#nd-sidebar a.text-purple-600,
|
||||
#nd-sidebar a[class*="bg-purple"],
|
||||
#nd-sidebar a[class*="text-purple"] {
|
||||
a.bg-emerald-50\/80,
|
||||
#nd-sidebar a.text-emerald-600,
|
||||
#nd-sidebar a[class*="bg-emerald"],
|
||||
#nd-sidebar a[class*="text-emerald"] {
|
||||
background-image: none !important;
|
||||
}
|
||||
|
||||
@@ -237,10 +259,10 @@ html.dark #nd-sidebar a.bg-fd-primary\/10,
|
||||
html.dark #nd-sidebar a.text-fd-primary,
|
||||
html.dark #nd-sidebar a[class*="bg-fd-primary"],
|
||||
html.dark #nd-sidebar a[class*="text-fd-primary"],
|
||||
html.dark #nd-sidebar a.bg-purple-50\/80,
|
||||
html.dark #nd-sidebar a.text-purple-600,
|
||||
html.dark #nd-sidebar a[class*="bg-purple"],
|
||||
html.dark #nd-sidebar a[class*="text-purple"] {
|
||||
html.dark #nd-sidebar a.bg-emerald-50\/80,
|
||||
html.dark #nd-sidebar a.text-emerald-600,
|
||||
html.dark #nd-sidebar a[class*="bg-emerald"],
|
||||
html.dark #nd-sidebar a[class*="text-emerald"] {
|
||||
background-color: rgba(255, 255, 255, 0.15) !important;
|
||||
color: rgba(255, 255, 255, 1) !important;
|
||||
}
|
||||
@@ -252,10 +274,10 @@ html:not(.dark) #nd-sidebar a.bg-fd-primary\/10,
|
||||
html:not(.dark) #nd-sidebar a.text-fd-primary,
|
||||
html:not(.dark) #nd-sidebar a[class*="bg-fd-primary"],
|
||||
html:not(.dark) #nd-sidebar a[class*="text-fd-primary"],
|
||||
html:not(.dark) #nd-sidebar a.bg-purple-50\/80,
|
||||
html:not(.dark) #nd-sidebar a.text-purple-600,
|
||||
html:not(.dark) #nd-sidebar a[class*="bg-purple"],
|
||||
html:not(.dark) #nd-sidebar a[class*="text-purple"] {
|
||||
html:not(.dark) #nd-sidebar a.bg-emerald-50\/80,
|
||||
html:not(.dark) #nd-sidebar a.text-emerald-600,
|
||||
html:not(.dark) #nd-sidebar a[class*="bg-emerald"],
|
||||
html:not(.dark) #nd-sidebar a[class*="text-emerald"] {
|
||||
background-color: rgba(0, 0, 0, 0.07) !important;
|
||||
color: rgba(0, 0, 0, 0.9) !important;
|
||||
}
|
||||
@@ -273,8 +295,8 @@ html:not(.dark) #nd-sidebar button:hover:not([data-active="true"]) {
|
||||
}
|
||||
|
||||
/* Dark mode - ensure active/selected items don't change on hover */
|
||||
html.dark #nd-sidebar a.bg-purple-50\/80:hover,
|
||||
html.dark #nd-sidebar a[class*="bg-purple"]:hover,
|
||||
html.dark #nd-sidebar a.bg-emerald-50\/80:hover,
|
||||
html.dark #nd-sidebar a[class*="bg-emerald"]:hover,
|
||||
html.dark #nd-sidebar a[data-active="true"]:hover,
|
||||
html.dark #nd-sidebar button[data-active="true"]:hover {
|
||||
background-color: rgba(255, 255, 255, 0.15) !important;
|
||||
@@ -282,8 +304,8 @@ html.dark #nd-sidebar button[data-active="true"]:hover {
|
||||
}
|
||||
|
||||
/* Light mode - ensure active/selected items don't change on hover */
|
||||
html:not(.dark) #nd-sidebar a.bg-purple-50\/80:hover,
|
||||
html:not(.dark) #nd-sidebar a[class*="bg-purple"]:hover,
|
||||
html:not(.dark) #nd-sidebar a.bg-emerald-50\/80:hover,
|
||||
html:not(.dark) #nd-sidebar a[class*="bg-emerald"]:hover,
|
||||
html:not(.dark) #nd-sidebar a[data-active="true"]:hover,
|
||||
html:not(.dark) #nd-sidebar button[data-active="true"]:hover {
|
||||
background-color: rgba(0, 0, 0, 0.07) !important;
|
||||
@@ -355,16 +377,24 @@ aside[data-sidebar] > *:not([data-sidebar-viewport]) {
|
||||
button[aria-label="Toggle Sidebar"],
|
||||
button[aria-label="Collapse Sidebar"],
|
||||
/* Hide nav title/logo in sidebar on desktop - target all possible locations */
|
||||
/* Lower specificity selectors first (attribute selectors) */
|
||||
[data-sidebar-header],
|
||||
[data-sidebar] [data-title],
|
||||
aside[data-sidebar] a[href="/"],
|
||||
aside[data-sidebar] a[href="/"] img,
|
||||
aside[data-sidebar] > a:first-child,
|
||||
aside[data-sidebar] > div > a:first-child,
|
||||
aside[data-sidebar] img[alt="Sim"],
|
||||
[data-sidebar-header],
|
||||
[data-sidebar] [data-title],
|
||||
aside[data-sidebar] svg[aria-label="Sim"],
|
||||
/* Higher specificity selectors (ID selectors) */
|
||||
#nd-sidebar
|
||||
a[href="/"],
|
||||
#nd-sidebar a[href="/"] img,
|
||||
#nd-sidebar a[href="/"] svg,
|
||||
#nd-sidebar > a:first-child,
|
||||
#nd-sidebar > div:first-child > a:first-child,
|
||||
#nd-sidebar img[alt="Sim"],
|
||||
#nd-sidebar svg[aria-label="Sim"],
|
||||
/* Hide theme toggle at bottom of sidebar on desktop */
|
||||
#nd-sidebar
|
||||
> footer,
|
||||
@@ -502,6 +532,15 @@ pre code .line {
|
||||
color: var(--color-fd-primary);
|
||||
}
|
||||
|
||||
/* ============================================
|
||||
TOC (Table of Contents) Styling
|
||||
============================================ */
|
||||
|
||||
/* Remove the thin border-left on nested TOC items (keeps main indicator only) */
|
||||
#nd-toc a[style*="padding-inline-start"] {
|
||||
border-left: none !important;
|
||||
}
|
||||
|
||||
/* Add bottom spacing to prevent abrupt page endings */
|
||||
[data-content] {
|
||||
padding-top: 1.5rem !important;
|
||||
|
||||
@@ -44,7 +44,7 @@ export function SidebarItem({ item }: { item: Item }) {
|
||||
'lg:text-gray-600 lg:dark:text-gray-400',
|
||||
!active && 'lg:hover:bg-gray-100/60 lg:dark:hover:bg-gray-800/40',
|
||||
active &&
|
||||
'lg:bg-purple-50/80 lg:font-normal lg:text-purple-600 lg:dark:bg-purple-900/15 lg:dark:text-purple-400'
|
||||
'lg:bg-emerald-50/80 lg:font-normal lg:text-emerald-600 lg:dark:bg-emerald-900/15 lg:dark:text-emerald-400'
|
||||
)}
|
||||
>
|
||||
{item.name}
|
||||
@@ -79,7 +79,7 @@ export function SidebarFolder({ item, children }: { item: Folder; children: Reac
|
||||
'lg:text-gray-600 lg:dark:text-gray-400',
|
||||
!active && 'lg:hover:bg-gray-100/60 lg:dark:hover:bg-gray-800/40',
|
||||
active &&
|
||||
'lg:bg-purple-50/80 lg:font-normal lg:text-purple-600 lg:dark:bg-purple-900/15 lg:dark:text-purple-400'
|
||||
'lg:bg-emerald-50/80 lg:font-normal lg:text-emerald-600 lg:dark:bg-emerald-900/15 lg:dark:text-emerald-400'
|
||||
)}
|
||||
>
|
||||
{item.name}
|
||||
@@ -104,7 +104,7 @@ export function SidebarFolder({ item, children }: { item: Folder; children: Reac
|
||||
'lg:text-gray-800 lg:dark:text-gray-200',
|
||||
!active && 'lg:hover:bg-gray-100/60 lg:dark:hover:bg-gray-800/40',
|
||||
active &&
|
||||
'lg:bg-purple-50/80 lg:text-purple-600 lg:dark:bg-purple-900/15 lg:dark:text-purple-400'
|
||||
'lg:bg-emerald-50/80 lg:text-emerald-600 lg:dark:bg-emerald-900/15 lg:dark:text-emerald-400'
|
||||
)}
|
||||
>
|
||||
{item.name}
|
||||
|
||||
@@ -23,7 +23,7 @@ export function TOCFooter() {
|
||||
rel='noopener noreferrer'
|
||||
onMouseEnter={() => setIsHovered(true)}
|
||||
onMouseLeave={() => setIsHovered(false)}
|
||||
className='group mt-2 inline-flex h-8 w-fit items-center justify-center gap-1 whitespace-nowrap rounded-[10px] border border-[#6F3DFA] bg-gradient-to-b from-[#8357FF] to-[#6F3DFA] px-3 pr-[10px] pl-[12px] font-medium text-sm text-white shadow-[inset_0_2px_4px_0_#9B77FF] outline-none transition-all hover:shadow-lg focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50'
|
||||
className='group mt-2 inline-flex h-8 w-fit items-center justify-center gap-1 whitespace-nowrap rounded-[10px] border border-[#2AAD6C] bg-gradient-to-b from-[#3ED990] to-[#2AAD6C] px-3 pr-[10px] pl-[12px] font-medium text-sm text-white shadow-[inset_0_2px_4px_0_#5EE8A8] outline-none transition-all hover:shadow-lg focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50'
|
||||
aria-label='Get started with Sim - Sign up for free'
|
||||
>
|
||||
<span>Get started</span>
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,20 +1,14 @@
|
||||
'use client'
|
||||
|
||||
import Image from 'next/image'
|
||||
import Link from 'next/link'
|
||||
import { LanguageDropdown } from '@/components/ui/language-dropdown'
|
||||
import { SearchTrigger } from '@/components/ui/search-trigger'
|
||||
import { SimLogoFull } from '@/components/ui/sim-logo'
|
||||
import { ThemeToggle } from '@/components/ui/theme-toggle'
|
||||
|
||||
export function Navbar() {
|
||||
return (
|
||||
<nav
|
||||
className='sticky top-0 z-50 border-border/50 border-b'
|
||||
style={{
|
||||
backdropFilter: 'blur(25px) saturate(180%)',
|
||||
WebkitBackdropFilter: 'blur(25px) saturate(180%)',
|
||||
}}
|
||||
>
|
||||
<nav className='sticky top-0 z-50 border-border/50 border-b bg-background/80 backdrop-blur-md backdrop-saturate-150'>
|
||||
{/* Desktop: Single row layout */}
|
||||
<div className='hidden h-16 w-full items-center lg:flex'>
|
||||
<div
|
||||
@@ -27,13 +21,7 @@ export function Navbar() {
|
||||
{/* Left cluster: logo */}
|
||||
<div className='flex items-center'>
|
||||
<Link href='/' className='flex min-w-[100px] items-center'>
|
||||
<Image
|
||||
src='/static/logo.png'
|
||||
alt='Sim'
|
||||
width={72}
|
||||
height={28}
|
||||
className='h-7 w-auto'
|
||||
/>
|
||||
<SimLogoFull className='h-7 w-auto' />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,45 +1,13 @@
|
||||
'use client'
|
||||
|
||||
import { useState } from 'react'
|
||||
import { useCopyButton } from 'fumadocs-ui/utils/use-copy-button'
|
||||
import { Check, Copy } from 'lucide-react'
|
||||
|
||||
const cache = new Map<string, string>()
|
||||
|
||||
export function LLMCopyButton({
|
||||
markdownUrl,
|
||||
}: {
|
||||
/**
|
||||
* A URL to fetch the raw Markdown/MDX content of page
|
||||
*/
|
||||
markdownUrl: string
|
||||
}) {
|
||||
const [isLoading, setLoading] = useState(false)
|
||||
const [checked, onClick] = useCopyButton(async () => {
|
||||
const cached = cache.get(markdownUrl)
|
||||
if (cached) return navigator.clipboard.writeText(cached)
|
||||
|
||||
setLoading(true)
|
||||
|
||||
try {
|
||||
await navigator.clipboard.write([
|
||||
new ClipboardItem({
|
||||
'text/plain': fetch(markdownUrl).then(async (res) => {
|
||||
const content = await res.text()
|
||||
cache.set(markdownUrl, content)
|
||||
|
||||
return content
|
||||
}),
|
||||
}),
|
||||
])
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
})
|
||||
export function LLMCopyButton({ content }: { content: string }) {
|
||||
const [checked, onClick] = useCopyButton(() => navigator.clipboard.writeText(content))
|
||||
|
||||
return (
|
||||
<button
|
||||
disabled={isLoading}
|
||||
onClick={onClick}
|
||||
className='flex cursor-pointer items-center gap-1.5 rounded-lg border border-border/40 bg-background px-2.5 py-2 text-muted-foreground/60 text-sm leading-none transition-all hover:border-border hover:bg-accent/50 hover:text-muted-foreground'
|
||||
aria-label={checked ? 'Copied to clipboard' : 'Copy page content'}
|
||||
|
||||
87
apps/docs/components/ui/action-media.tsx
Normal file
87
apps/docs/components/ui/action-media.tsx
Normal file
@@ -0,0 +1,87 @@
|
||||
'use client'
|
||||
|
||||
import { useState } from 'react'
|
||||
import { cn, getAssetUrl } from '@/lib/utils'
|
||||
import { Lightbox } from './lightbox'
|
||||
|
||||
interface ActionImageProps {
|
||||
src: string
|
||||
alt: string
|
||||
enableLightbox?: boolean
|
||||
}
|
||||
|
||||
interface ActionVideoProps {
|
||||
src: string
|
||||
alt: string
|
||||
enableLightbox?: boolean
|
||||
}
|
||||
|
||||
export function ActionImage({ src, alt, enableLightbox = true }: ActionImageProps) {
|
||||
const [isLightboxOpen, setIsLightboxOpen] = useState(false)
|
||||
|
||||
const handleClick = () => {
|
||||
if (enableLightbox) {
|
||||
setIsLightboxOpen(true)
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<img
|
||||
src={src}
|
||||
alt={alt}
|
||||
onClick={handleClick}
|
||||
className={cn(
|
||||
'inline-block w-full max-w-[200px] rounded border border-neutral-200 dark:border-neutral-700',
|
||||
enableLightbox && 'cursor-pointer transition-opacity hover:opacity-90'
|
||||
)}
|
||||
/>
|
||||
{enableLightbox && (
|
||||
<Lightbox
|
||||
isOpen={isLightboxOpen}
|
||||
onClose={() => setIsLightboxOpen(false)}
|
||||
src={src}
|
||||
alt={alt}
|
||||
type='image'
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export function ActionVideo({ src, alt, enableLightbox = true }: ActionVideoProps) {
|
||||
const [isLightboxOpen, setIsLightboxOpen] = useState(false)
|
||||
const resolvedSrc = getAssetUrl(src)
|
||||
|
||||
const handleClick = () => {
|
||||
if (enableLightbox) {
|
||||
setIsLightboxOpen(true)
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<video
|
||||
src={resolvedSrc}
|
||||
autoPlay
|
||||
loop
|
||||
muted
|
||||
playsInline
|
||||
onClick={handleClick}
|
||||
className={cn(
|
||||
'inline-block w-full max-w-[200px] rounded border border-neutral-200 dark:border-neutral-700',
|
||||
enableLightbox && 'cursor-pointer transition-opacity hover:opacity-90'
|
||||
)}
|
||||
/>
|
||||
{enableLightbox && (
|
||||
<Lightbox
|
||||
isOpen={isLightboxOpen}
|
||||
onClose={() => setIsLightboxOpen(false)}
|
||||
src={src}
|
||||
alt={alt}
|
||||
type='video'
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -17,23 +17,16 @@ export function CodeBlock(props: React.ComponentProps<typeof FumadocsCodeBlock>)
|
||||
return (
|
||||
<FumadocsCodeBlock
|
||||
{...props}
|
||||
Actions={({ children, className }) => (
|
||||
Actions={({ className }) => (
|
||||
<div className={cn('empty:hidden', className)}>
|
||||
{/* Custom copy button */}
|
||||
<button
|
||||
type='button'
|
||||
aria-label={copied ? 'Copied Text' : 'Copy Text'}
|
||||
onClick={(e) => {
|
||||
const pre = (e.currentTarget as HTMLElement)
|
||||
.closest('.nd-codeblock')
|
||||
?.querySelector('pre')
|
||||
const pre = (e.currentTarget as HTMLElement).closest('figure')?.querySelector('pre')
|
||||
if (pre) handleCopy(pre.textContent || '')
|
||||
}}
|
||||
className={cn(
|
||||
'cursor-pointer rounded-md p-2 transition-all',
|
||||
'border border-border bg-background/80 hover:bg-muted',
|
||||
'backdrop-blur-sm'
|
||||
)}
|
||||
className='cursor-pointer rounded-md p-2 text-muted-foreground transition-colors hover:text-foreground'
|
||||
>
|
||||
<span className='flex items-center justify-center'>
|
||||
{copied ? (
|
||||
|
||||
@@ -7,25 +7,30 @@ import {
|
||||
A2AIcon,
|
||||
AhrefsIcon,
|
||||
AirtableIcon,
|
||||
AirweaveIcon,
|
||||
ApifyIcon,
|
||||
ApolloIcon,
|
||||
ArxivIcon,
|
||||
AsanaIcon,
|
||||
BrainIcon,
|
||||
BrowserUseIcon,
|
||||
CalComIcon,
|
||||
CalendlyIcon,
|
||||
CirclebackIcon,
|
||||
ClayIcon,
|
||||
ClerkIcon,
|
||||
ConfluenceIcon,
|
||||
CursorIcon,
|
||||
DatadogIcon,
|
||||
DiscordIcon,
|
||||
DocumentIcon,
|
||||
DropboxIcon,
|
||||
DsPyIcon,
|
||||
DuckDuckGoIcon,
|
||||
DynamoDBIcon,
|
||||
ElasticsearchIcon,
|
||||
ElevenLabsIcon,
|
||||
EnrichSoIcon,
|
||||
ExaAIIcon,
|
||||
EyeIcon,
|
||||
FirecrawlIcon,
|
||||
@@ -33,12 +38,14 @@ import {
|
||||
GithubIcon,
|
||||
GitLabIcon,
|
||||
GmailIcon,
|
||||
GoogleBooksIcon,
|
||||
GoogleCalendarIcon,
|
||||
GoogleDocsIcon,
|
||||
GoogleDriveIcon,
|
||||
GoogleFormsIcon,
|
||||
GoogleGroupsIcon,
|
||||
GoogleIcon,
|
||||
GoogleMapsIcon,
|
||||
GoogleSheetsIcon,
|
||||
GoogleSlidesIcon,
|
||||
GoogleVaultIcon,
|
||||
@@ -55,6 +62,7 @@ import {
|
||||
JiraIcon,
|
||||
JiraServiceManagementIcon,
|
||||
KalshiIcon,
|
||||
LangsmithIcon,
|
||||
LemlistIcon,
|
||||
LinearIcon,
|
||||
LinkedInIcon,
|
||||
@@ -73,6 +81,7 @@ import {
|
||||
MySQLIcon,
|
||||
Neo4jIcon,
|
||||
NotionIcon,
|
||||
OnePasswordIcon,
|
||||
OpenAIIcon,
|
||||
OutlookIcon,
|
||||
PackageSearchIcon,
|
||||
@@ -83,9 +92,11 @@ import {
|
||||
PolymarketIcon,
|
||||
PostgresIcon,
|
||||
PosthogIcon,
|
||||
PulseIcon,
|
||||
QdrantIcon,
|
||||
RDSIcon,
|
||||
RedditIcon,
|
||||
ReductoIcon,
|
||||
ResendIcon,
|
||||
S3Icon,
|
||||
SalesforceIcon,
|
||||
@@ -96,9 +107,9 @@ import {
|
||||
ServiceNowIcon,
|
||||
SftpIcon,
|
||||
ShopifyIcon,
|
||||
SimilarwebIcon,
|
||||
SlackIcon,
|
||||
SmtpIcon,
|
||||
SpotifyIcon,
|
||||
SQSIcon,
|
||||
SshIcon,
|
||||
STTIcon,
|
||||
@@ -107,6 +118,8 @@ import {
|
||||
SupabaseIcon,
|
||||
TavilyIcon,
|
||||
TelegramIcon,
|
||||
TextractIcon,
|
||||
TinybirdIcon,
|
||||
TranslateIcon,
|
||||
TrelloIcon,
|
||||
TTSIcon,
|
||||
@@ -131,38 +144,45 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
|
||||
a2a: A2AIcon,
|
||||
ahrefs: AhrefsIcon,
|
||||
airtable: AirtableIcon,
|
||||
airweave: AirweaveIcon,
|
||||
apify: ApifyIcon,
|
||||
apollo: ApolloIcon,
|
||||
arxiv: ArxivIcon,
|
||||
asana: AsanaIcon,
|
||||
browser_use: BrowserUseIcon,
|
||||
calcom: CalComIcon,
|
||||
calendly: CalendlyIcon,
|
||||
circleback: CirclebackIcon,
|
||||
clay: ClayIcon,
|
||||
confluence: ConfluenceIcon,
|
||||
clerk: ClerkIcon,
|
||||
confluence_v2: ConfluenceIcon,
|
||||
cursor_v2: CursorIcon,
|
||||
datadog: DatadogIcon,
|
||||
discord: DiscordIcon,
|
||||
dropbox: DropboxIcon,
|
||||
dspy: DsPyIcon,
|
||||
duckduckgo: DuckDuckGoIcon,
|
||||
dynamodb: DynamoDBIcon,
|
||||
elasticsearch: ElasticsearchIcon,
|
||||
elevenlabs: ElevenLabsIcon,
|
||||
enrich: EnrichSoIcon,
|
||||
exa: ExaAIIcon,
|
||||
file: DocumentIcon,
|
||||
file_v3: DocumentIcon,
|
||||
firecrawl: FirecrawlIcon,
|
||||
fireflies: FirefliesIcon,
|
||||
fireflies_v2: FirefliesIcon,
|
||||
github_v2: GithubIcon,
|
||||
gitlab: GitLabIcon,
|
||||
gmail_v2: GmailIcon,
|
||||
google_books: GoogleBooksIcon,
|
||||
google_calendar_v2: GoogleCalendarIcon,
|
||||
google_docs: GoogleDocsIcon,
|
||||
google_drive: GoogleDriveIcon,
|
||||
google_forms: GoogleFormsIcon,
|
||||
google_groups: GoogleGroupsIcon,
|
||||
google_maps: GoogleMapsIcon,
|
||||
google_search: GoogleIcon,
|
||||
google_sheets: GoogleSheetsIcon,
|
||||
google_slides: GoogleSlidesIcon,
|
||||
google_sheets_v2: GoogleSheetsIcon,
|
||||
google_slides_v2: GoogleSlidesIcon,
|
||||
google_vault: GoogleVaultIcon,
|
||||
grafana: GrafanaIcon,
|
||||
grain: GrainIcon,
|
||||
@@ -177,8 +197,9 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
|
||||
jina: JinaAIIcon,
|
||||
jira: JiraIcon,
|
||||
jira_service_management: JiraServiceManagementIcon,
|
||||
kalshi: KalshiIcon,
|
||||
kalshi_v2: KalshiIcon,
|
||||
knowledge: PackageSearchIcon,
|
||||
langsmith: LangsmithIcon,
|
||||
lemlist: LemlistIcon,
|
||||
linear: LinearIcon,
|
||||
linkedin: LinkedInIcon,
|
||||
@@ -187,15 +208,16 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
|
||||
mailgun: MailgunIcon,
|
||||
mem0: Mem0Icon,
|
||||
memory: BrainIcon,
|
||||
microsoft_excel: MicrosoftExcelIcon,
|
||||
microsoft_excel_v2: MicrosoftExcelIcon,
|
||||
microsoft_planner: MicrosoftPlannerIcon,
|
||||
microsoft_teams: MicrosoftTeamsIcon,
|
||||
mistral_parse: MistralIcon,
|
||||
mistral_parse_v3: MistralIcon,
|
||||
mongodb: MongoDBIcon,
|
||||
mysql: MySQLIcon,
|
||||
neo4j: Neo4jIcon,
|
||||
notion_v2: NotionIcon,
|
||||
onedrive: MicrosoftOneDriveIcon,
|
||||
onepassword: OnePasswordIcon,
|
||||
openai: OpenAIIcon,
|
||||
outlook: OutlookIcon,
|
||||
parallel_ai: ParallelIcon,
|
||||
@@ -205,9 +227,11 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
|
||||
polymarket: PolymarketIcon,
|
||||
postgresql: PostgresIcon,
|
||||
posthog: PosthogIcon,
|
||||
pulse_v2: PulseIcon,
|
||||
qdrant: QdrantIcon,
|
||||
rds: RDSIcon,
|
||||
reddit: RedditIcon,
|
||||
reducto_v2: ReductoIcon,
|
||||
resend: ResendIcon,
|
||||
s3: S3Icon,
|
||||
salesforce: SalesforceIcon,
|
||||
@@ -219,25 +243,27 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
|
||||
sftp: SftpIcon,
|
||||
sharepoint: MicrosoftSharepointIcon,
|
||||
shopify: ShopifyIcon,
|
||||
similarweb: SimilarwebIcon,
|
||||
slack: SlackIcon,
|
||||
smtp: SmtpIcon,
|
||||
spotify: SpotifyIcon,
|
||||
sqs: SQSIcon,
|
||||
ssh: SshIcon,
|
||||
stagehand: StagehandIcon,
|
||||
stripe: StripeIcon,
|
||||
stt: STTIcon,
|
||||
stt_v2: STTIcon,
|
||||
supabase: SupabaseIcon,
|
||||
tavily: TavilyIcon,
|
||||
telegram: TelegramIcon,
|
||||
textract_v2: TextractIcon,
|
||||
tinybird: TinybirdIcon,
|
||||
translate: TranslateIcon,
|
||||
trello: TrelloIcon,
|
||||
tts: TTSIcon,
|
||||
twilio_sms: TwilioIcon,
|
||||
twilio_voice: TwilioIcon,
|
||||
typeform: TypeformIcon,
|
||||
video_generator: VideoIcon,
|
||||
vision: EyeIcon,
|
||||
video_generator_v2: VideoIcon,
|
||||
vision_v2: EyeIcon,
|
||||
wealthbox: WealthboxIcon,
|
||||
webflow: WebflowIcon,
|
||||
whatsapp: WhatsAppIcon,
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
'use client'
|
||||
|
||||
import { useEffect, useState } from 'react'
|
||||
import { Check, ChevronRight } from 'lucide-react'
|
||||
import { Check, ChevronDown } from 'lucide-react'
|
||||
import { useParams, usePathname, useRouter } from 'next/navigation'
|
||||
import { cn } from '@/lib/utils'
|
||||
|
||||
const languages = {
|
||||
en: { name: 'English', flag: '🇺🇸' },
|
||||
@@ -15,6 +16,7 @@ const languages = {
|
||||
|
||||
export function LanguageDropdown() {
|
||||
const [isOpen, setIsOpen] = useState(false)
|
||||
const [hoveredIndex, setHoveredIndex] = useState<number>(-1)
|
||||
const pathname = usePathname()
|
||||
const params = useParams()
|
||||
const router = useRouter()
|
||||
@@ -71,6 +73,15 @@ export function LanguageDropdown() {
|
||||
return () => window.removeEventListener('keydown', onKey)
|
||||
}, [isOpen])
|
||||
|
||||
// Reset hovered index when popover closes
|
||||
useEffect(() => {
|
||||
if (!isOpen) {
|
||||
setHoveredIndex(-1)
|
||||
}
|
||||
}, [isOpen])
|
||||
|
||||
const languageEntries = Object.entries(languages)
|
||||
|
||||
return (
|
||||
<div className='relative'>
|
||||
<button
|
||||
@@ -82,14 +93,14 @@ export function LanguageDropdown() {
|
||||
aria-haspopup='listbox'
|
||||
aria-expanded={isOpen}
|
||||
aria-controls='language-menu'
|
||||
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'
|
||||
className='flex cursor-pointer items-center gap-1.5 rounded-[6px] 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',
|
||||
}}
|
||||
>
|
||||
<span>{languages[currentLang as keyof typeof languages]?.name}</span>
|
||||
<ChevronRight className='h-3.5 w-3.5' />
|
||||
<ChevronDown className={cn('h-3.5 w-3.5 transition-transform', isOpen && 'rotate-180')} />
|
||||
</button>
|
||||
|
||||
{isOpen && (
|
||||
@@ -98,29 +109,37 @@ export function LanguageDropdown() {
|
||||
<div
|
||||
id='language-menu'
|
||||
role='listbox'
|
||||
className='absolute top-full right-0 z-[1001] mt-1 max-h-[75vh] w-56 overflow-auto rounded-xl border border-border/50 bg-white shadow-2xl md:w-44 md:bg-background/95 md:backdrop-blur-md dark:bg-neutral-950 md:dark:bg-background/95'
|
||||
className='absolute top-full right-0 z-[1001] mt-2 max-h-[400px] min-w-[160px] overflow-auto rounded-[6px] bg-white px-[6px] py-[6px] shadow-lg dark:bg-neutral-900'
|
||||
>
|
||||
{Object.entries(languages).map(([code, lang]) => (
|
||||
<button
|
||||
key={code}
|
||||
onClick={(e) => {
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
handleLanguageChange(code)
|
||||
}}
|
||||
role='option'
|
||||
aria-selected={currentLang === code}
|
||||
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'
|
||||
}`}
|
||||
>
|
||||
<span className='text-base md:text-sm'>{lang.flag}</span>
|
||||
<span className='leading-none'>{lang.name}</span>
|
||||
{currentLang === code && (
|
||||
<Check className='ml-auto h-4 w-4 text-primary md:h-3.5 md:w-3.5' />
|
||||
)}
|
||||
</button>
|
||||
))}
|
||||
{languageEntries.map(([code, lang], index) => {
|
||||
const isSelected = currentLang === code
|
||||
const isHovered = hoveredIndex === index
|
||||
|
||||
return (
|
||||
<button
|
||||
key={code}
|
||||
onClick={(e) => {
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
handleLanguageChange(code)
|
||||
}}
|
||||
onMouseEnter={() => setHoveredIndex(index)}
|
||||
onMouseLeave={() => setHoveredIndex(-1)}
|
||||
role='option'
|
||||
aria-selected={isSelected}
|
||||
className={cn(
|
||||
'flex h-[26px] w-full min-w-0 cursor-pointer items-center gap-[8px] rounded-[6px] px-[6px] text-[13px] transition-colors',
|
||||
'text-neutral-700 dark:text-neutral-200',
|
||||
isHovered && 'bg-neutral-100 dark:bg-neutral-800',
|
||||
'focus:outline-none'
|
||||
)}
|
||||
>
|
||||
<span className='text-[13px]'>{lang.flag}</span>
|
||||
<span className='flex-1 text-left leading-none'>{lang.name}</span>
|
||||
{isSelected && <Check className='ml-auto h-3.5 w-3.5' />}
|
||||
</button>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
|
||||
108
apps/docs/components/ui/sim-logo.tsx
Normal file
108
apps/docs/components/ui/sim-logo.tsx
Normal file
@@ -0,0 +1,108 @@
|
||||
'use client'
|
||||
|
||||
import { cn } from '@/lib/utils'
|
||||
|
||||
interface SimLogoProps {
|
||||
className?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Sim logo with icon and text.
|
||||
* The icon stays green (#33C482), text adapts to light/dark mode.
|
||||
*/
|
||||
export function SimLogo({ className }: SimLogoProps) {
|
||||
return (
|
||||
<svg
|
||||
viewBox='720 440 320 320'
|
||||
fill='none'
|
||||
xmlns='http://www.w3.org/2000/svg'
|
||||
className={cn('h-7 w-auto', className)}
|
||||
aria-label='Sim'
|
||||
>
|
||||
{/* Green icon - top left shape with cutout */}
|
||||
<path
|
||||
fillRule='evenodd'
|
||||
clipRule='evenodd'
|
||||
d='M875.791 577.171C875.791 581.922 873.911 586.483 870.576 589.842L870.098 590.323C866.764 593.692 862.234 595.575 857.517 595.575H750.806C740.978 595.575 733 603.6 733 613.498V728.902C733 738.799 740.978 746.826 750.806 746.826H865.382C875.209 746.826 883.177 738.799 883.177 728.902V620.853C883.177 616.448 884.912 612.222 888.008 609.104C891.093 605.997 895.29 604.249 899.664 604.249H1008.16C1017.99 604.249 1025.96 596.224 1025.96 586.327V470.923C1025.96 461.025 1017.99 453 1008.16 453H893.586C883.759 453 875.791 461.025 875.791 470.923V577.171ZM910.562 477.566H991.178C996.922 477.566 1001.57 482.254 1001.57 488.029V569.22C1001.57 574.995 996.922 579.683 991.178 579.683H910.562C904.828 579.683 900.173 574.995 900.173 569.22V488.029C900.173 482.254 904.828 477.566 910.562 477.566Z'
|
||||
fill='#33C482'
|
||||
/>
|
||||
{/* Green icon - bottom right square */}
|
||||
<path
|
||||
d='M1008.3 624.59H923.113C912.786 624.59 904.414 633.022 904.414 643.423V728.171C904.414 738.572 912.786 747.004 923.113 747.004H1008.3C1018.63 747.004 1027 738.572 1027 728.171V643.423C1027 633.022 1018.63 624.59 1008.3 624.59Z'
|
||||
fill='#33C482'
|
||||
/>
|
||||
{/* Gradient overlay on bottom right square */}
|
||||
<path
|
||||
d='M1008.3 624.199H923.113C912.786 624.199 904.414 632.631 904.414 643.033V727.78C904.414 738.181 912.786 746.612 923.113 746.612H1008.3C1018.63 746.612 1027 738.181 1027 727.78V643.033C1027 632.631 1018.63 624.199 1008.3 624.199Z'
|
||||
fill='url(#sim-logo-gradient)'
|
||||
fillOpacity='0.2'
|
||||
/>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id='sim-logo-gradient'
|
||||
x1='904.414'
|
||||
y1='624.199'
|
||||
x2='978.836'
|
||||
y2='698.447'
|
||||
gradientUnits='userSpaceOnUse'
|
||||
>
|
||||
<stop />
|
||||
<stop offset='1' stopOpacity='0' />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Full Sim logo with icon and "Sim" text.
|
||||
* The icon stays green (#33C482), text adapts to light/dark mode.
|
||||
*/
|
||||
export function SimLogoFull({ className }: SimLogoProps) {
|
||||
return (
|
||||
<svg
|
||||
viewBox='720 440 1020 320'
|
||||
fill='none'
|
||||
xmlns='http://www.w3.org/2000/svg'
|
||||
className={cn('h-7 w-auto', className)}
|
||||
aria-label='Sim'
|
||||
>
|
||||
{/* Green icon - top left shape with cutout */}
|
||||
<path
|
||||
fillRule='evenodd'
|
||||
clipRule='evenodd'
|
||||
d='M875.791 577.171C875.791 581.922 873.911 586.483 870.576 589.842L870.098 590.323C866.764 593.692 862.234 595.575 857.517 595.575H750.806C740.978 595.575 733 603.6 733 613.498V728.902C733 738.799 740.978 746.826 750.806 746.826H865.382C875.209 746.826 883.177 738.799 883.177 728.902V620.853C883.177 616.448 884.912 612.222 888.008 609.104C891.093 605.997 895.29 604.249 899.664 604.249H1008.16C1017.99 604.249 1025.96 596.224 1025.96 586.327V470.923C1025.96 461.025 1017.99 453 1008.16 453H893.586C883.759 453 875.791 461.025 875.791 470.923V577.171ZM910.562 477.566H991.178C996.922 477.566 1001.57 482.254 1001.57 488.029V569.22C1001.57 574.995 996.922 579.683 991.178 579.683H910.562C904.828 579.683 900.173 574.995 900.173 569.22V488.029C900.173 482.254 904.828 477.566 910.562 477.566Z'
|
||||
fill='#33C482'
|
||||
/>
|
||||
{/* Green icon - bottom right square */}
|
||||
<path
|
||||
d='M1008.3 624.59H923.113C912.786 624.59 904.414 633.022 904.414 643.423V728.171C904.414 738.572 912.786 747.004 923.113 747.004H1008.3C1018.63 747.004 1027 738.572 1027 728.171V643.423C1027 633.022 1018.63 624.59 1008.3 624.59Z'
|
||||
fill='#33C482'
|
||||
/>
|
||||
{/* Gradient overlay on bottom right square */}
|
||||
<path
|
||||
d='M1008.3 624.199H923.113C912.786 624.199 904.414 632.631 904.414 643.033V727.78C904.414 738.181 912.786 746.612 923.113 746.612H1008.3C1018.63 746.612 1027 738.181 1027 727.78V643.033C1027 632.631 1018.63 624.199 1008.3 624.199Z'
|
||||
fill='url(#sim-logo-full-gradient)'
|
||||
fillOpacity='0.2'
|
||||
/>
|
||||
{/* "Sim" text - adapts to light/dark mode via currentColor */}
|
||||
<path
|
||||
d='M1210.54 515.657C1226.65 515.657 1240.59 518.51 1252.31 524.257H1252.31C1264.3 529.995 1273.63 538.014 1280.26 548.319H1280.26C1287.19 558.635 1290.78 570.899 1291.08 585.068L1291.1 586.089H1249.11L1249.09 585.115C1248.8 574.003 1245.18 565.493 1238.32 559.451C1231.45 553.399 1221.79 550.308 1209.21 550.308C1196.3 550.308 1186.48 553.113 1179.61 558.588C1172.76 564.046 1169.33 571.499 1169.33 581.063C1169.33 588.092 1171.88 593.978 1177.01 598.783C1182.17 603.618 1189.99 607.399 1200.56 610.061H1200.56L1238.77 619.451C1257.24 623.65 1271.21 630.571 1280.57 640.293L1281.01 640.739C1290.13 650.171 1294.64 662.97 1294.64 679.016C1294.64 692.923 1290.88 705.205 1283.34 715.822L1283.33 715.834C1275.81 726.134 1265.44 734.14 1252.26 739.866L1252.25 739.871C1239.36 745.302 1224.12 748 1206.54 748C1180.9 748 1160.36 741.696 1145.02 728.984C1129.67 716.258 1122 699.269 1122 678.121V677.121H1163.99V678.121C1163.99 688.869 1167.87 697.367 1175.61 703.722L1176.34 704.284C1184.04 709.997 1194.37 712.902 1207.43 712.902C1222.13 712.902 1233.3 710.087 1241.07 704.588C1248.8 698.812 1252.64 691.21 1252.64 681.699C1252.64 674.769 1250.5 669.057 1246.25 664.49L1246.23 664.478L1246.22 664.464C1242.28 659.929 1234.83 656.119 1223.64 653.152L1185.43 644.208L1185.42 644.204C1166.05 639.407 1151.49 632.035 1141.83 622.012L1141.83 622.006L1141.82 622C1132.43 611.94 1127.78 598.707 1127.78 582.405C1127.78 568.81 1131.23 556.976 1138.17 546.949L1138.18 546.941L1138.19 546.933C1145.41 536.936 1155.18 529.225 1167.48 523.793L1167.48 523.79C1180.07 518.36 1194.43 515.657 1210.54 515.657ZM1323.39 521.979C1331.68 525.008 1337.55 526.482 1343.51 526.482C1349.48 526.482 1355.64 525.005 1364.49 521.973L1365.82 521.52V742.633H1322.05V521.489L1323.39 521.979ZM1642.01 515.657C1667.11 515.657 1686.94 523.031 1701.39 537.876C1715.83 552.716 1723 572.968 1723 598.507V742.633H1680.12V608.794C1680.12 591.666 1675.72 578.681 1667.07 569.681L1667.06 569.669L1667.04 569.656C1658.67 560.359 1647.26 555.675 1632.68 555.675C1622.47 555.675 1613.47 558.022 1605.64 562.69L1605.63 562.696C1598.11 567.064 1592.17 573.475 1587.8 581.968C1583.44 590.448 1581.25 600.424 1581.25 611.925V742.633H1537.92V608.347C1537.92 591.208 1533.67 578.376 1525.31 569.68L1525.31 569.674L1525.3 569.668C1516.93 560.664 1505.52 556.122 1490.93 556.122C1480.72 556.122 1471.72 558.469 1463.89 563.138L1463.88 563.144C1456.36 567.511 1450.41 573.922 1446.05 582.415L1446.05 582.422L1446.04 582.428C1441.69 590.602 1439.5 600.423 1439.5 611.925V742.633H1395.72V521.919H1435.05V554.803C1439.92 544.379 1447.91 535.465 1458.37 528.356C1470.71 519.875 1485.58 515.657 1502.93 515.657C1522.37 515.657 1538.61 520.931 1551.55 531.538C1560.38 538.771 1567.1 547.628 1571.72 558.091C1576.05 547.619 1582.83 538.757 1592.07 531.524C1605.61 520.93 1622.28 515.657 1642.01 515.657ZM1343.49 452C1351.45 452 1358.23 454.786 1363.75 460.346C1369.27 465.905 1372.04 472.721 1372.04 480.73C1372.04 488.452 1369.27 495.254 1363.77 501.096L1363.76 501.105L1363.75 501.115C1358.23 506.675 1351.45 509.461 1343.49 509.461C1335.81 509.461 1329.05 506.669 1323.25 501.134L1323.23 501.115L1323.21 501.096C1317.71 495.254 1314.94 488.452 1314.94 480.73C1314.94 472.721 1317.7 465.905 1323.23 460.346L1323.24 460.337L1323.25 460.327C1329.05 454.792 1335.81 452 1343.49 452Z'
|
||||
className='fill-neutral-900 dark:fill-white'
|
||||
/>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id='sim-logo-full-gradient'
|
||||
x1='904.414'
|
||||
y1='624.199'
|
||||
x2='978.836'
|
||||
y2='698.447'
|
||||
gradientUnits='userSpaceOnUse'
|
||||
>
|
||||
<stop />
|
||||
<stop offset='1' stopOpacity='0' />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
@@ -152,3 +152,9 @@ Input → Agent (Google Search, Notion) → Function (Compile Report)
|
||||
- **Sei spezifisch in System-Prompts**: Definiere die Rolle, den Ton und die Einschränkungen des Agenten klar. Je spezifischer deine Anweisungen sind, desto besser kann der Agent seinen vorgesehenen Zweck erfüllen.
|
||||
- **Wähle die richtige Temperatureinstellung**: Verwende niedrigere Temperatureinstellungen (0-0,3), wenn Genauigkeit wichtig ist, oder erhöhe die Temperatur (0,7-2,0) für kreativere oder vielfältigere Antworten
|
||||
- **Nutze Tools effektiv**: Integriere Tools, die den Zweck des Agenten ergänzen und seine Fähigkeiten erweitern. Sei selektiv bei der Auswahl der Tools, um den Agenten nicht zu überfordern. Für Aufgaben mit wenig Überschneidung verwende einen anderen Agent-Block für die besten Ergebnisse.
|
||||
|
||||
## Best Practices
|
||||
|
||||
- **Seien Sie spezifisch in System-Prompts**: Definieren Sie die Rolle, den Ton und die Grenzen des Agenten klar. Je spezifischer Ihre Anweisungen sind, desto besser kann der Agent seinen beabsichtigten Zweck erfüllen.
|
||||
- **Wählen Sie die richtige Temperatureinstellung**: Verwenden Sie niedrigere Temperatureinstellungen (0–0,3), wenn Genauigkeit wichtig ist, oder erhöhen Sie die Temperatur (0,7–2,0) für kreativere oder vielfältigere Antworten
|
||||
- **Nutzen Sie Tools effektiv**: Integrieren Sie Tools, die den Zweck des Agenten ergänzen und seine Fähigkeiten erweitern. Seien Sie selektiv bei der Auswahl der Tools, um den Agenten nicht zu überfordern. Verwenden Sie für Aufgaben mit geringer Überschneidung einen weiteren Agent-Block für die besten Ergebnisse.
|
||||
|
||||
@@ -255,3 +255,57 @@ console.log(`${processedItems} gültige Elemente verarbeitet`);
|
||||
- **Setzen Sie vernünftige Grenzen**: Halten Sie die Anzahl der Iterationen in einem vernünftigen Rahmen, um lange Ausführungszeiten zu vermeiden
|
||||
- **Verwenden Sie ForEach für Sammlungen**: Verwenden Sie beim Verarbeiten von Arrays oder Objekten ForEach anstelle von For-Schleifen
|
||||
- **Behandeln Sie Fehler elegant**: Erwägen Sie, Fehlerbehandlung innerhalb von Schleifen hinzuzufügen, um robuste Workflows zu gewährleisten
|
||||
|
||||
## Eingaben und Ausgaben
|
||||
|
||||
<Tabs items={['Configuration', 'Variables', 'Results']}>
|
||||
<Tab>
|
||||
<ul className="list-disc space-y-2 pl-6">
|
||||
<li>
|
||||
<strong>Schleifentyp</strong>: Wählen Sie zwischen 'for', 'forEach', 'while' oder 'doWhile'
|
||||
</li>
|
||||
<li>
|
||||
<strong>Iterationen</strong>: Anzahl der Ausführungen (für for-Schleifen)
|
||||
</li>
|
||||
<li>
|
||||
<strong>Sammlung</strong>: Array oder Objekt zum Durchlaufen (für forEach-Schleifen)
|
||||
</li>
|
||||
<li>
|
||||
<strong>Bedingung</strong>: Boolescher Ausdruck zur Auswertung (für while/do-while-Schleifen)
|
||||
</li>
|
||||
</ul>
|
||||
</Tab>
|
||||
<Tab>
|
||||
Verfügbar **innerhalb** der Schleife:
|
||||
<ul className="list-disc space-y-2 pl-6">
|
||||
<li>
|
||||
<strong>{"<loop.index>"}</strong>: Aktuelle Iterationsnummer (0-basiert)
|
||||
</li>
|
||||
<li>
|
||||
<strong>{"<loop.currentItem>"}</strong>: Aktuell verarbeitetes Element (nur forEach)
|
||||
</li>
|
||||
<li>
|
||||
<strong>{"<loop.items>"}</strong>: Vollständige Sammlung (nur forEach)
|
||||
</li>
|
||||
</ul>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<ul className="list-disc space-y-2 pl-6">
|
||||
<li>
|
||||
<strong>{"<blockname.results>"}</strong>: Array aller Iterationsergebnisse (Zugriff über Blocknamen)
|
||||
</li>
|
||||
<li>
|
||||
<strong>Struktur</strong>: Ergebnisse behalten die Iterationsreihenfolge bei
|
||||
</li>
|
||||
<li>
|
||||
<strong>Zugriff</strong>: Verfügbar in Blöcken nach Abschluss der Schleife
|
||||
</li>
|
||||
</ul>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Best Practices
|
||||
|
||||
- **Setzen Sie vernünftige Grenzen**: Halten Sie die Iterationsanzahl angemessen, um lange Ausführungszeiten zu vermeiden
|
||||
- **Verwenden Sie ForEach für Sammlungen**: Verwenden Sie beim Verarbeiten von Arrays oder Objekten ForEach anstelle von For-Schleifen
|
||||
- **Behandeln Sie Fehler elegant**: Erwägen Sie, Fehlerbehandlung innerhalb von Schleifen hinzuzufügen, um robuste Workflows zu gewährleisten
|
||||
|
||||
@@ -214,3 +214,51 @@ Wann Sie welche Methode verwenden sollten:
|
||||
- **Nur unabhängige Operationen**: Stellen Sie sicher, dass Operationen nicht voneinander abhängen
|
||||
- **Ratenbegrenzungen berücksichtigen**: Fügen Sie Verzögerungen oder Drosselungen für API-intensive Workflows hinzu
|
||||
- **Fehlerbehandlung**: Jede Instanz sollte ihre eigenen Fehler angemessen behandeln
|
||||
|
||||
## Eingaben und Ausgaben
|
||||
|
||||
<Tabs items={['Konfiguration', 'Variablen', 'Ergebnisse']}>
|
||||
<Tab>
|
||||
<ul className="list-disc space-y-2 pl-6">
|
||||
<li>
|
||||
<strong>Parallel-Typ</strong>: Wählen Sie zwischen „count" oder „collection"
|
||||
</li>
|
||||
<li>
|
||||
<strong>Anzahl</strong>: Anzahl der auszuführenden Instanzen (anzahlbasiert)
|
||||
</li>
|
||||
<li>
|
||||
<strong>Collection</strong>: Array oder Objekt zur Verteilung (sammlungsbasiert)
|
||||
</li>
|
||||
</ul>
|
||||
</Tab>
|
||||
<Tab>
|
||||
Verfügbar **innerhalb** der Parallelverarbeitung:
|
||||
<ul className="list-disc space-y-2 pl-6">
|
||||
<li>
|
||||
<strong>{"<parallel.index>"}</strong>: Instanznummer (0-basiert)
|
||||
</li>
|
||||
<li>
|
||||
<strong>{"<parallel.currentItem>"}</strong>: Element für diese Instanz (nur sammlungsbasiert)
|
||||
</li>
|
||||
<li>
|
||||
<strong>{"<parallel.items>"}</strong>: Vollständige Sammlung (nur sammlungsbasiert)
|
||||
</li>
|
||||
</ul>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<ul className="list-disc space-y-2 pl-6">
|
||||
<li>
|
||||
<strong>{"<blockname.results>"}</strong>: Array aller Instanzergebnisse (Zugriff über Blockname)
|
||||
</li>
|
||||
<li>
|
||||
<strong>Zugriff</strong>: Verfügbar in Blöcken nach Abschluss der Parallelverarbeitung
|
||||
</li>
|
||||
</ul>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Best Practices
|
||||
|
||||
- **Nur unabhängige Operationen**: Stellen Sie sicher, dass Operationen nicht voneinander abhängen
|
||||
- **Rate Limits beachten**: Fügen Sie Verzögerungen oder Drosselung für API-intensive Workflows hinzu
|
||||
- **Fehlerbehandlung**: Jede Instanz sollte ihre eigenen Fehler ordnungsgemäß behandeln
|
||||
|
||||
@@ -100,3 +100,18 @@ Input (Lead) → Router → Agent (Enterprise Sales) or Workflow (Self-serve)
|
||||
- **Mit verschiedenen Eingaben testen**: Stellen Sie sicher, dass der Router verschiedene Eingabetypen, Grenzfälle und unerwartete Inhalte verarbeiten kann
|
||||
- **Routing-Leistung überwachen**: Überprüfen Sie Routing-Entscheidungen regelmäßig und verfeinern Sie Kriterien basierend auf tatsächlichen Nutzungsmustern
|
||||
- **Geeignete Modelle auswählen**: Verwenden Sie Modelle mit starken Argumentationsfähigkeiten für komplexe Routing-Entscheidungen
|
||||
|
||||
Wenn der Router keine geeignete Route für den gegebenen Kontext ermitteln kann, leitet er stattdessen zum **Fehlerpfad** weiter, anstatt willkürlich eine Route auszuwählen. Dies geschieht, wenn:
|
||||
|
||||
- Der Kontext keiner der definierten Routenbeschreibungen eindeutig entspricht
|
||||
- Die KI feststellt, dass keine der verfügbaren Routen geeignet ist
|
||||
|
||||
## Best Practices
|
||||
|
||||
- **Klare Routenbeschreibungen verfassen**: Jede Routenbeschreibung sollte klar erklären, wann diese Route ausgewählt werden sollte. Seien Sie spezifisch bezüglich der Kriterien.
|
||||
- **Routen gegenseitig ausschließend gestalten**: Stellen Sie nach Möglichkeit sicher, dass sich Routenbeschreibungen nicht überschneiden, um mehrdeutige Routing-Entscheidungen zu vermeiden.
|
||||
- **Einen Fehlerpfad verbinden**: Behandeln Sie Fälle, in denen keine Route passt, indem Sie einen Fehlerbehandler für ein elegantes Fallback-Verhalten verbinden.
|
||||
- **Aussagekräftige Routentitel verwenden**: Routentitel erscheinen im Workflow-Canvas, machen Sie sie daher für bessere Lesbarkeit aussagekräftig.
|
||||
- **Mit verschiedenen Eingaben testen**: Stellen Sie sicher, dass der Router verschiedene Eingabetypen, Grenzfälle und unerwartete Inhalte verarbeitet.
|
||||
- **Routing-Performance überwachen**: Überprüfen Sie Routing-Entscheidungen regelmäßig und verfeinern Sie Routenbeschreibungen basierend auf tatsächlichen Nutzungsmustern.
|
||||
- **Geeignete Modelle wählen**: Verwenden Sie Modelle mit starken Reasoning-Fähigkeiten für komplexe Routing-Entscheidungen.
|
||||
|
||||
@@ -169,3 +169,175 @@ copilotCost = (inputTokens × inputPrice + outputTokens × (outputPrice × 1.5))
|
||||
<Callout type="info">
|
||||
Modellpreise werden pro Million Tokens angegeben. Die Berechnung teilt durch 1.000.000, um die tatsächlichen Kosten zu ermitteln. Siehe <a href="/execution/costs">die Seite zur Kostenberechnung</a> für Hintergründe und Beispiele.
|
||||
</Callout>
|
||||
|
||||
Fahre mit der Maus über eine deiner Nachrichten und klicke auf **Bearbeiten**, um sie zu ändern und erneut zu senden. Dies ist nützlich, um deine Eingaben zu verfeinern.
|
||||
|
||||
### Nachrichtenwarteschlange
|
||||
|
||||
Wenn du eine Nachricht sendest, während Copilot noch antwortet, wird sie in die Warteschlange gestellt. Du kannst:
|
||||
- Warteschlangennachrichten im erweiterbaren Warteschlangenpanel anzeigen
|
||||
- Eine Nachricht aus der Warteschlange sofort senden (bricht die aktuelle Antwort ab)
|
||||
- Nachrichten aus der Warteschlange entfernen
|
||||
|
||||
## Dateianhänge
|
||||
|
||||
Klicke auf das Anhang-Symbol, um Dateien mit deiner Nachricht hochzuladen. Unterstützte Dateitypen umfassen:
|
||||
- Bilder (Vorschau-Thumbnails werden angezeigt)
|
||||
- PDFs
|
||||
- Textdateien, JSON, XML
|
||||
- Andere Dokumentformate
|
||||
|
||||
Dateien werden als anklickbare Thumbnails angezeigt, die in einem neuen Tab geöffnet werden.
|
||||
|
||||
## Checkpoints & Änderungen
|
||||
|
||||
Wenn Copilot Änderungen an deinem Workflow vornimmt, speichert es Checkpoints, damit du bei Bedarf zurückkehren kannst.
|
||||
|
||||
### Checkpoints anzeigen
|
||||
|
||||
Fahre mit der Maus über eine Copilot-Nachricht und klicke auf das Checkpoints-Symbol, um gespeicherte Workflow-Zustände für diese Nachricht anzuzeigen.
|
||||
|
||||
### Änderungen rückgängig machen
|
||||
|
||||
Klicke bei jedem Checkpoint auf **Rückgängig machen**, um deinen Workflow auf diesen Zustand zurückzusetzen. Ein Bestätigungsdialog warnt dich, dass diese Aktion nicht rückgängig gemacht werden kann.
|
||||
|
||||
### Änderungen akzeptieren
|
||||
|
||||
Wenn Copilot Änderungen vorschlägt, kannst du:
|
||||
- **Akzeptieren**: Die vorgeschlagenen Änderungen anwenden (`Mod+Shift+Enter`)
|
||||
- **Ablehnen**: Die Änderungen verwerfen und deinen aktuellen Workflow beibehalten
|
||||
|
||||
## Denkblöcke
|
||||
|
||||
Bei komplexen Anfragen kann Copilot seinen Denkprozess in erweiterbaren Denkblöcken anzeigen:
|
||||
|
||||
- Blöcke werden automatisch erweitert, während Copilot denkt
|
||||
- Klicken zum manuellen Erweitern/Reduzieren
|
||||
- Zeigt die Dauer des Denkprozesses an
|
||||
- Hilft dir zu verstehen, wie Copilot zu seiner Lösung gekommen ist
|
||||
|
||||
## Optionsauswahl
|
||||
|
||||
Wenn Copilot mehrere Optionen präsentiert, kannst du auswählen mit:
|
||||
|
||||
| Steuerung | Aktion |
|
||||
|---------|--------|
|
||||
| **1-9** | Option nach Nummer auswählen |
|
||||
| **Pfeiltaste auf/ab** | Zwischen Optionen navigieren |
|
||||
| **Eingabetaste** | Hervorgehobene Option auswählen |
|
||||
|
||||
Ausgewählte Optionen sind hervorgehoben; nicht ausgewählte Optionen erscheinen durchgestrichen.
|
||||
|
||||
## Tastenkombinationen
|
||||
|
||||
| Tastenkombination | Aktion |
|
||||
|----------|--------|
|
||||
| `@` | Kontextmenü öffnen |
|
||||
| `/` | Slash-Befehle öffnen |
|
||||
| `Arrow Up/Down` | Menüelemente navigieren |
|
||||
| `Enter` | Menüelement auswählen |
|
||||
| `Esc` | Menüs schließen |
|
||||
| `Mod+Shift+Enter` | Copilot-Änderungen akzeptieren |
|
||||
|
||||
## Nutzungslimits
|
||||
|
||||
Die Copilot-Nutzung wird pro Token des zugrunde liegenden LLM abgerechnet. Wenn Sie Ihr Nutzungslimit erreichen, fordert Copilot Sie auf, Ihr Limit zu erhöhen. Sie können die Nutzung in Schritten (50 $, 100 $) von Ihrer aktuellen Basis aus hinzufügen.
|
||||
|
||||
<Callout type="info">
|
||||
Siehe die [Seite zur Kostenberechnung](/execution/costs) für Abrechnungsdetails.
|
||||
</Callout>
|
||||
## Copilot MCP
|
||||
|
||||
Sie können Copilot als MCP-Server in Ihrem bevorzugten Editor oder AI-Client verwenden. Damit können Sie Sim-Workflows direkt aus Tools wie Cursor, Claude Code, Claude Desktop und VS Code erstellen, testen, bereitstellen und verwalten.
|
||||
|
||||
### Generieren eines Copilot-API-Schlüssels
|
||||
|
||||
Um sich mit dem Copilot-MCP-Server zu verbinden, benötigen Sie einen **Copilot-API-Schlüssel**:
|
||||
|
||||
1. Gehen Sie zu [sim.ai](https://sim.ai) und melden Sie sich an
|
||||
2. Navigieren Sie zu **Einstellungen** → **Copilot**
|
||||
3. Klicken Sie auf **API-Schlüssel generieren**
|
||||
4. Kopieren Sie den Schlüssel – er wird nur einmal angezeigt
|
||||
|
||||
Der Schlüssel sieht aus wie `sk-sim-copilot-...`. Sie werden ihn in der folgenden Konfiguration verwenden.
|
||||
|
||||
### Cursor
|
||||
|
||||
Fügen Sie Folgendes zu Ihrer `.cursor/mcp.json` (Projektebene) oder den globalen Cursor-MCP-Einstellungen hinzu:
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"sim-copilot": {
|
||||
"url": "https://www.sim.ai/api/mcp/copilot",
|
||||
"headers": {
|
||||
"X-API-Key": "YOUR_COPILOT_API_KEY"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Ersetzen Sie `YOUR_COPILOT_API_KEY` durch den oben generierten Schlüssel.
|
||||
|
||||
### Claude Code
|
||||
|
||||
Führen Sie den folgenden Befehl aus, um den Copilot MCP-Server hinzuzufügen:
|
||||
|
||||
```bash
|
||||
claude mcp add sim-copilot \
|
||||
--transport http \
|
||||
https://www.sim.ai/api/mcp/copilot \
|
||||
--header "X-API-Key: YOUR_COPILOT_API_KEY"
|
||||
```
|
||||
|
||||
Ersetzen Sie `YOUR_COPILOT_API_KEY` durch Ihren Schlüssel.
|
||||
|
||||
### Claude Desktop
|
||||
|
||||
Claude Desktop benötigt [`mcp-remote`](https://www.npmjs.com/package/mcp-remote), um sich mit HTTP-basierten MCP-Servern zu verbinden. Fügen Sie Folgendes zu Ihrer Claude Desktop-Konfigurationsdatei hinzu (`~/Library/Application Support/Claude/claude_desktop_config.json` unter macOS):
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"sim-copilot": {
|
||||
"command": "npx",
|
||||
"args": [
|
||||
"-y",
|
||||
"mcp-remote",
|
||||
"https://www.sim.ai/api/mcp/copilot",
|
||||
"--header",
|
||||
"X-API-Key: YOUR_COPILOT_API_KEY"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Ersetzen Sie `YOUR_COPILOT_API_KEY` durch Ihren Schlüssel.
|
||||
|
||||
### VS Code
|
||||
|
||||
Fügen Sie Folgendes zu Ihrer VS Code `settings.json` oder Workspace `.vscode/settings.json` hinzu:
|
||||
|
||||
```json
|
||||
{
|
||||
"mcp": {
|
||||
"servers": {
|
||||
"sim-copilot": {
|
||||
"type": "http",
|
||||
"url": "https://www.sim.ai/api/mcp/copilot",
|
||||
"headers": {
|
||||
"X-API-Key": "YOUR_COPILOT_API_KEY"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Ersetzen Sie `YOUR_COPILOT_API_KEY` durch Ihren Schlüssel.
|
||||
|
||||
<Callout type="info">
|
||||
Für selbst gehostete Deployments ersetzen Sie `https://www.sim.ai` durch Ihre selbst gehostete Sim-URL.
|
||||
</Callout>
|
||||
|
||||
@@ -75,3 +75,40 @@ Für selbst gehostete Bereitstellungen können Enterprise-Funktionen über Umgeb
|
||||
<Callout type="warn">
|
||||
BYOK ist nur im gehosteten Sim verfügbar. Selbst gehostete Deployments konfigurieren AI-Provider-Schlüssel direkt über Umgebungsvariablen.
|
||||
</Callout>
|
||||
|
||||
Wenn die Abrechnung deaktiviert ist, verwenden Sie die Admin-API zur Verwaltung von Organisationen:
|
||||
|
||||
```bash
|
||||
# Create an organization
|
||||
curl -X POST https://your-instance/api/v1/admin/organizations \
|
||||
-H "x-admin-key: YOUR_ADMIN_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"name": "My Organization", "ownerId": "user-id-here"}'
|
||||
|
||||
# Add a member
|
||||
curl -X POST https://your-instance/api/v1/admin/organizations/{orgId}/members \
|
||||
-H "x-admin-key: YOUR_ADMIN_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"userId": "user-id-here", "role": "admin"}'
|
||||
```
|
||||
|
||||
### Workspace-Mitglieder
|
||||
|
||||
Wenn Einladungen deaktiviert sind, verwenden Sie die Admin-API zur direkten Verwaltung von Workspace-Mitgliedschaften:
|
||||
|
||||
```bash
|
||||
# Add a user to a workspace
|
||||
curl -X POST https://your-instance/api/v1/admin/workspaces/{workspaceId}/members \
|
||||
-H "x-admin-key: YOUR_ADMIN_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"userId": "user-id-here", "permissions": "write"}'
|
||||
|
||||
# Remove a user from a workspace
|
||||
curl -X DELETE "https://your-instance/api/v1/admin/workspaces/{workspaceId}/members?userId=user-id-here" \
|
||||
-H "x-admin-key: YOUR_ADMIN_API_KEY"
|
||||
```
|
||||
|
||||
### Hinweise
|
||||
|
||||
- Die Aktivierung von `ACCESS_CONTROL_ENABLED` aktiviert automatisch Organisationen, da die Zugriffskontrolle eine Organisationsmitgliedschaft erfordert.
|
||||
- Wenn `DISABLE_INVITATIONS` gesetzt ist, können Benutzer keine Einladungen versenden. Verwenden Sie stattdessen die Admin-API zur Verwaltung von Workspace- und Organisationsmitgliedschaften.
|
||||
|
||||
@@ -241,4 +241,45 @@ Dies verteilt große Mehrverbrauchsgebühren über den Monat, anstatt einer gro
|
||||
- Überprüfen Sie Ihre aktuelle Nutzung unter [Einstellungen → Abonnement](https://sim.ai/settings/subscription)
|
||||
- Erfahren Sie mehr über [Protokollierung](/execution/logging), um Ausführungsdetails zu verfolgen
|
||||
- Entdecken Sie die [externe API](/execution/api) für programmatische Kostenüberwachung
|
||||
- Sehen Sie sich [Workflow-Optimierungstechniken](/blocks) an, um Kosten zu reduzieren
|
||||
- Sehen Sie sich [Workflow-Optimierungstechniken](/blocks) an, um Kosten zu reduzieren
|
||||
|
||||
**Pro-Tarif (20 $/Monat):**
|
||||
- Monatliches Abonnement beinhaltet 20 $ Nutzung
|
||||
- Nutzung unter 20 $ → Keine zusätzlichen Gebühren
|
||||
- Nutzung über 20 $ → Mehrverbrauch wird am Monatsende abgerechnet
|
||||
- Beispiel: 35 $ Nutzung = 20 $ (Abonnement) + 15 $ (Mehrverbrauch)
|
||||
|
||||
**Team-Tarif (40 $/Platz/Monat):**
|
||||
- Gemeinsame Nutzung über alle Teammitglieder hinweg
|
||||
- Mehrverbrauch wird aus der gesamten Teamnutzung berechnet
|
||||
- Der Organisationsinhaber erhält eine Rechnung
|
||||
|
||||
**Enterprise-Tarife:**
|
||||
- Fester Monatspreis, keine Mehrverbräuche
|
||||
- Individuelle Nutzungslimits gemäß Vereinbarung
|
||||
|
||||
### Schwellenwertabrechnung
|
||||
|
||||
Wenn der nicht abgerechnete Mehrverbrauch 50 $ erreicht, rechnet Sim automatisch den gesamten nicht abgerechneten Betrag ab.
|
||||
|
||||
**Beispiel:**
|
||||
- Tag 10: 70 $ Mehrverbrauch → 70 $ sofort abrechnen
|
||||
- Tag 15: Weitere 35 $ Nutzung (105 $ gesamt) → Bereits abgerechnet, keine Aktion
|
||||
- Tag 20: Weitere 50 $ Nutzung (155 $ gesamt, 85 $ nicht abgerechnet) → 85 $ sofort abrechnen
|
||||
|
||||
Dies verteilt hohe Mehrverbrauchsgebühren über den Monat hinweg, anstatt einer großen Rechnung am Periodenende.
|
||||
|
||||
## Best Practices für das Kostenmanagement
|
||||
|
||||
1. **Regelmäßig überwachen**: Überprüfen Sie Ihr Nutzungs-Dashboard häufig, um Überraschungen zu vermeiden
|
||||
2. **Budgets festlegen**: Nutzen Sie Tariflimits als Leitplanken für Ihre Ausgaben
|
||||
3. **Workflows optimieren**: Überprüfen Sie kostenintensive Ausführungen und optimieren Sie Prompts oder Modellauswahl
|
||||
4. **Passende Modelle verwenden**: Stimmen Sie die Modellkomplexität auf die Aufgabenanforderungen ab
|
||||
5. **Ähnliche Aufgaben bündeln**: Kombinieren Sie mehrere Anfragen, wenn möglich, um den Overhead zu reduzieren
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
- Überprüfen Sie Ihre aktuelle Nutzung unter [Einstellungen → Abonnement](https://sim.ai/settings/subscription)
|
||||
- Erfahren Sie mehr über [Protokollierung](/execution/logging), um Ausführungsdetails zu verfolgen
|
||||
- Erkunden Sie die [externe API](/execution/api) für programmatische Kostenüberwachung
|
||||
- Informieren Sie sich über [Workflow-Optimierungstechniken](/blocks), um Kosten zu reduzieren
|
||||
172
apps/docs/content/docs/de/execution/files.mdx
Normal file
172
apps/docs/content/docs/de/execution/files.mdx
Normal file
@@ -0,0 +1,172 @@
|
||||
---
|
||||
title: Dateien übergeben
|
||||
---
|
||||
|
||||
import { Callout } from 'fumadocs-ui/components/callout'
|
||||
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
|
||||
|
||||
Sim macht es einfach, mit Dateien in Ihren Workflows zu arbeiten. Blöcke können Dateien empfangen, verarbeiten und nahtlos an andere Blöcke weitergeben.
|
||||
|
||||
## Dateiobjekte
|
||||
|
||||
Wenn Blöcke Dateien ausgeben (wie Gmail-Anhänge, generierte Bilder oder geparste Dokumente), geben sie ein standardisiertes Dateiobjekt zurück:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "report.pdf",
|
||||
"url": "https://...",
|
||||
"base64": "JVBERi0xLjQK...",
|
||||
"type": "application/pdf",
|
||||
"size": 245678
|
||||
}
|
||||
```
|
||||
|
||||
Sie können auf alle diese Eigenschaften zugreifen, wenn Sie auf Dateien aus vorherigen Blöcken verweisen.
|
||||
|
||||
## Der Datei-Block
|
||||
|
||||
Der **Datei-Block** ist der universelle Einstiegspunkt für Dateien in Ihren Workflows. Er akzeptiert Dateien aus jeder Quelle und gibt standardisierte Dateiobjekte aus, die mit allen Integrationen funktionieren.
|
||||
|
||||
**Eingaben:**
|
||||
- **Hochgeladene Dateien** - Dateien direkt per Drag & Drop oder Auswahl hinzufügen
|
||||
- **Externe URLs** - Jede öffentlich zugängliche Datei-URL
|
||||
- **Dateien von anderen Blöcken** - Dateien von Gmail-Anhängen, Slack-Downloads usw. übergeben
|
||||
|
||||
**Ausgaben:**
|
||||
- Eine Liste von `UserFile`-Objekten mit konsistenter Struktur (`name`, `url`, `base64`, `type`, `size`)
|
||||
- `combinedContent` - Extrahierter Textinhalt aus allen Dateien (für Dokumente)
|
||||
|
||||
**Beispielverwendung:**
|
||||
|
||||
```
|
||||
// Get all files from the File block
|
||||
<file.files>
|
||||
|
||||
// Get the first file
|
||||
<file.files[0]>
|
||||
|
||||
// Get combined text content from parsed documents
|
||||
<file.combinedContent>
|
||||
```
|
||||
|
||||
Der Datei-Block führt automatisch folgende Aktionen aus:
|
||||
- Erkennt Dateitypen aus URLs und Erweiterungen
|
||||
- Extrahiert Text aus PDFs, CSVs und Dokumenten
|
||||
- Generiert Base64-Kodierung für Binärdateien
|
||||
- Erstellt vorsignierte URLs für sicheren Zugriff
|
||||
|
||||
Verwenden Sie den Datei-Block, wenn Sie Dateien aus verschiedenen Quellen normalisieren müssen, bevor Sie sie an andere Blöcke wie Vision, STT oder E-Mail-Integrationen übergeben.
|
||||
|
||||
## Dateien zwischen Blöcken übergeben
|
||||
|
||||
Verweisen Sie auf Dateien aus vorherigen Blöcken über das Tag-Dropdown. Klicken Sie in ein beliebiges Dateieingabefeld und geben Sie `<` ein, um verfügbare Ausgaben anzuzeigen.
|
||||
|
||||
**Häufige Muster:**
|
||||
|
||||
```
|
||||
// Single file from a block
|
||||
<gmail.attachments[0]>
|
||||
|
||||
// Pass the whole file object
|
||||
<file_parser.files[0]>
|
||||
|
||||
// Access specific properties
|
||||
<gmail.attachments[0].name>
|
||||
<gmail.attachments[0].base64>
|
||||
```
|
||||
|
||||
Die meisten Blöcke akzeptieren das vollständige Dateiobjekt und extrahieren automatisch, was sie benötigen. Sie müssen `base64` oder `url` in den meisten Fällen nicht manuell extrahieren.
|
||||
|
||||
## Workflows mit Dateien auslösen
|
||||
|
||||
Wenn Sie einen Workflow über die API aufrufen, der Dateieingaben erwartet, fügen Sie Dateien in Ihre Anfrage ein:
|
||||
|
||||
<Tabs items={['Base64', 'URL']}>
|
||||
<Tab value="Base64">
|
||||
|
||||
```bash
|
||||
curl -X POST "https://sim.ai/api/workflows/YOUR_WORKFLOW_ID/execute" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "x-api-key: YOUR_API_KEY" \
|
||||
-d '{
|
||||
"document": {
|
||||
"name": "report.pdf",
|
||||
"base64": "JVBERi0xLjQK...",
|
||||
"type": "application/pdf"
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="URL">
|
||||
|
||||
```bash
|
||||
curl -X POST "https://sim.ai/api/workflows/YOUR_WORKFLOW_ID/execute" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "x-api-key: YOUR_API_KEY" \
|
||||
-d '{
|
||||
"document": {
|
||||
"name": "report.pdf",
|
||||
"url": "https://example.com/report.pdf",
|
||||
"type": "application/pdf"
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
Der Start-Block des Workflows sollte ein Eingabefeld haben, das für den Empfang des Dateiparameters konfiguriert ist.
|
||||
|
||||
## Dateien in API-Antworten empfangen
|
||||
|
||||
Wenn ein Workflow Dateien ausgibt, sind diese in der Antwort enthalten:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"output": {
|
||||
"generatedFile": {
|
||||
"name": "output.png",
|
||||
"url": "https://...",
|
||||
"base64": "iVBORw0KGgo...",
|
||||
"type": "image/png",
|
||||
"size": 34567
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Verwenden Sie `url` für direkte Downloads oder `base64` für Inline-Verarbeitung.
|
||||
|
||||
## Blöcke, die mit Dateien arbeiten
|
||||
|
||||
**Dateieingaben:**
|
||||
- **File** - Dokumente, Bilder und Textdateien parsen
|
||||
- **Vision** - Bilder mit KI-Modellen analysieren
|
||||
- **Mistral Parser** - Text aus PDFs extrahieren
|
||||
|
||||
**Dateiausgaben:**
|
||||
- **Gmail** - E-Mail-Anhänge
|
||||
- **Slack** - Heruntergeladene Dateien
|
||||
- **TTS** - Generierte Audiodateien
|
||||
- **Video Generator** - Generierte Videos
|
||||
- **Image Generator** - Generierte Bilder
|
||||
|
||||
**Dateispeicherung:**
|
||||
- **Supabase** - Upload/Download aus dem Speicher
|
||||
- **S3** - AWS S3-Operationen
|
||||
- **Google Drive** - Drive-Dateioperationen
|
||||
- **Dropbox** - Dropbox-Dateioperationen
|
||||
|
||||
<Callout type="info">
|
||||
Dateien sind automatisch für nachgelagerte Blöcke verfügbar. Die Ausführungs-Engine übernimmt die gesamte Dateiübertragung und Formatkonvertierung.
|
||||
</Callout>
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Dateiobjekte direkt verwenden** - Übergeben Sie das vollständige Dateiobjekt, anstatt einzelne Eigenschaften zu extrahieren. Blöcke übernehmen die Konvertierung automatisch.
|
||||
|
||||
2. **Dateitypen prüfen** - Stellen Sie sicher, dass der Dateityp mit dem übereinstimmt, was der empfangende Block erwartet. Der Vision-Block benötigt Bilder, der File-Block verarbeitet Dokumente.
|
||||
|
||||
3. **Dateigröße beachten** – Große Dateien erhöhen die Ausführungszeit. Bei sehr großen Dateien sollten Sie Storage-Blöcke (S3, Supabase) für die Zwischenspeicherung verwenden.
|
||||
142
apps/docs/content/docs/de/execution/form.mdx
Normal file
142
apps/docs/content/docs/de/execution/form.mdx
Normal file
@@ -0,0 +1,142 @@
|
||||
---
|
||||
title: Formular-Bereitstellung
|
||||
---
|
||||
|
||||
import { Callout } from 'fumadocs-ui/components/callout'
|
||||
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
|
||||
|
||||
Stellen Sie Ihren Workflow als einbettbares Formular bereit, das Benutzer auf Ihrer Website ausfüllen oder per Link teilen können. Formularübermittlungen lösen Ihren Workflow mit dem `form` Trigger-Typ aus.
|
||||
|
||||
## Übersicht
|
||||
|
||||
Die Formular-Bereitstellung verwandelt das Eingabeformat Ihres Workflows in ein responsives Formular, das:
|
||||
- Per Direktlink geteilt werden kann (z. B. `https://sim.ai/form/my-survey`)
|
||||
- Mit einem iframe in jede Website eingebettet werden kann
|
||||
|
||||
Wenn ein Benutzer das Formular absendet, wird Ihr Workflow mit den Formulardaten ausgelöst.
|
||||
|
||||
<Callout type="info">
|
||||
Formulare leiten ihre Felder vom Eingabeformat des Start-Blocks Ihres Workflows ab. Jedes Feld wird zu einer Formulareingabe mit dem entsprechenden Typ.
|
||||
</Callout>
|
||||
|
||||
## Erstellen eines Formulars
|
||||
|
||||
1. Öffnen Sie Ihren Workflow und klicken Sie auf **Bereitstellen**
|
||||
2. Wählen Sie den Tab **Formular**
|
||||
3. Konfigurieren Sie:
|
||||
- **URL**: Eindeutige Kennung (z. B. `contact-form` → `sim.ai/form/contact-form`)
|
||||
- **Titel**: Formularüberschrift
|
||||
- **Beschreibung**: Optionaler Untertitel
|
||||
- **Formularfelder**: Passen Sie Beschriftungen und Beschreibungen für jedes Feld an
|
||||
- **Authentifizierung**: Öffentlich, passwortgeschützt oder E-Mail-Whitelist
|
||||
- **Dankesnachricht**: Wird nach der Übermittlung angezeigt
|
||||
4. Klicken Sie auf **Starten**
|
||||
|
||||
## Feldzuordnung
|
||||
|
||||
| Eingabeformat-Typ | Formularfeld |
|
||||
|------------------|------------|
|
||||
| `string` | Texteingabe |
|
||||
| `number` | Zahleneingabe |
|
||||
| `boolean` | Umschalter |
|
||||
| `object` | JSON-Editor |
|
||||
| `array` | JSON-Array-Editor |
|
||||
| `files` | Datei-Upload |
|
||||
|
||||
## Zugriffskontrolle
|
||||
|
||||
| Modus | Beschreibung |
|
||||
|------|-------------|
|
||||
| **Öffentlich** | Jeder mit dem Link kann absenden |
|
||||
| **Passwort** | Benutzer müssen ein Passwort eingeben |
|
||||
| **E-Mail-Whitelist** | Nur angegebene E-Mails/Domains können absenden |
|
||||
|
||||
Für E-Mail-Whitelist:
|
||||
- Exakt: `user@example.com`
|
||||
- Domain: `@example.com` (alle E-Mails von der Domain)
|
||||
|
||||
## Einbettung
|
||||
|
||||
### Direkter Link
|
||||
|
||||
```
|
||||
https://sim.ai/form/your-identifier
|
||||
```
|
||||
|
||||
### Iframe
|
||||
|
||||
```html
|
||||
<iframe
|
||||
src="https://sim.ai/form/your-identifier"
|
||||
width="100%"
|
||||
height="600"
|
||||
frameborder="0"
|
||||
title="Form"
|
||||
></iframe>
|
||||
```
|
||||
|
||||
## API-Übermittlung
|
||||
|
||||
Formulare programmatisch übermitteln:
|
||||
|
||||
<Tabs items={['cURL', 'TypeScript']}>
|
||||
<Tab value="cURL">
|
||||
|
||||
```bash
|
||||
curl -X POST https://sim.ai/api/form/your-identifier \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"formData": {
|
||||
"name": "John Doe",
|
||||
"email": "john@example.com"
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="TypeScript">
|
||||
|
||||
```typescript
|
||||
const response = await fetch('https://sim.ai/api/form/your-identifier', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
formData: {
|
||||
name: 'John Doe',
|
||||
email: 'john@example.com'
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
// { success: true, data: { executionId: '...' } }
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
### Geschützte Formulare
|
||||
|
||||
Für passwortgeschützte Formulare:
|
||||
|
||||
```bash
|
||||
curl -X POST https://sim.ai/api/form/your-identifier \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{ "password": "secret", "formData": { "name": "John" } }'
|
||||
```
|
||||
|
||||
Für E-Mail-geschützte Formulare:
|
||||
|
||||
```bash
|
||||
curl -X POST https://sim.ai/api/form/your-identifier \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{ "email": "allowed@example.com", "formData": { "name": "John" } }'
|
||||
```
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
**"Keine Eingabefelder konfiguriert"** - Fügen Sie Eingabeformat-Felder zu Ihrem Start-Block hinzu.
|
||||
|
||||
**Formular lädt nicht im Iframe** - Überprüfen Sie, ob die CSP Ihrer Website Iframes von `sim.ai` erlaubt.
|
||||
|
||||
**Übermittlungen schlagen fehl** - Überprüfen Sie, ob die Kennung korrekt ist und erforderliche Felder ausgefüllt sind.
|
||||
@@ -41,9 +41,6 @@ Diese Tastenkombinationen wechseln zwischen den Panel-Tabs auf der rechten Seite
|
||||
|
||||
| Tastenkombination | Aktion |
|
||||
|----------|--------|
|
||||
| `C` | Copilot-Tab fokussieren |
|
||||
| `T` | Toolbar-Tab fokussieren |
|
||||
| `E` | Editor-Tab fokussieren |
|
||||
| `Mod` + `F` | Toolbar-Suche fokussieren |
|
||||
|
||||
## Globale Navigation
|
||||
|
||||
@@ -17,7 +17,7 @@ MCP-Server gruppieren Ihre Workflow-Tools zusammen. Erstellen und verwalten Sie
|
||||
<Video src="mcp/mcp-server.mp4" width={700} height={450} />
|
||||
</div>
|
||||
|
||||
1. Navigieren Sie zu **Einstellungen → Bereitgestellte MCPs**
|
||||
1. Navigieren Sie zu **Einstellungen → MCP-Server**
|
||||
2. Klicken Sie auf **Server erstellen**
|
||||
3. Geben Sie einen Namen und eine optionale Beschreibung ein
|
||||
4. Kopieren Sie die Server-URL zur Verwendung in Ihren MCP-Clients
|
||||
@@ -79,7 +79,7 @@ Füge deinen API-Key-Header (`X-API-Key`) für authentifizierten Zugriff hinzu,
|
||||
|
||||
## Server-Verwaltung
|
||||
|
||||
In der Server-Detailansicht unter **Einstellungen → Bereitgestellte MCPs** können Sie:
|
||||
In der Server-Detailansicht unter **Einstellungen → MCP-Server** können Sie:
|
||||
|
||||
- **Tools anzeigen**: Alle Workflows sehen, die einem Server hinzugefügt wurden
|
||||
- **URL kopieren**: Die Server-URL für MCP-Clients abrufen
|
||||
|
||||
@@ -27,7 +27,7 @@ MCP-Server stellen Sammlungen von Tools bereit, die Ihre Agenten nutzen können.
|
||||
</div>
|
||||
|
||||
1. Navigieren Sie zu Ihren Workspace-Einstellungen
|
||||
2. Gehen Sie zum Abschnitt **Bereitgestellte MCPs**
|
||||
2. Gehen Sie zum Abschnitt **MCP-Server**
|
||||
3. Klicken Sie auf **MCP-Server hinzufügen**
|
||||
4. Geben Sie die Server-Konfigurationsdetails ein
|
||||
5. Speichern Sie die Konfiguration
|
||||
|
||||
394
apps/docs/content/docs/de/quick-reference/index.mdx
Normal file
394
apps/docs/content/docs/de/quick-reference/index.mdx
Normal file
@@ -0,0 +1,394 @@
|
||||
---
|
||||
title: Kurzreferenz
|
||||
description: Wesentliche Aktionen zum Navigieren und Verwenden des Sim-Workflow-Editors
|
||||
---
|
||||
|
||||
import { Callout } from 'fumadocs-ui/components/callout'
|
||||
import { ActionImage, ActionVideo } from '@/components/ui/action-media'
|
||||
|
||||
Eine schnelle Übersicht für alltägliche Aktionen im Sim-Workflow-Editor. Für Tastaturkürzel siehe [Tastaturkürzel](/keyboard-shortcuts).
|
||||
|
||||
<Callout type="info">
|
||||
**Mod** bezieht sich auf `Cmd` unter macOS und `Ctrl` unter Windows/Linux.
|
||||
</Callout>
|
||||
|
||||
## Arbeitsbereiche
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Arbeitsbereich erstellen</td>
|
||||
<td>Arbeitsbereich-Dropdown anklicken → **Neuer Arbeitsbereich**</td>
|
||||
<td><ActionVideo src="quick-reference/create-workspace.mp4" alt="Arbeitsbereich erstellen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Arbeitsbereiche wechseln</td>
|
||||
<td>Arbeitsbereich-Dropdown anklicken → Arbeitsbereich auswählen</td>
|
||||
<td><ActionVideo src="quick-reference/switch-workspace.mp4" alt="Arbeitsbereiche wechseln" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Teammitglieder einladen</td>
|
||||
<td>Seitenleiste → **Einladen**</td>
|
||||
<td><ActionVideo src="quick-reference/invite.mp4" alt="Teammitglieder einladen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Arbeitsbereich umbenennen</td>
|
||||
<td>Rechtsklick auf Arbeitsbereich → **Umbenennen**</td>
|
||||
<td rowSpan={4}><ActionImage src="/static/quick-reference/workspace-context-menu.png" alt="Arbeitsbereich-Kontextmenü" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Arbeitsbereich duplizieren</td>
|
||||
<td>Rechtsklick auf Arbeitsbereich → **Duplizieren**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Arbeitsbereich exportieren</td>
|
||||
<td>Rechtsklick auf Arbeitsbereich → **Exportieren**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Arbeitsbereich löschen</td>
|
||||
<td>Rechtsklick auf Arbeitsbereich → **Löschen**</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Workflows
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Workflow erstellen</td>
|
||||
<td>**+**-Schaltfläche in der Seitenleiste anklicken</td>
|
||||
<td><ActionImage src="/static/quick-reference/create-workflow.png" alt="Workflow erstellen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Workflows neu anordnen / verschieben</td>
|
||||
<td>Workflow nach oben/unten oder auf einen Ordner ziehen</td>
|
||||
<td><ActionVideo src="quick-reference/reordering.mp4" alt="Workflows neu anordnen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Workflow importieren</td>
|
||||
<td>Import-Schaltfläche in der Seitenleiste anklicken → Datei auswählen</td>
|
||||
<td><ActionImage src="/static/quick-reference/import-workflow.png" alt="Workflow importieren" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Mehrere Workflows auswählen</td>
|
||||
<td>`Mod+Click` oder `Shift+Click` Workflows in der Seitenleiste</td>
|
||||
<td><ActionVideo src="quick-reference/multiselect.mp4" alt="Mehrere Workflows auswählen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>In neuem Tab öffnen</td>
|
||||
<td>Rechtsklick auf Workflow → **In neuem Tab öffnen**</td>
|
||||
<td rowSpan={6}><ActionImage src="/static/quick-reference/workflow-context-menu.png" alt="Workflow-Kontextmenü" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Workflow umbenennen</td>
|
||||
<td>Rechtsklick auf Workflow → **Umbenennen**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Workflow-Farbe zuweisen</td>
|
||||
<td>Rechtsklick auf Workflow → **Farbe ändern**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Workflow duplizieren</td>
|
||||
<td>Rechtsklick auf Workflow → **Duplizieren**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Workflow exportieren</td>
|
||||
<td>Rechtsklick auf Workflow → **Exportieren**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Workflow löschen</td>
|
||||
<td>Rechtsklick auf Workflow → **Löschen**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ordner umbenennen</td>
|
||||
<td>Rechtsklick auf Ordner → **Umbenennen**</td>
|
||||
<td rowSpan={6}><ActionImage src="/static/quick-reference/folder-context-menu.png" alt="Ordner-Kontextmenü" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Workflow in Ordner erstellen</td>
|
||||
<td>Rechtsklick auf Ordner → **Workflow erstellen**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ordner in Ordner erstellen</td>
|
||||
<td>Rechtsklick auf Ordner → **Ordner erstellen**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ordner duplizieren</td>
|
||||
<td>Rechtsklick auf Ordner → **Duplizieren**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ordner exportieren</td>
|
||||
<td>Rechtsklick auf Ordner → **Exportieren**</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ordner löschen</td>
|
||||
<td>Rechtsklick auf Ordner → **Löschen**</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Blöcke
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Block hinzufügen</td>
|
||||
<td>Aus Toolbar-Panel ziehen oder Rechtsklick auf Canvas → **Block hinzufügen**</td>
|
||||
<td><ActionVideo src="quick-reference/add-block.mp4" alt="Block hinzufügen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Mehrere Blöcke auswählen</td>
|
||||
<td>`Mod+Click` zusätzliche Blöcke oder Shift-Ziehen für Auswahlrahmen</td>
|
||||
<td><ActionVideo src="quick-reference/multiselect-blocks.mp4" alt="Mehrere Blöcke auswählen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Blöcke kopieren</td>
|
||||
<td>`Mod+C` mit ausgewählten Blöcken</td>
|
||||
<td rowSpan={2}><ActionVideo src="quick-reference/copy-paste.mp4" alt="Blöcke kopieren und einfügen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Blöcke einfügen</td>
|
||||
<td>`Mod+V` zum Einfügen kopierter Blöcke</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Blöcke duplizieren</td>
|
||||
<td>Rechtsklick → **Duplizieren**</td>
|
||||
<td><ActionVideo src="quick-reference/duplicate-block.mp4" alt="Blöcke duplizieren" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Blöcke löschen</td>
|
||||
<td>`Delete` oder `Backspace` Taste oder Rechtsklick → **Löschen**</td>
|
||||
<td><ActionImage src="/static/quick-reference/delete-block.png" alt="Block löschen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Block umbenennen</td>
|
||||
<td>Auf Blocknamen im Header klicken oder im Editor-Panel bearbeiten</td>
|
||||
<td><ActionVideo src="quick-reference/rename-block.mp4" alt="Block umbenennen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Block aktivieren/deaktivieren</td>
|
||||
<td>Rechtsklick → **Aktivieren/Deaktivieren**</td>
|
||||
<td><ActionImage src="/static/quick-reference/disable-block.png" alt="Block deaktivieren" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Block sperren/entsperren</td>
|
||||
<td>Über Block hovern → Auf Schloss-Symbol klicken (nur Admin)</td>
|
||||
<td><ActionImage src="/static/quick-reference/lock-block.png" alt="Block sperren" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Handle-Ausrichtung umschalten</td>
|
||||
<td>Rechtsklick → **Handles umschalten**</td>
|
||||
<td><ActionVideo src="quick-reference/toggle-handles.mp4" alt="Handle-Ausrichtung umschalten" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Block konfigurieren</td>
|
||||
<td>Block auswählen → Editor-Panel rechts verwenden</td>
|
||||
<td><ActionVideo src="quick-reference/configure-block.mp4" alt="Block konfigurieren" /></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Verbindungen
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Verbindung erstellen</td>
|
||||
<td>Vom Ausgangs-Handle zum Eingangs-Handle ziehen</td>
|
||||
<td><ActionVideo src="quick-reference/connect-blocks.mp4" alt="Blöcke verbinden" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Verbindung löschen</td>
|
||||
<td>Auf Kante klicken zum Auswählen → `Delete` Taste</td>
|
||||
<td><ActionVideo src="quick-reference/delete-connection.mp4" alt="Verbindung löschen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ausgabe in anderem Block verwenden</td>
|
||||
<td>Verbindungs-Tag in Eingabefeld ziehen</td>
|
||||
<td><ActionVideo src="quick-reference/connection-tag.mp4" alt="Verbindungs-Tag verwenden" /></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Panels und Ansichten
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Symbolleiste durchsuchen</td>
|
||||
<td>`Mod+F`</td>
|
||||
<td><ActionVideo src="quick-reference/search-toolbar.mp4" alt="Symbolleiste durchsuchen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Alles durchsuchen</td>
|
||||
<td>`Mod+K`</td>
|
||||
<td><ActionImage src="/static/quick-reference/search-everything.png" alt="Alles durchsuchen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Manuellen Modus umschalten</td>
|
||||
<td>Klicken Sie auf die Umschalt-Schaltfläche, um zwischen manuell und Selektor zu wechseln</td>
|
||||
<td><ActionImage src="/static/quick-reference/toggle-manual-mode.png" alt="Manuellen Modus umschalten" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Seitenleiste ein-/ausklappen</td>
|
||||
<td>Klicken Sie auf die Einklappen-Schaltfläche in der Seitenleiste</td>
|
||||
<td><ActionVideo src="quick-reference/collapse-sidebar.mp4" alt="Seitenleiste einklappen" /></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Ausführen und Testen
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Workflow ausführen</td>
|
||||
<td>Klicken Sie auf die Schaltfläche Workflow ausführen oder `Mod+Enter`</td>
|
||||
<td><ActionImage src="/static/quick-reference/run-workflow.png" alt="Workflow ausführen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Workflow stoppen</td>
|
||||
<td>Klicken Sie auf die Stopp-Schaltfläche oder `Mod+Enter` während der Ausführung</td>
|
||||
<td><ActionImage src="/static/quick-reference/stop-workflow.png" alt="Workflow stoppen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Mit Chat testen</td>
|
||||
<td>Verwenden Sie das Chat-Panel auf der rechten Seite</td>
|
||||
<td><ActionImage src="/static/quick-reference/test-chat.png" alt="Mit Chat testen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ausgabe zum Anzeigen auswählen</td>
|
||||
<td>Klicken Sie auf das Dropdown-Menü im Chat-Panel → Wählen Sie Block-Ausgabe aus</td>
|
||||
<td><ActionImage src="/static/quick-reference/output-select.png" alt="Ausgabe zum Anzeigen auswählen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Chat-Verlauf löschen</td>
|
||||
<td>Klicken Sie auf die Löschen-Schaltfläche im Chat-Panel</td>
|
||||
<td><ActionImage src="/static/quick-reference/clear-chat.png" alt="Chat-Verlauf löschen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ab Block ausführen</td>
|
||||
<td>Bewegen Sie den Mauszeiger über den Block → Klicken Sie auf die Wiedergabe-Schaltfläche oder Rechtsklick → **Ab Block ausführen**</td>
|
||||
<td><ActionImage src="/static/quick-reference/run-from-block.png" alt="Ab Block ausführen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Bis Block ausführen</td>
|
||||
<td>Rechtsklick auf Block → **Bis Block ausführen**</td>
|
||||
<td><ActionImage src="/static/quick-reference/run-until-block.png" alt="Bis Block ausführen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ausführungsprotokolle anzeigen</td>
|
||||
<td>Öffnen Sie das Terminal-Panel unten oder `Mod+L`</td>
|
||||
<td><ActionImage src="/static/quick-reference/terminal.png" alt="Terminal für Ausführungsprotokolle" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Protokolle filtern</td>
|
||||
<td>Klicken Sie auf das Filter-Symbol im Terminal → Filtern Sie nach Block oder Status</td>
|
||||
<td><ActionImage src="/static/quick-reference/filter-block.png" alt="Protokolle nach Block filtern" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Protokolle durchsuchen</td>
|
||||
<td>Verwenden Sie das Suchfeld im Terminal oder Rechtsklick auf Protokolleintrag → **Suchen**</td>
|
||||
<td><ActionImage src="/static/quick-reference/terminal-search.png" alt="Protokolle durchsuchen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Protokolleintrag kopieren</td>
|
||||
<td>Zwischenablage-Symbol oder Rechtsklick auf Protokolleintrag → **Kopieren**</td>
|
||||
<td><ActionImage src="/static/quick-reference/copy-log.png" alt="Protokolleintrag kopieren" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Terminal leeren</td>
|
||||
<td>Papierkorb-Symbol oder `Mod+D`</td>
|
||||
<td><ActionImage src="/static/quick-reference/clear-terminal.png" alt="Terminal leeren" /></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Bereitstellung
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Workflow bereitstellen</td>
|
||||
<td>Klicken Sie auf die Schaltfläche **Bereitstellen** im Panel</td>
|
||||
<td><ActionImage src="/static/quick-reference/deploy.png" alt="Workflow bereitstellen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Bereitstellung aktualisieren</td>
|
||||
<td>Klicken Sie auf **Aktualisieren**, wenn Änderungen erkannt werden</td>
|
||||
<td><ActionImage src="/static/quick-reference/update-deployment.png" alt="Bereitstellung aktualisieren" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Bereitstellungsstatus anzeigen</td>
|
||||
<td>Überprüfen Sie die Statusanzeige (Live/Aktualisieren/Bereitstellen) im Tab „Bereitstellen"</td>
|
||||
<td><ActionImage src="/static/quick-reference/view-deployment.png" alt="Bereitstellungsstatus anzeigen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Bereitstellung zurücksetzen</td>
|
||||
<td>Greifen Sie auf frühere Versionen im Tab „Bereitstellen" zu → **Zu Live befördern**</td>
|
||||
<td><ActionImage src="/static/quick-reference/promote-deployment.png" alt="Bereitstellung zu Live befördern" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Versionsbeschreibung hinzufügen</td>
|
||||
<td>Tab „Bereitstellen" → Klicken Sie auf das Beschreibungssymbol → Beschreibung hinzufügen oder generieren</td>
|
||||
<td><ActionVideo src="quick-reference/deployment-description.mp4" alt="Versionsbeschreibung für Bereitstellung hinzufügen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>API-Endpunkt kopieren</td>
|
||||
<td>Tab „Bereitstellen" → API → API-cURL kopieren</td>
|
||||
<td><ActionImage src="/static/quick-reference/copy-api.png" alt="API-Endpunkt kopieren" /></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Variablen
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Workflow-Variable hinzufügen / bearbeiten / löschen</td>
|
||||
<td>Panel → Variablen → **Variable hinzufügen**, zum Bearbeiten klicken oder Löschsymbol verwenden</td>
|
||||
<td><ActionImage src="/static/quick-reference/variables.png" alt="Variablen-Panel" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Umgebungsvariable hinzufügen</td>
|
||||
<td>Einstellungen → **Umgebungsvariablen** → **Hinzufügen**</td>
|
||||
<td><ActionImage src="/static/quick-reference/add-env-variable.png" alt="Umgebungsvariable hinzufügen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Auf Workflow-Variable verweisen</td>
|
||||
<td>Verwenden Sie die Syntax `<blockName.itemName>` in Block-Eingaben</td>
|
||||
<td><ActionImage src="/static/quick-reference/variable-reference.png" alt="Auf Workflow-Variable verweisen" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Auf Umgebungsvariable verweisen</td>
|
||||
<td>Verwenden Sie die Syntax `{{ENV_VAR}}` in Block-Eingaben</td>
|
||||
<td><ActionImage src="/static/quick-reference/env-variable-reference.png" alt="Auf Umgebungsvariable verweisen" /></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -7,10 +7,10 @@ import { Card, Cards } from 'fumadocs-ui/components/card'
|
||||
import { Step, Steps } from 'fumadocs-ui/components/steps'
|
||||
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
|
||||
|
||||
Das offizielle Python SDK für Sim ermöglicht es Ihnen, Workflows programmatisch aus Ihren Python-Anwendungen mithilfe des offiziellen Python SDKs auszuführen.
|
||||
Das offizielle Python SDK für Sim ermöglicht es Ihnen, Workflows programmatisch aus Ihren Python-Anwendungen heraus mit dem offiziellen Python SDK auszuführen.
|
||||
|
||||
<Callout type="info">
|
||||
Das Python SDK unterstützt Python 3.8+ mit asynchroner Ausführungsunterstützung, automatischer Ratenbegrenzung mit exponentiellem Backoff und Nutzungsverfolgung.
|
||||
Das Python SDK unterstützt Python 3.8+ mit Unterstützung für asynchrone Ausführung, automatischer Ratenbegrenzung mit exponentiellem Backoff und Nutzungsverfolgung.
|
||||
</Callout>
|
||||
|
||||
## Installation
|
||||
@@ -75,16 +75,16 @@ result = client.execute_workflow(
|
||||
- `input_data` (dict, optional): Eingabedaten, die an den Workflow übergeben werden
|
||||
- `timeout` (float, optional): Timeout in Sekunden (Standard: 30.0)
|
||||
- `stream` (bool, optional): Streaming-Antworten aktivieren (Standard: False)
|
||||
- `selected_outputs` (list[str], optional): Block-Ausgaben, die im `blockName.attribute`Format gestreamt werden sollen (z.B. `["agent1.content"]`)
|
||||
- `selected_outputs` (list[str], optional): Block-Ausgaben zum Streamen im Format `blockName.attribute` (z. B. `["agent1.content"]`)
|
||||
- `async_execution` (bool, optional): Asynchron ausführen (Standard: False)
|
||||
|
||||
**Rückgabe:** `WorkflowExecutionResult | AsyncExecutionResult`
|
||||
**Rückgabewert:** `WorkflowExecutionResult | AsyncExecutionResult`
|
||||
|
||||
Wenn `async_execution=True`, wird sofort mit einer Task-ID zum Abfragen zurückgegeben. Andernfalls wird auf den Abschluss gewartet.
|
||||
Wenn `async_execution=True`, wird sofort mit einer Task-ID zum Polling zurückgegeben. Andernfalls wird auf die Fertigstellung gewartet.
|
||||
|
||||
##### get_workflow_status()
|
||||
|
||||
Den Status eines Workflows abrufen (Bereitstellungsstatus usw.).
|
||||
Ruft den Status eines Workflows ab (Deployment-Status usw.).
|
||||
|
||||
```python
|
||||
status = client.get_workflow_status("workflow-id")
|
||||
@@ -98,7 +98,7 @@ print("Is deployed:", status.is_deployed)
|
||||
|
||||
##### validate_workflow()
|
||||
|
||||
Überprüfen, ob ein Workflow für die Ausführung bereit ist.
|
||||
Überprüft, ob ein Workflow zur Ausführung bereit ist.
|
||||
|
||||
```python
|
||||
is_ready = client.validate_workflow("workflow-id")
|
||||
@@ -114,7 +114,7 @@ if is_ready:
|
||||
|
||||
##### get_job_status()
|
||||
|
||||
Den Status einer asynchronen Job-Ausführung abrufen.
|
||||
Ruft den Status einer asynchronen Job-Ausführung ab.
|
||||
|
||||
```python
|
||||
status = client.get_job_status("task-id-from-async-execution")
|
||||
@@ -131,7 +131,7 @@ if status["status"] == "completed":
|
||||
**Antwortfelder:**
|
||||
- `success` (bool): Ob die Anfrage erfolgreich war
|
||||
- `taskId` (str): Die Task-ID
|
||||
- `status` (str): Einer der Werte `'queued'`, `'processing'`, `'completed'`, `'failed'`, `'cancelled'`
|
||||
- `status` (str): Einer von `'queued'`, `'processing'`, `'completed'`, `'failed'`, `'cancelled'`
|
||||
- `metadata` (dict): Enthält `startedAt`, `completedAt` und `duration`
|
||||
- `output` (any, optional): Die Workflow-Ausgabe (wenn abgeschlossen)
|
||||
- `error` (any, optional): Fehlerdetails (wenn fehlgeschlagen)
|
||||
@@ -139,7 +139,7 @@ if status["status"] == "completed":
|
||||
|
||||
##### execute_with_retry()
|
||||
|
||||
Einen Workflow mit automatischer Wiederholung bei Ratenbegrenzungsfehlern unter Verwendung von exponentiellem Backoff ausführen.
|
||||
Führt einen Workflow mit automatischer Wiederholung bei Rate-Limit-Fehlern unter Verwendung von exponentiellem Backoff aus.
|
||||
|
||||
```python
|
||||
result = client.execute_with_retry(
|
||||
@@ -161,13 +161,13 @@ result = client.execute_with_retry(
|
||||
- `selected_outputs` (list, optional): Block-Ausgaben zum Streamen
|
||||
- `async_execution` (bool, optional): Asynchron ausführen
|
||||
- `max_retries` (int, optional): Maximale Anzahl von Wiederholungen (Standard: 3)
|
||||
- `initial_delay` (float, optional): Anfängliche Verzögerung in Sekunden (Standard: 1.0)
|
||||
- `initial_delay` (float, optional): Anfangsverzögerung in Sekunden (Standard: 1.0)
|
||||
- `max_delay` (float, optional): Maximale Verzögerung in Sekunden (Standard: 30.0)
|
||||
- `backoff_multiplier` (float, optional): Backoff-Multiplikator (Standard: 2.0)
|
||||
|
||||
**Rückgabewert:** `WorkflowExecutionResult | AsyncExecutionResult`
|
||||
**Rückgabe:** `WorkflowExecutionResult | AsyncExecutionResult`
|
||||
|
||||
Die Wiederholungslogik verwendet exponentielles Backoff (1s → 2s → 4s → 8s...) mit ±25% Jitter, um den Thundering-Herd-Effekt zu vermeiden. Wenn die API einen `retry-after` Header bereitstellt, wird dieser stattdessen verwendet.
|
||||
Die Wiederholungslogik verwendet exponentielles Backoff (1s → 2s → 4s → 8s...) mit ±25% Jitter, um Thundering Herd zu verhindern. Wenn die API einen `retry-after`-Header bereitstellt, wird dieser stattdessen verwendet.
|
||||
|
||||
##### get_rate_limit_info()
|
||||
|
||||
@@ -185,7 +185,7 @@ if rate_limit_info:
|
||||
|
||||
##### get_usage_limits()
|
||||
|
||||
Ruft aktuelle Nutzungslimits und Kontingentinformationen für dein Konto ab.
|
||||
Ruft aktuelle Nutzungslimits und Kontingentinformationen für Ihr Konto ab.
|
||||
|
||||
```python
|
||||
limits = client.get_usage_limits()
|
||||
@@ -320,9 +320,9 @@ class SimStudioError(Exception):
|
||||
|
||||
**Häufige Fehlercodes:**
|
||||
- `UNAUTHORIZED`: Ungültiger API-Schlüssel
|
||||
- `TIMEOUT`: Zeitüberschreitung bei der Anfrage
|
||||
- `RATE_LIMIT_EXCEEDED`: Ratengrenze überschritten
|
||||
- `USAGE_LIMIT_EXCEEDED`: Nutzungsgrenze überschritten
|
||||
- `TIMEOUT`: Zeitüberschreitung der Anfrage
|
||||
- `RATE_LIMIT_EXCEEDED`: Ratenlimit überschritten
|
||||
- `USAGE_LIMIT_EXCEEDED`: Nutzungslimit überschritten
|
||||
- `EXECUTION_ERROR`: Workflow-Ausführung fehlgeschlagen
|
||||
|
||||
## Beispiele
|
||||
@@ -334,7 +334,7 @@ class SimStudioError(Exception):
|
||||
Richten Sie den SimStudioClient mit Ihrem API-Schlüssel ein.
|
||||
</Step>
|
||||
<Step title="Workflow validieren">
|
||||
Prüfen Sie, ob der Workflow bereitgestellt und für die Ausführung bereit ist.
|
||||
Prüfen Sie, ob der Workflow bereitgestellt und zur Ausführung bereit ist.
|
||||
</Step>
|
||||
<Step title="Workflow ausführen">
|
||||
Führen Sie den Workflow mit Ihren Eingabedaten aus.
|
||||
@@ -386,7 +386,7 @@ Behandeln Sie verschiedene Fehlertypen, die während der Workflow-Ausführung au
|
||||
from simstudio import SimStudioClient, SimStudioError
|
||||
import os
|
||||
|
||||
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
|
||||
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
|
||||
|
||||
def execute_with_error_handling():
|
||||
try:
|
||||
@@ -409,11 +409,20 @@ def execute_with_error_handling():
|
||||
raise
|
||||
```
|
||||
|
||||
### Verwendung des Kontextmanagers
|
||||
### Verwendung des Context-Managers
|
||||
|
||||
Verwenden Sie den Client als Kontextmanager, um die Ressourcenbereinigung automatisch zu handhaben:
|
||||
Verwenden Sie den Client als Context-Manager, um die Ressourcenbereinigung automatisch zu handhaben:
|
||||
|
||||
---CODE-PLACEHOLDER-ef99d3dd509e04865d5b6b0e0e03d3f8---
|
||||
```python
|
||||
from simstudio import SimStudioClient
|
||||
import os
|
||||
|
||||
# Using context manager to automatically close the session
|
||||
with SimStudioClient(api_key=os.getenv("SIM_API_KEY")) as client:
|
||||
result = client.execute_workflow("workflow-id")
|
||||
print("Result:", result)
|
||||
# Session is automatically closed here
|
||||
```
|
||||
|
||||
### Batch-Workflow-Ausführung
|
||||
|
||||
@@ -466,7 +475,7 @@ for result in results:
|
||||
|
||||
### Asynchrone Workflow-Ausführung
|
||||
|
||||
Führen Sie Workflows asynchron für lang laufende Aufgaben aus:
|
||||
Führen Sie Workflows asynchron für langwierige Aufgaben aus:
|
||||
|
||||
```python
|
||||
import os
|
||||
@@ -510,9 +519,9 @@ def execute_async():
|
||||
execute_async()
|
||||
```
|
||||
|
||||
### Rate-Limiting und Wiederholungsversuche
|
||||
### Ratenlimitierung und Wiederholung
|
||||
|
||||
Behandle Rate-Limits automatisch mit exponentiellem Backoff:
|
||||
Behandeln Sie Ratenbegrenzungen automatisch mit exponentiellem Backoff:
|
||||
|
||||
```python
|
||||
import os
|
||||
@@ -549,7 +558,7 @@ execute_with_retry_handling()
|
||||
|
||||
### Nutzungsüberwachung
|
||||
|
||||
Überwache deine Kontonutzung und -limits:
|
||||
Überwachen Sie die Nutzung und Limits Ihres Kontos:
|
||||
|
||||
```python
|
||||
import os
|
||||
@@ -593,13 +602,13 @@ check_usage()
|
||||
|
||||
### Streaming-Workflow-Ausführung
|
||||
|
||||
Führe Workflows mit Echtzeit-Streaming-Antworten aus:
|
||||
Führen Sie Workflows mit Echtzeit-Streaming-Antworten aus:
|
||||
|
||||
```python
|
||||
from simstudio import SimStudioClient
|
||||
import os
|
||||
|
||||
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
|
||||
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
|
||||
|
||||
def execute_with_streaming():
|
||||
"""Execute workflow with streaming enabled."""
|
||||
@@ -619,7 +628,7 @@ def execute_with_streaming():
|
||||
execute_with_streaming()
|
||||
```
|
||||
|
||||
Die Streaming-Antwort folgt dem Server-Sent Events (SSE) Format:
|
||||
Die Streaming-Antwort folgt dem Server-Sent-Events- (SSE-) Format:
|
||||
|
||||
```
|
||||
data: {"blockId":"7b7735b9-19e5-4bd6-818b-46aae2596e9f","chunk":"One"}
|
||||
@@ -688,9 +697,9 @@ if __name__ == '__main__':
|
||||
app.run(debug=True)
|
||||
```
|
||||
|
||||
### Umgebungskonfiguration
|
||||
### Umgebungskonfiguration
|
||||
|
||||
Konfiguriere den Client mit Umgebungsvariablen:
|
||||
Konfigurieren Sie den Client mit Umgebungsvariablen:
|
||||
|
||||
<Tabs items={['Development', 'Production']}>
|
||||
<Tab value="Development">
|
||||
@@ -727,27 +736,27 @@ Konfiguriere den Client mit Umgebungsvariablen:
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## API-Schlüssel erhalten
|
||||
## Ihren API-Schlüssel erhalten
|
||||
|
||||
<Steps>
|
||||
<Step title="Bei Sim anmelden">
|
||||
Navigiere zu [Sim](https://sim.ai) und melde dich bei deinem Konto an.
|
||||
Navigieren Sie zu [Sim](https://sim.ai) und melden Sie sich in Ihrem Konto an.
|
||||
</Step>
|
||||
<Step title="Öffne deinen Workflow">
|
||||
Navigiere zu dem Workflow, den du programmatisch ausführen möchtest.
|
||||
<Step title="Workflow öffnen">
|
||||
Navigieren Sie zu dem Workflow, den Sie programmatisch ausführen möchten.
|
||||
</Step>
|
||||
<Step title="Deploye deinen Workflow">
|
||||
Klicke auf "Deploy", um deinen Workflow zu deployen, falls dies noch nicht geschehen ist.
|
||||
<Step title="Workflow bereitstellen">
|
||||
Klicken Sie auf "Bereitstellen", um Ihren Workflow bereitzustellen, falls dies noch nicht geschehen ist.
|
||||
</Step>
|
||||
<Step title="Erstelle oder wähle einen API-Schlüssel">
|
||||
Wähle während des Deployment-Prozesses einen API-Schlüssel aus oder erstelle einen neuen.
|
||||
<Step title="API-Schlüssel erstellen oder auswählen">
|
||||
Wählen oder erstellen Sie während des Bereitstellungsprozesses einen API-Schlüssel.
|
||||
</Step>
|
||||
<Step title="Kopiere den API-Schlüssel">
|
||||
Kopiere den API-Schlüssel zur Verwendung in deiner Python-Anwendung.
|
||||
<Step title="API-Schlüssel kopieren">
|
||||
Kopieren Sie den API-Schlüssel, um ihn in Ihrer Python-Anwendung zu verwenden.
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
## Anforderungen
|
||||
## Voraussetzungen
|
||||
|
||||
- Python 3.8+
|
||||
- requests >= 2.25.0
|
||||
|
||||
@@ -10,12 +10,20 @@ Stellen Sie Sim auf Ihrer eigenen Infrastruktur mit Docker oder Kubernetes berei
|
||||
|
||||
## Anforderungen
|
||||
|
||||
| Ressource | Minimum | Empfohlen |
|
||||
|----------|---------|-------------|
|
||||
| CPU | 2 Kerne | 4+ Kerne |
|
||||
| RAM | 12 GB | 16+ GB |
|
||||
| Speicher | 20 GB SSD | 50+ GB SSD |
|
||||
| Docker | 20.10+ | Neueste Version |
|
||||
| Ressource | Klein | Standard | Produktion |
|
||||
|----------|-------|----------|------------|
|
||||
| CPU | 2 Kerne | 4 Kerne | 8+ Kerne |
|
||||
| RAM | 12 GB | 16 GB | 32+ GB |
|
||||
| Speicher | 20 GB SSD | 50 GB SSD | 100+ GB SSD |
|
||||
| Docker | 20.10+ | 20.10+ | Neueste Version |
|
||||
|
||||
**Klein**: Entwicklung, Tests, Einzelnutzer (1-5 Nutzer)
|
||||
**Standard**: Teams (5-50 Nutzer), moderate Arbeitslasten
|
||||
**Produktion**: Große Teams (50+ Nutzer), Hochverfügbarkeit, intensive Workflow-Ausführung
|
||||
|
||||
<Callout type="info">
|
||||
Die Ressourcenanforderungen werden durch Workflow-Ausführung (isolated-vm Sandboxing), Dateiverarbeitung (In-Memory-Dokumentenparsing) und Vektoroperationen (pgvector) bestimmt. Arbeitsspeicher ist typischerweise der limitierende Faktor, nicht CPU. Produktionsdaten zeigen, dass die Hauptanwendung durchschnittlich 4-8 GB und bei hoher Last bis zu 12 GB benötigt.
|
||||
</Callout>
|
||||
|
||||
## Schnellstart
|
||||
|
||||
@@ -48,3 +56,10 @@ docker compose -f docker-compose.prod.yml up -d
|
||||
| realtime | 3002 | WebSocket-Server |
|
||||
| db | 5432 | PostgreSQL mit pgvector |
|
||||
| migrations | - | Datenbank-Migrationen (werden einmal ausgeführt) |
|
||||
|
||||
| Komponente | Port | Beschreibung |
|
||||
|-----------|------|-------------|
|
||||
| simstudio | 3000 | Hauptanwendung |
|
||||
| realtime | 3002 | WebSocket-Server |
|
||||
| db | 5432 | PostgreSQL mit pgvector |
|
||||
| migrations | - | Datenbankmigrationen (wird einmal ausgeführt) |
|
||||
|
||||
134
apps/docs/content/docs/de/skills/index.mdx
Normal file
134
apps/docs/content/docs/de/skills/index.mdx
Normal file
@@ -0,0 +1,134 @@
|
||||
---
|
||||
title: Agent-Fähigkeiten
|
||||
---
|
||||
|
||||
import { Callout } from 'fumadocs-ui/components/callout'
|
||||
|
||||
Agent-Fähigkeiten sind wiederverwendbare Anweisungspakete, die Ihren KI-Agenten spezialisierte Funktionen verleihen. Basierend auf dem offenen [Agent Skills](https://agentskills.io)-Format ermöglichen Fähigkeiten Ihnen, Fachwissen, Arbeitsabläufe und Best Practices zu erfassen, die Agenten bei Bedarf laden können.
|
||||
|
||||
## Wie Fähigkeiten funktionieren
|
||||
|
||||
Fähigkeiten nutzen **progressive Offenlegung**, um den Kontext des Agenten schlank zu halten:
|
||||
|
||||
1. **Entdeckung** — Nur Fähigkeitsnamen und Beschreibungen werden in den System-Prompt des Agenten aufgenommen (~50-100 Token jeweils)
|
||||
2. **Aktivierung** — Wenn der Agent entscheidet, dass eine Fähigkeit relevant ist, ruft er das `load_skill`-Tool auf, um die vollständigen Anweisungen in den Kontext zu laden
|
||||
3. **Ausführung** — Der Agent folgt den geladenen Anweisungen, um die Aufgabe zu erledigen
|
||||
|
||||
Das bedeutet, Sie können viele Fähigkeiten an einen Agenten anhängen, ohne dessen Kontextfenster aufzublähen. Der Agent lädt nur das, was er benötigt.
|
||||
|
||||
## Fähigkeiten erstellen
|
||||
|
||||
Gehen Sie zu **Einstellungen** und wählen Sie **Fähigkeiten** im Bereich Tools aus.
|
||||
|
||||

|
||||
|
||||
Klicken Sie auf **Hinzufügen**, um eine neue Fähigkeit mit drei Feldern zu erstellen:
|
||||
|
||||
| Feld | Beschreibung |
|
||||
|-------|-------------|
|
||||
| **Name** | Eine Kennung im Kebab-Case-Format (z. B. `sql-expert`, `code-reviewer`). Maximal 64 Zeichen. |
|
||||
| **Beschreibung** | Eine kurze Erklärung, was die Fähigkeit tut und wann sie verwendet werden soll. Dies liest der Agent, um zu entscheiden, ob er die Fähigkeit aktiviert. Maximal 1024 Zeichen. |
|
||||
| **Inhalt** | Die vollständigen Fähigkeitsanweisungen in Markdown. Diese werden geladen, wenn der Agent die Fähigkeit aktiviert. |
|
||||
|
||||
<Callout type="info">
|
||||
Die Beschreibung ist entscheidend — sie ist das Einzige, was der Agent sieht, bevor er entscheidet, eine Fähigkeit zu laden. Seien Sie spezifisch darüber, wann und warum die Fähigkeit verwendet werden sollte.
|
||||
</Callout>
|
||||
|
||||
### Gute Skill-Inhalte schreiben
|
||||
|
||||
Skill-Inhalte folgen denselben Konventionen wie [SKILL.md-Dateien](https://agentskills.io/specification):
|
||||
|
||||
```markdown
|
||||
# SQL Expert
|
||||
|
||||
## When to use this skill
|
||||
Use when the user asks you to write, optimize, or debug SQL queries.
|
||||
|
||||
## Instructions
|
||||
1. Always ask which database engine (PostgreSQL, MySQL, SQLite)
|
||||
2. Use CTEs over subqueries for readability
|
||||
3. Add index recommendations when relevant
|
||||
4. Explain query plans for optimization requests
|
||||
|
||||
## Common Patterns
|
||||
...
|
||||
```
|
||||
|
||||
**Empfohlene Struktur:**
|
||||
- **Wann verwenden** — Spezifische Auslöser und Szenarien
|
||||
- **Anweisungen** — Schritt-für-Schritt-Anleitung mit nummerierten Listen
|
||||
- **Beispiele** — Eingabe-/Ausgabe-Beispiele, die das erwartete Verhalten zeigen
|
||||
- **Häufige Muster** — Wiederverwendbare Ansätze für häufige Aufgaben
|
||||
- **Sonderfälle** — Fallstricke und besondere Überlegungen
|
||||
|
||||
Halten Sie Skills fokussiert und unter 500 Zeilen. Wenn ein Skill zu groß wird, teilen Sie ihn in mehrere spezialisierte Skills auf.
|
||||
|
||||
## Skills zu einem Agenten hinzufügen
|
||||
|
||||
Öffnen Sie einen beliebigen **Agent**-Block und finden Sie das **Skills**-Dropdown unterhalb des Tool-Bereichs. Wählen Sie die Skills aus, auf die der Agent Zugriff haben soll.
|
||||
|
||||

|
||||
|
||||
Ausgewählte Skills erscheinen als Karten, die Sie anklicken können, um sie zu bearbeiten oder zu entfernen.
|
||||
|
||||
### Was zur Laufzeit passiert
|
||||
|
||||
Wenn der Workflow ausgeführt wird:
|
||||
|
||||
1. Der System-Prompt des Agenten enthält einen `<available_skills>`-Abschnitt, der Name und Beschreibung jedes Skills auflistet
|
||||
2. Ein `load_skill`-Tool wird automatisch zu den verfügbaren Tools des Agenten hinzugefügt
|
||||
3. Wenn der Agent feststellt, dass ein Skill für die aktuelle Aufgabe relevant ist, ruft er `load_skill` mit dem Skill-Namen auf
|
||||
4. Der vollständige Skill-Inhalt wird als Tool-Antwort zurückgegeben und gibt dem Agenten detaillierte Anweisungen
|
||||
|
||||
Dies funktioniert über alle unterstützten LLM-Anbieter hinweg — das `load_skill`-Tool verwendet standardmäßiges Tool-Calling, sodass keine anbieterspezifische Konfiguration erforderlich ist.
|
||||
|
||||
## Häufige Anwendungsfälle
|
||||
|
||||
Skills sind besonders wertvoll, wenn Agenten spezialisiertes Wissen oder mehrstufige Workflows benötigen:
|
||||
|
||||
**Domain-Expertise**
|
||||
- `api-integration-expert` — Best Practices für den Aufruf spezifischer APIs (Authentifizierung, Rate Limiting, Fehlerbehandlung)
|
||||
- `data-transformation` — ETL-Muster, Datenbereinigung und Validierungsregeln
|
||||
- `code-reviewer` — Code-Review-Richtlinien spezifisch für die Standards Ihres Teams
|
||||
|
||||
**Workflow-Vorlagen**
|
||||
- `bug-investigation` — Schritt-für-Schritt-Debugging-Methodik (reproduzieren → isolieren → testen → beheben)
|
||||
- `feature-implementation` — Entwicklungs-Workflow von Anforderungen bis zur Bereitstellung
|
||||
- `document-generator` — Vorlagen und Formatierungsregeln für technische Dokumentation
|
||||
|
||||
**Unternehmensspezifisches Wissen**
|
||||
- `our-architecture` — Systemarchitekturdiagramme, Service-Abhängigkeiten und Bereitstellungsprozesse
|
||||
- `style-guide` — Markenrichtlinien, Schreibstil, UI/UX-Muster
|
||||
- `customer-onboarding` — Standardverfahren und häufige Kundenfragen
|
||||
|
||||
**Wann Skills vs. Agentenanweisungen verwendet werden sollten:**
|
||||
- Verwenden Sie **Skills** für Wissen, das über mehrere Workflows hinweg gilt oder sich häufig ändert
|
||||
- Verwenden Sie **Agentenanweisungen** für aufgabenspezifischen Kontext, der für einen einzelnen Agenten einzigartig ist
|
||||
|
||||
## Best Practices
|
||||
|
||||
**Effektive Beschreibungen schreiben**
|
||||
- **Seien Sie spezifisch und keyword-reich** — Statt "Hilft bei SQL", schreiben Sie "Optimierte SQL-Abfragen für PostgreSQL, MySQL und SQLite schreiben, einschließlich Index-Empfehlungen und Abfrageplan-Analyse"
|
||||
- **Aktivierungstrigger einbeziehen** — Erwähnen Sie spezifische Wörter oder Phrasen, die den Skill auslösen sollten (z. B. "Verwenden, wenn der Benutzer PDFs, Formulare oder Dokumentenextraktion erwähnt")
|
||||
- **Unter 200 Wörtern halten** — Agenten scannen Beschreibungen schnell; jedes Wort zählt
|
||||
|
||||
**Skill-Umfang und Organisation**
|
||||
- **Ein Skill pro Domäne** — Ein fokussierter `sql-expert`-Skill funktioniert besser als ein breiter `database-everything`-Skill
|
||||
- **Auf 5-10 Skills pro Agent begrenzen** — Mehr Skills = mehr Entscheidungsaufwand; klein anfangen und bei Bedarf erweitern
|
||||
- **Große Skills aufteilen** — Wenn ein Skill 500 Zeilen überschreitet, in fokussierte Sub-Skills aufteilen
|
||||
|
||||
**Inhaltsstruktur**
|
||||
- **Markdown-Formatierung verwenden** — Überschriften, Listen und Code-Blöcke helfen Agenten beim Parsen und Befolgen von Anweisungen
|
||||
- **Beispiele bereitstellen** — Input/Output-Paare zeigen, damit Agenten das erwartete Verhalten verstehen
|
||||
- **Explizit über Sonderfälle sein** — Gehen Sie nicht davon aus, dass Agenten spezielle Behandlung ableiten werden
|
||||
|
||||
**Testen und Iteration**
|
||||
- **Aktivierung testen** — Führen Sie Ihren Workflow aus und überprüfen Sie, ob der Agent die Skill lädt, wenn erwartet
|
||||
- **Auf Fehlalarme prüfen** — Stellen Sie sicher, dass Skills nicht aktiviert werden, wenn sie es nicht sollten
|
||||
- **Beschreibungen verfeinern** — Wenn eine Skill nicht geladen wird, wenn sie benötigt wird, fügen Sie der Beschreibung weitere Schlüsselwörter hinzu
|
||||
|
||||
## Mehr erfahren
|
||||
|
||||
- [Agent Skills Spezifikation](https://agentskills.io) — Das offene Format für portable Agent-Skills
|
||||
- [Beispiel-Skills](https://github.com/anthropics/skills) — Community-Skill-Beispiele durchsuchen
|
||||
- [Best Practices](https://agentskills.io/what-are-skills) — Effektive Skills schreiben
|
||||
207
apps/docs/content/docs/de/tools/a2a.mdx
Normal file
207
apps/docs/content/docs/de/tools/a2a.mdx
Normal file
@@ -0,0 +1,207 @@
|
||||
---
|
||||
title: A2A
|
||||
description: Interagiere mit externen A2A-kompatiblen Agenten
|
||||
---
|
||||
|
||||
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||
|
||||
<BlockInfoCard
|
||||
type="a2a"
|
||||
color="#4151B5"
|
||||
/>
|
||||
|
||||
{/* MANUAL-CONTENT-START:intro */}
|
||||
Das A2A-Protokoll (Agent-to-Agent) ermöglicht es Sim, mit externen KI-Agenten und Systemen zu interagieren, die A2A-kompatible APIs implementieren. Mit A2A kannst du Sims Automatisierungen und Workflows mit Remote-Agenten verbinden – wie LLM-gestützten Bots, Microservices und anderen KI-basierten Tools – unter Verwendung eines standardisierten Nachrichtenformats.
|
||||
|
||||
Mit den A2A-Tools in Sim kannst du:
|
||||
|
||||
- **Nachrichten an externe Agenten senden**: Kommuniziere direkt mit Remote-Agenten und übermittle Prompts, Befehle oder Daten.
|
||||
- **Antworten empfangen und streamen**: Erhalte strukturierte Antworten, Artefakte oder Echtzeit-Updates vom Agenten, während die Aufgabe fortschreitet.
|
||||
- **Gespräche oder Aufgaben fortsetzen**: Führe mehrstufige Konversationen oder Workflows fort, indem du auf Aufgaben- und Kontext-IDs verweist.
|
||||
- **Drittanbieter-KI und Automatisierung integrieren**: Nutze externe A2A-kompatible Dienste als Teil deiner Sim-Workflows.
|
||||
|
||||
Diese Funktionen ermöglichen es dir, fortgeschrittene Workflows zu erstellen, die Sims native Fähigkeiten mit der Intelligenz und Automatisierung externer KIs oder benutzerdefinierter Agenten kombinieren. Um A2A-Integrationen zu nutzen, benötigst du die Endpunkt-URL des externen Agenten und, falls erforderlich, einen API-Schlüssel oder Zugangsdaten.
|
||||
{/* MANUAL-CONTENT-END */}
|
||||
|
||||
## Nutzungsanleitung
|
||||
|
||||
Verwende das A2A-Protokoll (Agent-to-Agent), um mit externen KI-Agenten zu interagieren.
|
||||
|
||||
## Tools
|
||||
|
||||
### `a2a_send_message`
|
||||
|
||||
Sende eine Nachricht an einen externen A2A-kompatiblen Agenten.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `agentUrl` | string | Ja | Die A2A-Agenten-Endpunkt-URL |
|
||||
| `message` | string | Ja | Nachricht, die an den Agenten gesendet werden soll |
|
||||
| `taskId` | string | Nein | Aufgaben-ID zum Fortsetzen einer bestehenden Aufgabe |
|
||||
| `contextId` | string | Nein | Kontext-ID für Gesprächskontinuität |
|
||||
| `data` | string | Nein | Strukturierte Daten, die mit der Nachricht einbezogen werden sollen \(JSON-String\) |
|
||||
| `files` | array | Nein | Dateien, die mit der Nachricht einbezogen werden sollen |
|
||||
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `content` | string | Textantwort-Inhalt vom Agenten |
|
||||
| `taskId` | string | Eindeutige Aufgabenkennung |
|
||||
| `contextId` | string | Gruppiert zusammenhängende Aufgaben/Nachrichten |
|
||||
| `state` | string | Aktueller Lebenszyklus-Status \(working, completed, failed, canceled, rejected, input_required, auth_required\) |
|
||||
| `artifacts` | array | Ausgabe-Artefakte der Aufgabe |
|
||||
| `history` | array | Gesprächsverlauf \(Message-Array\) |
|
||||
|
||||
### `a2a_get_task`
|
||||
|
||||
Abfrage des Status einer bestehenden A2A-Aufgabe.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `agentUrl` | string | Ja | Die A2A-Agenten-Endpunkt-URL |
|
||||
| `taskId` | string | Ja | Abzufragende Aufgaben-ID |
|
||||
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung |
|
||||
| `historyLength` | number | Nein | Anzahl der einzubeziehenden Verlaufsnachrichten |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `taskId` | string | Eindeutige Aufgabenkennung |
|
||||
| `contextId` | string | Gruppiert zusammenhängende Aufgaben/Nachrichten |
|
||||
| `state` | string | Aktueller Lebenszyklus-Status \(working, completed, failed, canceled, rejected, input_required, auth_required\) |
|
||||
| `artifacts` | array | Ausgabe-Artefakte der Aufgabe |
|
||||
| `history` | array | Gesprächsverlauf \(Message-Array\) |
|
||||
|
||||
### `a2a_cancel_task`
|
||||
|
||||
Abbrechen einer laufenden A2A-Aufgabe.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `agentUrl` | string | Ja | Die A2A-Agenten-Endpunkt-URL |
|
||||
| `taskId` | string | Ja | Abzubrechende Aufgaben-ID |
|
||||
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `cancelled` | boolean | Ob die Stornierung erfolgreich war |
|
||||
| `state` | string | Aktueller Lebenszyklus-Status \(working, completed, failed, canceled, rejected, input_required, auth_required\) |
|
||||
|
||||
### `a2a_get_agent_card`
|
||||
|
||||
Ruft die Agent Card (Discovery-Dokument) für einen A2A-Agenten ab.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `agentUrl` | string | Ja | Die Endpunkt-URL des A2A-Agenten |
|
||||
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung \(falls erforderlich\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `name` | string | Anzeigename des Agenten |
|
||||
| `description` | string | Zweck/Fähigkeiten des Agenten |
|
||||
| `url` | string | Service-Endpunkt-URL |
|
||||
| `provider` | object | Details zur Ersteller-Organisation |
|
||||
| `capabilities` | object | Feature-Support-Matrix |
|
||||
| `skills` | array | Verfügbare Operationen |
|
||||
| `version` | string | Vom Agenten unterstützte A2A-Protokollversion |
|
||||
| `defaultInputModes` | array | Standard-Eingabe-Inhaltstypen, die vom Agenten akzeptiert werden |
|
||||
| `defaultOutputModes` | array | Standard-Ausgabe-Inhaltstypen, die vom Agenten produziert werden |
|
||||
|
||||
### `a2a_resubscribe`
|
||||
|
||||
Stellt die Verbindung zu einem laufenden A2A-Task-Stream nach einer Verbindungsunterbrechung wieder her.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `agentUrl` | string | Ja | Die Endpunkt-URL des A2A-Agenten |
|
||||
| `taskId` | string | Ja | Task-ID, zu der erneut abonniert werden soll |
|
||||
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `taskId` | string | Eindeutige Aufgabenkennung |
|
||||
| `contextId` | string | Gruppiert zusammenhängende Aufgaben/Nachrichten |
|
||||
| `state` | string | Aktueller Lebenszyklusstatus \(working, completed, failed, canceled, rejected, input_required, auth_required\) |
|
||||
| `isRunning` | boolean | Ob die Aufgabe noch läuft |
|
||||
| `artifacts` | array | Ausgabeartefakte der Aufgabe |
|
||||
| `history` | array | Gesprächsverlauf \(Message-Array\) |
|
||||
|
||||
### `a2a_set_push_notification`
|
||||
|
||||
Konfigurieren Sie einen Webhook, um Benachrichtigungen über Aufgabenaktualisierungen zu erhalten.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `agentUrl` | string | Ja | Die A2A-Agent-Endpunkt-URL |
|
||||
| `taskId` | string | Ja | Aufgaben-ID, für die Benachrichtigungen konfiguriert werden sollen |
|
||||
| `webhookUrl` | string | Ja | HTTPS-Webhook-URL zum Empfang von Benachrichtigungen |
|
||||
| `token` | string | Nein | Token zur Webhook-Validierung |
|
||||
| `apiKey` | string | Nein | API-Schlüssel zur Authentifizierung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `url` | string | HTTPS-Webhook-URL für Benachrichtigungen |
|
||||
| `token` | string | Authentifizierungstoken zur Webhook-Validierung |
|
||||
| `success` | boolean | Ob der Vorgang erfolgreich war |
|
||||
|
||||
### `a2a_get_push_notification`
|
||||
|
||||
Rufen Sie die Push-Benachrichtigungs-Webhook-Konfiguration für eine Aufgabe ab.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `agentUrl` | string | Ja | Die A2A-Agent-Endpunkt-URL |
|
||||
| `taskId` | string | Ja | Aufgaben-ID, für die die Benachrichtigungskonfiguration abgerufen werden soll |
|
||||
| `apiKey` | string | Nein | API-Schlüssel zur Authentifizierung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `token` | string | Authentifizierungstoken für Webhook-Validierung |
|
||||
| `exists` | boolean | Ob die Ressource existiert |
|
||||
|
||||
### `a2a_delete_push_notification`
|
||||
|
||||
Löscht die Push-Benachrichtigungs-Webhook-Konfiguration für eine Aufgabe.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `agentUrl` | string | Ja | Die A2A-Agent-Endpunkt-URL |
|
||||
| `taskId` | string | Ja | Aufgaben-ID, für die die Benachrichtigungskonfiguration gelöscht werden soll |
|
||||
| `pushNotificationConfigId` | string | Nein | Push-Benachrichtigungskonfigurations-ID zum Löschen \(optional - Server kann aus taskId ableiten\) |
|
||||
| `apiKey` | string | Nein | API-Schlüssel für Authentifizierung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `success` | boolean | Ob die Operation erfolgreich war |
|
||||
@@ -193,8 +193,3 @@ Erhalte eine Liste defekter Backlinks, die auf eine Zieldomäne oder URL verweis
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `brokenBacklinks` | array | Liste defekter Backlinks |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `ahrefs`
|
||||
|
||||
@@ -123,8 +123,3 @@ Mehrere vorhandene Datensätze in einer Airtable-Tabelle aktualisieren
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `records` | json | Array der aktualisierten Airtable-Datensätze |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `airtable`
|
||||
|
||||
63
apps/docs/content/docs/de/tools/airweave.mdx
Normal file
63
apps/docs/content/docs/de/tools/airweave.mdx
Normal file
@@ -0,0 +1,63 @@
|
||||
---
|
||||
title: Airweave
|
||||
description: Durchsuchen Sie Ihre synchronisierten Datensammlungen
|
||||
---
|
||||
|
||||
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||
|
||||
<BlockInfoCard
|
||||
type="airweave"
|
||||
color="#6366F1"
|
||||
/>
|
||||
|
||||
{/* MANUAL-CONTENT-START:intro */}
|
||||
[Airweave](https://airweave.ai/) ist eine KI-gestützte semantische Suchplattform, die Ihnen hilft, Wissen über alle Ihre synchronisierten Datenquellen hinweg zu entdecken und abzurufen. Airweave wurde für moderne Teams entwickelt und ermöglicht schnelle, relevante Suchergebnisse mithilfe neuraler, hybrider oder schlüsselwortbasierter Strategien, die auf Ihre Bedürfnisse zugeschnitten sind.
|
||||
|
||||
Mit Airweave können Sie:
|
||||
|
||||
- **Intelligenter suchen**: Verwenden Sie natürlichsprachliche Abfragen, um Informationen aufzudecken, die in Ihren verbundenen Tools und Datenbanken gespeichert sind
|
||||
- **Ihre Daten vereinheitlichen**: Greifen Sie nahtlos auf Inhalte aus Quellen wie Code, Dokumenten, Chat, E-Mails, Cloud-Dateien und mehr zu
|
||||
- **Abruf anpassen**: Wählen Sie zwischen hybriden (semantisch + Schlüsselwort), neuralen oder Schlüsselwort-Suchstrategien für optimale Ergebnisse
|
||||
- **Recall steigern**: Erweitern Sie Suchanfragen mit KI, um umfassendere Antworten zu finden
|
||||
- **Ergebnisse mit KI neu ordnen**: Priorisieren Sie die relevantesten Antworten mit leistungsstarken Sprachmodellen
|
||||
- **Sofortige Antworten erhalten**: Generieren Sie klare, KI-gestützte Antworten, die aus Ihren Daten synthetisiert werden
|
||||
|
||||
In Sim ermöglicht die Airweave-Integration Ihren Agenten, alle Daten Ihrer Organisation über ein einziges Tool zu durchsuchen, zusammenzufassen und Erkenntnisse zu extrahieren. Nutzen Sie Airweave, um umfassenden, kontextbezogenen Wissensabruf in Ihren Workflows zu ermöglichen – sei es beim Beantworten von Fragen, Erstellen von Zusammenfassungen oder Unterstützen dynamischer Entscheidungsfindung.
|
||||
{/* MANUAL-CONTENT-END */}
|
||||
|
||||
## Nutzungsanweisungen
|
||||
|
||||
Durchsuchen Sie Ihre synchronisierten Datenquellen mit Airweave. Unterstützt semantische Suche mit hybriden, neuralen oder schlüsselwortbasierten Abrufstrategien. Optional können KI-gestützte Antworten aus Suchergebnissen generiert werden.
|
||||
|
||||
## Tools
|
||||
|
||||
### `airweave_search`
|
||||
|
||||
Durchsuchen Sie Ihre synchronisierten Datensammlungen mit Airweave. Unterstützt semantische Suche mit hybriden, neuralen oder schlüsselwortbasierten Abrufstrategien. Optional können KI-gestützte Antworten aus Suchergebnissen generiert werden.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Airweave API-Schlüssel für die Authentifizierung |
|
||||
| `collectionId` | string | Ja | Die lesbare ID der zu durchsuchenden Sammlung |
|
||||
| `query` | string | Ja | Der Suchanfragetext |
|
||||
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Ergebnisse \(Standard: 100\) |
|
||||
| `retrievalStrategy` | string | Nein | Abrufstrategie: hybrid \(Standard\), neural oder keyword |
|
||||
| `expandQuery` | boolean | Nein | Abfragevariationen generieren, um die Trefferquote zu verbessern |
|
||||
| `rerank` | boolean | Nein | Ergebnisse für verbesserte Relevanz mithilfe von LLM neu ordnen |
|
||||
| `generateAnswer` | boolean | Nein | Eine natürlichsprachliche Antwort auf die Abfrage generieren |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `results` | array | Suchergebnisse mit Inhalten, Scores und Metadaten aus Ihren synchronisierten Daten |
|
||||
| ↳ `entity_id` | string | Eindeutige Kennung für die Suchergebnisentität |
|
||||
| ↳ `source_name` | string | Name der Datenquelle \(z. B. "GitHub", "Slack"\) |
|
||||
| ↳ `md_content` | string | Markdown-formatierter Inhalt des Ergebnisses |
|
||||
| ↳ `score` | number | Relevanz-Score aus der Suche |
|
||||
| ↳ `metadata` | object | Zusätzliche Metadaten, die mit dem Ergebnis verknüpft sind |
|
||||
| ↳ `breadcrumbs` | array | Navigationspfad zum Ergebnis innerhalb seiner Quelle |
|
||||
| ↳ `url` | string | URL zum Originalinhalt |
|
||||
| `completion` | string | KI-generierte Antwort auf die Abfrage \(wenn generateAnswer aktiviert ist\) |
|
||||
@@ -81,8 +81,3 @@ Führe einen APIFY-Aktor asynchron mit Polling für lang laufende Aufgaben aus
|
||||
| `status` | string | Laufstatus \(SUCCEEDED, FAILED, usw.\) |
|
||||
| `datasetId` | string | Dataset-ID mit Ergebnissen |
|
||||
| `items` | array | Dataset-Elemente \(falls abgeschlossen\) |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `apify`
|
||||
|
||||
@@ -567,8 +567,3 @@ Liste des Teams abrufen
|
||||
| --------- | ---- | ----------- |
|
||||
| `email_accounts` | json | Array von Team-E-Mail-Konten, die in Apollo verknüpft sind |
|
||||
| `metadata` | json | Metadaten einschließlich der Gesamtanzahl von E-Mail-Konten |
|
||||
|
||||
## Notizen
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `apollo`
|
||||
|
||||
@@ -82,8 +82,3 @@ Suche nach Artikeln eines bestimmten Autors auf ArXiv.
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `authorPapers` | json | Array von Publikationen, die vom angegebenen Autor verfasst wurden |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `arxiv`
|
||||
|
||||
@@ -163,3 +163,16 @@ Einen Kommentar (Story) zu einer Asana-Aufgabe hinzufügen
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `asana`
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
| `ts` | string | Zeitstempel der Antwort |
|
||||
| `gid` | string | Global eindeutige Kennung des Kommentars |
|
||||
| `text` | string | Textinhalt des Kommentars |
|
||||
| `created_at` | string | Erstellungszeitstempel des Kommentars |
|
||||
| `created_by` | object | Details zum Kommentarautor |
|
||||
| ↳ `gid` | string | Autor-GID |
|
||||
| ↳ `name` | string | Name des Autors |
|
||||
|
||||
@@ -53,8 +53,3 @@ Führt eine Browser-Automatisierungsaufgabe mit BrowserUse aus
|
||||
| `success` | boolean | Status der Aufgabenfertigstellung |
|
||||
| `output` | json | Ausgabedaten der Aufgabe |
|
||||
| `steps` | json | Ausgeführte Schritte |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `browser_use`
|
||||
|
||||
785
apps/docs/content/docs/de/tools/calcom.mdx
Normal file
785
apps/docs/content/docs/de/tools/calcom.mdx
Normal file
@@ -0,0 +1,785 @@
|
||||
---
|
||||
title: Cal Com
|
||||
description: Verwalten Sie Cal.com-Buchungen, Veranstaltungstypen, Zeitpläne und
|
||||
Verfügbarkeiten
|
||||
---
|
||||
|
||||
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||
|
||||
<BlockInfoCard
|
||||
type="calcom"
|
||||
color="#FFFFFE"
|
||||
/>
|
||||
|
||||
{/* MANUAL-CONTENT-START:intro */}
|
||||
[Cal.com](https://cal.com/) ist eine flexible und quelloffene Planungsplattform, die es einfach macht, Termine, Buchungen, Veranstaltungstypen und Teamverfügbarkeiten zu verwalten.
|
||||
|
||||
Mit Cal.com können Sie:
|
||||
|
||||
- **Planung automatisieren**: Ermöglichen Sie Nutzern, Ihre verfügbaren Zeitfenster einzusehen und Meetings automatisch zu buchen, ohne E-Mail-Pingpong.
|
||||
- **Veranstaltungen verwalten**: Erstellen und passen Sie Veranstaltungstypen, Dauern und Regeln für Einzel- oder Gruppenmeetings an.
|
||||
- **Kalender integrieren**: Verbinden Sie sich nahtlos mit Google, Outlook, Apple oder anderen Kalenderanbietern, um Doppelbuchungen zu vermeiden.
|
||||
- **Teilnehmer und Gäste verwalten**: Erfassen Sie Teilnehmerinformationen, verwalten Sie Gäste und versenden Sie Einladungen oder Erinnerungen.
|
||||
- **Verfügbarkeit steuern**: Definieren Sie individuelle Arbeitszeiten, Pufferzeiten und Storno-/Umbuchungsregeln.
|
||||
- **Workflows automatisieren**: Lösen Sie benutzerdefinierte Aktionen über Webhooks aus, wenn eine Buchung erstellt, storniert oder umgebucht wird.
|
||||
|
||||
In Sim ermöglicht die Cal.com-Integration Ihren Agenten, Meetings zu buchen, Verfügbarkeiten zu prüfen, Veranstaltungstypen zu verwalten und Planungsaufgaben programmatisch zu automatisieren. Dies hilft Agenten, Meetings zu koordinieren, Buchungen im Namen von Nutzern zu versenden, Zeitpläne zu prüfen oder auf Buchungsereignisse zu reagieren – alles ohne manuelle Eingriffe. Durch die Verbindung von Sim mit Cal.com erschließen Sie hochautomatisierte und intelligente Planungs-Workflows, die sich nahtlos in Ihre umfassenderen Automatisierungsanforderungen integrieren lassen.
|
||||
{/* MANUAL-CONTENT-END */}
|
||||
|
||||
## Nutzungsanleitung
|
||||
|
||||
Integrieren Sie Cal.com in Ihren Workflow. Erstellen und verwalten Sie Buchungen, Veranstaltungstypen, Zeitpläne und prüfen Sie Verfügbarkeitsfenster. Unterstützt das Erstellen, Auflisten, Umbuchen und Stornieren von Buchungen sowie die Verwaltung von Veranstaltungstypen und Zeitplänen. Kann auch Workflows basierend auf Cal.com-Webhook-Ereignissen auslösen (Buchung erstellt, storniert, umgebucht). Verbinden Sie Ihr Cal.com-Konto über OAuth.
|
||||
|
||||
## Tools
|
||||
|
||||
### `calcom_create_booking`
|
||||
|
||||
Eine neue Buchung auf Cal.com erstellen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `eventTypeId` | number | Ja | Die ID des zu buchenden Ereignistyps |
|
||||
| `start` | string | Ja | Startzeit im UTC ISO 8601-Format \(z. B. 2024-01-15T09:00:00Z\) |
|
||||
| `attendee` | object | Ja | Teilnehmerinformationsobjekt mit Name, E-Mail, Zeitzone und optionaler Telefonnummer \(zusammengestellt aus einzelnen Teilnehmerfeldern\) |
|
||||
| `guests` | array | Nein | Array von Gast-E-Mail-Adressen |
|
||||
| `items` | string | Nein | Gast-E-Mail-Adresse |
|
||||
| `lengthInMinutes` | number | Nein | Dauer der Buchung in Minuten \(überschreibt die Standardeinstellung des Ereignistyps\) |
|
||||
| `metadata` | object | Nein | Benutzerdefinierte Metadaten, die an die Buchung angehängt werden |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Details der erstellten Buchung |
|
||||
| ↳ `eventType` | object | Details des Ereignistyps |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `slug` | string | Ereignistyp-Slug |
|
||||
| ↳ `attendees` | array | Liste der Teilnehmer |
|
||||
| ↳ `name` | string | Name des Teilnehmers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
|
||||
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
|
||||
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
|
||||
| ↳ `hosts` | array | Liste der Gastgeber |
|
||||
| ↳ `id` | number | Benutzer-ID des Gastgebers |
|
||||
| ↳ `name` | string | Anzeigename des Gastgebers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
|
||||
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
|
||||
| ↳ `id` | number | Numerische Buchungs-ID |
|
||||
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
|
||||
| ↳ `title` | string | Titel der Buchung |
|
||||
| ↳ `status` | string | Buchungsstatus \(z. B. akzeptiert, ausstehend, storniert\) |
|
||||
| ↳ `start` | string | Startzeit im ISO 8601-Format |
|
||||
| ↳ `end` | string | Endzeit im ISO 8601-Format |
|
||||
| ↳ `duration` | number | Dauer in Minuten |
|
||||
| ↳ `eventTypeId` | number | Ereignistyp-ID |
|
||||
| ↳ `meetingUrl` | string | URL zum Beitritt zum Meeting |
|
||||
| ↳ `location` | string | Ort der Buchung |
|
||||
| ↳ `absentHost` | boolean | Ob der Gastgeber abwesend war |
|
||||
| ↳ `guests` | array | Gast-E-Mail-Adressen |
|
||||
| ↳ `bookingFieldsResponses` | json | Benutzerdefinierte Buchungsfeldantworten \(dynamische Schlüssel basierend auf der Ereignistyp-Konfiguration\) |
|
||||
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die an die Buchung angehängt sind \(dynamische Schlüssel-Wert-Paare\) |
|
||||
| ↳ `icsUid` | string | ICS-Kalender-UID |
|
||||
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
|
||||
|
||||
### `calcom_get_booking`
|
||||
|
||||
Details einer bestimmten Buchung anhand ihrer UID abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `bookingUid` | string | Ja | Eindeutige Kennung \(UID\) der Buchung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Buchungsdetails |
|
||||
| ↳ `eventType` | object | Details zum Ereignistyp |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `slug` | string | Ereignistyp-Slug |
|
||||
| ↳ `attendees` | array | Liste der Teilnehmer |
|
||||
| ↳ `name` | string | Name des Teilnehmers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
|
||||
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
|
||||
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
|
||||
| ↳ `hosts` | array | Liste der Gastgeber |
|
||||
| ↳ `id` | number | Benutzer-ID des Gastgebers |
|
||||
| ↳ `name` | string | Anzeigename des Gastgebers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
|
||||
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
|
||||
| ↳ `id` | number | Numerische Buchungs-ID |
|
||||
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
|
||||
| ↳ `title` | string | Titel der Buchung |
|
||||
| ↳ `description` | string | Beschreibung der Buchung |
|
||||
| ↳ `status` | string | Buchungsstatus \(z. B. akzeptiert, ausstehend, storniert\) |
|
||||
| ↳ `start` | string | Startzeit im ISO-8601-Format |
|
||||
| ↳ `end` | string | Endzeit im ISO-8601-Format |
|
||||
| ↳ `duration` | number | Dauer in Minuten |
|
||||
| ↳ `eventTypeId` | number | Ereignistyp-ID |
|
||||
| ↳ `meetingUrl` | string | URL zum Beitritt zum Meeting |
|
||||
| ↳ `location` | string | Ort der Buchung |
|
||||
| ↳ `absentHost` | boolean | Ob der Gastgeber abwesend war |
|
||||
| ↳ `guests` | array | E-Mail-Adressen der Gäste |
|
||||
| ↳ `bookingFieldsResponses` | json | Benutzerdefinierte Buchungsfeld-Antworten \(dynamische Schlüssel basierend auf der Ereignistyp-Konfiguration\) |
|
||||
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die der Buchung angehängt sind \(dynamische Schlüssel-Wert-Paare\) |
|
||||
| ↳ `rating` | number | Buchungsbewertung |
|
||||
| ↳ `icsUid` | string | ICS-Kalender-UID |
|
||||
| ↳ `cancellationReason` | string | Grund für die Stornierung, falls storniert |
|
||||
| ↳ `reschedulingReason` | string | Grund für die Umbuchung, falls umgebucht |
|
||||
| ↳ `rescheduledFromUid` | string | Ursprüngliche Buchungs-UID, falls diese Buchung umgebucht wurde |
|
||||
| ↳ `rescheduledToUid` | string | Neue Buchungs-UID nach Umbuchung |
|
||||
| ↳ `cancelledByEmail` | string | E-Mail der Person, die die Buchung storniert hat |
|
||||
| ↳ `rescheduledByEmail` | string | E-Mail der Person, die die Buchung umgebucht hat |
|
||||
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
|
||||
| ↳ `updatedAt` | string | Zeitpunkt der letzten Aktualisierung der Buchung |
|
||||
|
||||
### `calcom_list_bookings`
|
||||
|
||||
Alle Buchungen mit optionalem Statusfilter auflisten
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `status` | string | Nein | Buchungen nach Status filtern: upcoming, recurring, past, cancelled oder unconfirmed |
|
||||
| `take` | number | Nein | Anzahl der zurückzugebenden Buchungen \(Paginierungslimit\) |
|
||||
| `skip` | number | Nein | Anzahl der zu überspringenden Buchungen \(Paginierungsoffset\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | array | Array von Buchungen |
|
||||
| ↳ `eventType` | object | Details zum Ereignistyp |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `slug` | string | Ereignistyp-Slug |
|
||||
| ↳ `attendees` | array | Liste der Teilnehmer |
|
||||
| ↳ `name` | string | Name des Teilnehmers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
|
||||
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
|
||||
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
|
||||
| ↳ `hosts` | array | Liste der Gastgeber |
|
||||
| ↳ `id` | number | Benutzer-ID des Gastgebers |
|
||||
| ↳ `name` | string | Anzeigename des Gastgebers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
|
||||
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
|
||||
| ↳ `id` | number | Numerische Buchungs-ID |
|
||||
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
|
||||
| ↳ `title` | string | Titel der Buchung |
|
||||
| ↳ `description` | string | Beschreibung der Buchung |
|
||||
| ↳ `status` | string | Buchungsstatus \(z. B. accepted, pending, cancelled\) |
|
||||
| ↳ `start` | string | Startzeit im ISO-8601-Format |
|
||||
| ↳ `end` | string | Endzeit im ISO-8601-Format |
|
||||
| ↳ `duration` | number | Dauer in Minuten |
|
||||
| ↳ `eventTypeId` | number | Ereignistyp-ID |
|
||||
| ↳ `meetingUrl` | string | URL zum Beitritt zum Meeting |
|
||||
| ↳ `location` | string | Ort der Buchung |
|
||||
| ↳ `absentHost` | boolean | Ob der Gastgeber abwesend war |
|
||||
| ↳ `guests` | array | E-Mail-Adressen der Gäste |
|
||||
| ↳ `bookingFieldsResponses` | json | Antworten auf benutzerdefinierte Buchungsfelder \(dynamische Schlüssel basierend auf der Ereignistyp-Konfiguration\) |
|
||||
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die der Buchung zugeordnet sind \(dynamische Schlüssel-Wert-Paare\) |
|
||||
| ↳ `rating` | number | Buchungsbewertung |
|
||||
| ↳ `icsUid` | string | ICS-Kalender-UID |
|
||||
| ↳ `cancellationReason` | string | Grund für die Stornierung, falls storniert |
|
||||
| ↳ `cancelledByEmail` | string | E-Mail der Person, die die Buchung storniert hat |
|
||||
| ↳ `reschedulingReason` | string | Grund für die Umbuchung, falls umgebucht |
|
||||
| ↳ `rescheduledByEmail` | string | E-Mail der Person, die die Buchung umgebucht hat |
|
||||
| ↳ `rescheduledFromUid` | string | Ursprüngliche Buchungs-UID, falls diese Buchung umgebucht wurde |
|
||||
| ↳ `rescheduledToUid` | string | Neue Buchungs-UID nach Umbuchung |
|
||||
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
|
||||
| ↳ `updatedAt` | string | Zeitpunkt der letzten Aktualisierung der Buchung |
|
||||
| `pagination` | object | Paginierungs-Metadaten |
|
||||
| ↳ `totalItems` | number | Gesamtanzahl der Elemente |
|
||||
| ↳ `remainingItems` | number | Verbleibende Elemente nach der aktuellen Seite |
|
||||
| ↳ `returnedItems` | number | Anzahl der in dieser Antwort zurückgegebenen Elemente |
|
||||
| ↳ `itemsPerPage` | number | Elemente pro Seite |
|
||||
| ↳ `currentPage` | number | Aktuelle Seitennummer |
|
||||
| ↳ `totalPages` | number | Gesamtanzahl der Seiten |
|
||||
| ↳ `hasNextPage` | boolean | Ob es eine nächste Seite gibt |
|
||||
| ↳ `hasPreviousPage` | boolean | Ob es eine vorherige Seite gibt |
|
||||
|
||||
### `calcom_cancel_booking`
|
||||
|
||||
Eine bestehende Buchung stornieren
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `bookingUid` | string | Ja | Eindeutige Kennung \(UID\) der zu stornierenden Buchung |
|
||||
| `cancellationReason` | string | Nein | Grund für die Stornierung der Buchung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Details der stornierten Buchung |
|
||||
| ↳ `eventType` | object | Details des Ereignistyps |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `slug` | string | Ereignistyp-Slug |
|
||||
| ↳ `attendees` | array | Liste der Teilnehmer |
|
||||
| ↳ `name` | string | Name des Teilnehmers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
|
||||
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
|
||||
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
|
||||
| ↳ `hosts` | array | Liste der Gastgeber |
|
||||
| ↳ `id` | number | Benutzer-ID des Gastgebers |
|
||||
| ↳ `name` | string | Anzeigename des Gastgebers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
|
||||
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
|
||||
| ↳ `id` | number | Numerische Buchungs-ID |
|
||||
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
|
||||
| ↳ `title` | string | Titel der Buchung |
|
||||
| ↳ `cancellationReason` | string | Grund für die Stornierung, falls storniert |
|
||||
| ↳ `cancelledByEmail` | string | E-Mail der Person, die die Buchung storniert hat |
|
||||
| ↳ `start` | string | Startzeit im ISO-8601-Format |
|
||||
| ↳ `end` | string | Endzeit im ISO-8601-Format |
|
||||
| ↳ `duration` | number | Dauer in Minuten |
|
||||
| ↳ `eventTypeId` | number | Ereignistyp-ID |
|
||||
| ↳ `location` | string | Ort der Buchung |
|
||||
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die der Buchung zugeordnet sind \(dynamische Schlüssel-Wert-Paare\) |
|
||||
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
|
||||
| ↳ `status` | string | Buchungsstatus \(sollte storniert sein\) |
|
||||
|
||||
### `calcom_reschedule_booking`
|
||||
|
||||
Eine bestehende Buchung auf einen neuen Zeitpunkt verschieben
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `bookingUid` | string | Ja | Eindeutige Kennung \(UID\) der zu verschiebenden Buchung |
|
||||
| `start` | string | Ja | Neue Startzeit im UTC ISO 8601-Format \(z. B. 2024-01-15T09:00:00Z\) |
|
||||
| `reschedulingReason` | string | Nein | Grund für die Verschiebung der Buchung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Details der verschobenen Buchung |
|
||||
| ↳ `eventType` | object | Details des Ereignistyps |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `slug` | string | Ereignistyp-Slug |
|
||||
| ↳ `attendees` | array | Liste der Teilnehmer |
|
||||
| ↳ `name` | string | Name des Teilnehmers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
|
||||
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
|
||||
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
|
||||
| ↳ `hosts` | array | Liste der Gastgeber |
|
||||
| ↳ `id` | number | Benutzer-ID des Gastgebers |
|
||||
| ↳ `name` | string | Anzeigename des Gastgebers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
|
||||
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
|
||||
| ↳ `id` | number | Numerische Buchungs-ID |
|
||||
| ↳ `title` | string | Titel der Buchung |
|
||||
| ↳ `status` | string | Buchungsstatus \(z. B. akzeptiert, ausstehend, storniert\) |
|
||||
| ↳ `reschedulingReason` | string | Grund für die Verschiebung, falls verschoben |
|
||||
| ↳ `rescheduledFromUid` | string | Ursprüngliche Buchungs-UID, falls diese Buchung verschoben wurde |
|
||||
| ↳ `rescheduledByEmail` | string | E-Mail der Person, die die Buchung verschoben hat |
|
||||
| ↳ `duration` | number | Dauer in Minuten |
|
||||
| ↳ `eventTypeId` | number | Ereignistyp-ID |
|
||||
| ↳ `meetingUrl` | string | URL zum Beitreten des Meetings |
|
||||
| ↳ `location` | string | Ort der Buchung |
|
||||
| ↳ `guests` | array | E-Mail-Adressen der Gäste |
|
||||
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die an die Buchung angehängt sind \(dynamische Schlüssel-Wert-Paare\) |
|
||||
| ↳ `icsUid` | string | ICS-Kalender-UID |
|
||||
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
|
||||
| ↳ `uid` | string | Eindeutige Kennung für die neue Buchung |
|
||||
| ↳ `start` | string | Neue Startzeit im ISO 8601-Format |
|
||||
| ↳ `end` | string | Neue Endzeit im ISO 8601-Format |
|
||||
|
||||
### `calcom_confirm_booking`
|
||||
|
||||
Eine ausstehende Buchung bestätigen, die eine Bestätigung erfordert
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `bookingUid` | string | Ja | Eindeutige Kennung \(UID\) der zu bestätigenden Buchung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Details der bestätigten Buchung |
|
||||
| ↳ `eventType` | object | Details des Ereignistyps |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `slug` | string | Ereignistyp-Slug |
|
||||
| ↳ `attendees` | array | Liste der Teilnehmer |
|
||||
| ↳ `name` | string | Name des Teilnehmers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
|
||||
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
|
||||
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
|
||||
| ↳ `hosts` | array | Liste der Gastgeber |
|
||||
| ↳ `id` | number | Benutzer-ID des Gastgebers |
|
||||
| ↳ `name` | string | Anzeigename des Gastgebers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
|
||||
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
|
||||
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
|
||||
| ↳ `id` | number | Numerische Buchungs-ID |
|
||||
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
|
||||
| ↳ `title` | string | Titel der Buchung |
|
||||
| ↳ `start` | string | Startzeit im ISO-8601-Format |
|
||||
| ↳ `end` | string | Endzeit im ISO-8601-Format |
|
||||
| ↳ `duration` | number | Dauer in Minuten |
|
||||
| ↳ `eventTypeId` | number | Ereignistyp-ID |
|
||||
| ↳ `meetingUrl` | string | URL zum Beitreten des Meetings |
|
||||
| ↳ `location` | string | Ort der Buchung |
|
||||
| ↳ `guests` | array | E-Mail-Adressen der Gäste |
|
||||
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die der Buchung angehängt sind \(dynamische Schlüssel-Wert-Paare\) |
|
||||
| ↳ `icsUid` | string | ICS-Kalender-UID |
|
||||
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
|
||||
| ↳ `status` | string | Buchungsstatus \(sollte akzeptiert/bestätigt sein\) |
|
||||
|
||||
### `calcom_decline_booking`
|
||||
|
||||
Eine ausstehende Buchungsanfrage ablehnen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `bookingUid` | string | Ja | Eindeutige Kennung (UID) der abzulehnenden Buchung |
|
||||
| `reason` | string | Nein | Grund für die Ablehnung der Buchung |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Details der abgelehnten Buchung |
|
||||
| ↳ `eventType` | object | Details des Ereignistyps |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `slug` | string | Ereignistyp-Slug |
|
||||
| ↳ `attendees` | array | Liste der Teilnehmer |
|
||||
| ↳ `name` | string | Name des Teilnehmers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail (kann von der tatsächlichen E-Mail abweichen) |
|
||||
| ↳ `timeZone` | string | Zeitzone des Teilnehmers (IANA-Format) |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
|
||||
| ↳ `language` | string | Sprachpräferenz des Teilnehmers (ISO-Code) |
|
||||
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
|
||||
| ↳ `hosts` | array | Liste der Gastgeber |
|
||||
| ↳ `id` | number | Benutzer-ID des Gastgebers |
|
||||
| ↳ `name` | string | Anzeigename des Gastgebers |
|
||||
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
|
||||
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail (kann von der tatsächlichen E-Mail abweichen) |
|
||||
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
|
||||
| ↳ `timeZone` | string | Zeitzone des Gastgebers (IANA-Format) |
|
||||
| ↳ `id` | number | Numerische Buchungs-ID |
|
||||
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
|
||||
| ↳ `title` | string | Titel der Buchung |
|
||||
| ↳ `cancellationReason` | string | Grund für die Stornierung, falls storniert |
|
||||
| ↳ `start` | string | Startzeit im ISO-8601-Format |
|
||||
| ↳ `end` | string | Endzeit im ISO-8601-Format |
|
||||
| ↳ `duration` | number | Dauer in Minuten |
|
||||
| ↳ `eventTypeId` | number | Ereignistyp-ID |
|
||||
| ↳ `location` | string | Ort der Buchung |
|
||||
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die der Buchung angehängt sind (dynamische Schlüssel-Wert-Paare) |
|
||||
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
|
||||
| ↳ `status` | string | Buchungsstatus (sollte storniert/abgelehnt sein) |
|
||||
|
||||
### `calcom_create_event_type`
|
||||
|
||||
Einen neuen Ereignistyp in Cal.com erstellen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `title` | string | Ja | Titel des Ereignistyps |
|
||||
| `slug` | string | Ja | Eindeutiger Slug für die Ereignistyp-URL |
|
||||
| `lengthInMinutes` | number | Ja | Dauer des Ereignisses in Minuten |
|
||||
| `description` | string | Nein | Beschreibung des Ereignistyps |
|
||||
| `slotInterval` | number | Nein | Intervall zwischen verfügbaren Buchungsslots in Minuten |
|
||||
| `minimumBookingNotice` | number | Nein | Erforderliche Mindestvorlaufzeit vor der Buchung in Minuten |
|
||||
| `beforeEventBuffer` | number | Nein | Pufferzeit vor dem Ereignis in Minuten |
|
||||
| `afterEventBuffer` | number | Nein | Pufferzeit nach dem Ereignis in Minuten |
|
||||
| `scheduleId` | number | Nein | ID des Zeitplans für die Verfügbarkeit |
|
||||
| `disableGuests` | boolean | Nein | Ob das Hinzufügen von Gästen zu Buchungen deaktiviert ist |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Details des erstellten Ereignistyps |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `title` | string | Ereignistyp-Titel |
|
||||
| ↳ `slug` | string | Ereignistyp-Slug |
|
||||
| ↳ `description` | string | Ereignistyp-Beschreibung |
|
||||
| ↳ `lengthInMinutes` | number | Dauer in Minuten |
|
||||
| ↳ `slotInterval` | number | Slot-Intervall in Minuten |
|
||||
| ↳ `minimumBookingNotice` | number | Mindestvorlaufzeit für Buchung in Minuten |
|
||||
| ↳ `beforeEventBuffer` | number | Puffer vor Ereignis in Minuten |
|
||||
| ↳ `afterEventBuffer` | number | Puffer nach Ereignis in Minuten |
|
||||
| ↳ `scheduleId` | number | Zeitplan-ID |
|
||||
| ↳ `disableGuests` | boolean | Ob Gäste deaktiviert sind |
|
||||
| ↳ `createdAt` | string | ISO-Zeitstempel der Erstellung |
|
||||
| ↳ `updatedAt` | string | ISO-Zeitstempel der letzten Aktualisierung |
|
||||
|
||||
### `calcom_get_event_type`
|
||||
|
||||
Detaillierte Informationen über einen bestimmten Ereignistyp abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `eventTypeId` | number | Ja | Ereignistyp-ID zum Abrufen |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Details zum Ereignistyp |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `title` | string | Titel des Ereignistyps |
|
||||
| ↳ `slug` | string | Slug des Ereignistyps |
|
||||
| ↳ `description` | string | Beschreibung des Ereignistyps |
|
||||
| ↳ `lengthInMinutes` | number | Dauer in Minuten |
|
||||
| ↳ `slotInterval` | number | Zeitfensterintervall in Minuten |
|
||||
| ↳ `minimumBookingNotice` | number | Mindestvorlaufzeit für Buchungen in Minuten |
|
||||
| ↳ `beforeEventBuffer` | number | Puffer vor dem Ereignis in Minuten |
|
||||
| ↳ `afterEventBuffer` | number | Puffer nach dem Ereignis in Minuten |
|
||||
| ↳ `scheduleId` | number | Zeitplan-ID |
|
||||
| ↳ `disableGuests` | boolean | Ob Gäste deaktiviert sind |
|
||||
| ↳ `createdAt` | string | ISO-Zeitstempel der Erstellung |
|
||||
| ↳ `updatedAt` | string | ISO-Zeitstempel der letzten Aktualisierung |
|
||||
|
||||
### `calcom_list_event_types`
|
||||
|
||||
Eine Liste aller Ereignistypen abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `sortCreatedAt` | string | Nein | Sortierung nach Erstellungsdatum: "asc" oder "desc" |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | array | Array von Ereignistypen |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `title` | string | Ereignistyp-Titel |
|
||||
| ↳ `slug` | string | Ereignistyp-Slug |
|
||||
| ↳ `description` | string | Ereignistyp-Beschreibung |
|
||||
| ↳ `lengthInMinutes` | number | Dauer in Minuten |
|
||||
| ↳ `slotInterval` | number | Zeitfensterintervall in Minuten |
|
||||
| ↳ `minimumBookingNotice` | number | Mindestvorlaufzeit für Buchungen in Minuten |
|
||||
| ↳ `beforeEventBuffer` | number | Pufferzeit vor dem Ereignis in Minuten |
|
||||
| ↳ `afterEventBuffer` | number | Pufferzeit nach dem Ereignis in Minuten |
|
||||
| ↳ `scheduleId` | number | Zeitplan-ID |
|
||||
| ↳ `disableGuests` | boolean | Ob Gäste deaktiviert sind |
|
||||
| ↳ `createdAt` | string | ISO-Zeitstempel der Erstellung |
|
||||
| ↳ `updatedAt` | string | ISO-Zeitstempel der letzten Aktualisierung |
|
||||
|
||||
### `calcom_update_event_type`
|
||||
|
||||
Einen bestehenden Ereignistyp in Cal.com aktualisieren
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `eventTypeId` | number | Ja | Zu aktualisierende Ereignistyp-ID \(z. B. 12345\) |
|
||||
| `title` | string | Nein | Titel des Ereignistyps |
|
||||
| `slug` | string | Nein | Eindeutiger Slug für die Ereignistyp-URL |
|
||||
| `lengthInMinutes` | number | Nein | Dauer des Ereignisses in Minuten |
|
||||
| `description` | string | Nein | Beschreibung des Ereignistyps |
|
||||
| `slotInterval` | number | Nein | Intervall zwischen verfügbaren Buchungszeitfenstern in Minuten |
|
||||
| `minimumBookingNotice` | number | Nein | Erforderliche Mindestvorlaufzeit vor der Buchung in Minuten |
|
||||
| `beforeEventBuffer` | number | Nein | Pufferzeit vor dem Ereignis in Minuten |
|
||||
| `afterEventBuffer` | number | Nein | Pufferzeit nach dem Ereignis in Minuten |
|
||||
| `scheduleId` | number | Nein | ID des Zeitplans für die Verfügbarkeit |
|
||||
| `disableGuests` | boolean | Nein | Ob das Hinzufügen von Gästen zu Buchungen deaktiviert werden soll |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Aktualisierte Details des Ereignistyps |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `title` | string | Titel des Ereignistyps |
|
||||
| ↳ `slug` | string | Slug des Ereignistyps |
|
||||
| ↳ `description` | string | Beschreibung des Ereignistyps |
|
||||
| ↳ `lengthInMinutes` | number | Dauer in Minuten |
|
||||
| ↳ `slotInterval` | number | Zeitfensterintervall in Minuten |
|
||||
| ↳ `minimumBookingNotice` | number | Mindestvorlaufzeit für Buchungen in Minuten |
|
||||
| ↳ `beforeEventBuffer` | number | Puffer vor dem Ereignis in Minuten |
|
||||
| ↳ `afterEventBuffer` | number | Puffer nach dem Ereignis in Minuten |
|
||||
| ↳ `scheduleId` | number | Zeitplan-ID |
|
||||
| ↳ `disableGuests` | boolean | Ob Gäste deaktiviert sind |
|
||||
| ↳ `createdAt` | string | ISO-Zeitstempel der Erstellung |
|
||||
| ↳ `updatedAt` | string | ISO-Zeitstempel der letzten Aktualisierung |
|
||||
|
||||
### `calcom_delete_event_type`
|
||||
|
||||
Einen Ereignistyp aus Cal.com löschen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `eventTypeId` | number | Ja | Zu löschende Ereignistyp-ID |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Details des gelöschten Ereignistyps |
|
||||
| ↳ `id` | number | Ereignistyp-ID |
|
||||
| ↳ `lengthInMinutes` | number | Dauer in Minuten |
|
||||
| ↳ `title` | string | Titel des Ereignistyps |
|
||||
| ↳ `slug` | string | Slug des Ereignistyps |
|
||||
|
||||
### `calcom_create_schedule`
|
||||
|
||||
Einen neuen Verfügbarkeitsplan in Cal.com erstellen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `name` | string | Ja | Name des Plans |
|
||||
| `timeZone` | string | Ja | Zeitzone für den Plan \(z. B. America/New_York\) |
|
||||
| `isDefault` | boolean | Ja | Ob dieser Plan als Standard festgelegt werden soll |
|
||||
| `availability` | array | Nein | Verfügbarkeitsintervalle für den Plan |
|
||||
| `items` | object | Nein | Verfügbarkeitsintervall |
|
||||
| `properties` | array | Nein | Wochentage \(Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag\) |
|
||||
| `days` | array | Nein | Wochentage \(Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag\) |
|
||||
| `startTime` | string | Nein | Startzeit im Format HH:MM |
|
||||
| `endTime` | string | Nein | Endzeit im Format HH:MM |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Erstellte Plandaten |
|
||||
| ↳ `id` | number | Plan-ID |
|
||||
| ↳ `ownerId` | number | Benutzer-ID des Eigentümers |
|
||||
| ↳ `name` | string | Planname |
|
||||
| ↳ `timeZone` | string | Zeitzone \(z. B. America/New_York\) |
|
||||
| ↳ `isDefault` | boolean | Ob dies der Standardplan ist |
|
||||
| ↳ `availability` | array | Verfügbarkeitsfenster |
|
||||
| ↳ `days` | array | Wochentage \(Montag, Dienstag usw.\) |
|
||||
| ↳ `startTime` | string | Startzeit im Format HH:MM |
|
||||
| ↳ `endTime` | string | Endzeit im Format HH:MM |
|
||||
| ↳ `overrides` | array | Datumsspezifische Verfügbarkeitsüberschreibungen |
|
||||
| ↳ `date` | string | Datum im Format JJJJ-MM-TT |
|
||||
| ↳ `startTime` | string | Startzeit im Format HH:MM |
|
||||
| ↳ `endTime` | string | Endzeit im Format HH:MM |
|
||||
|
||||
### `calcom_get_schedule`
|
||||
|
||||
Einen bestimmten Zeitplan anhand der ID von Cal.com abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `scheduleId` | string | Ja | ID des abzurufenden Zeitplans |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Zeitplandaten |
|
||||
| ↳ `id` | number | Zeitplan-ID |
|
||||
| ↳ `ownerId` | number | Benutzer-ID des Eigentümers |
|
||||
| ↳ `name` | string | Zeitplanname |
|
||||
| ↳ `timeZone` | string | Zeitzone \(z. B. America/New_York\) |
|
||||
| ↳ `isDefault` | boolean | Ob dies der Standardzeitplan ist |
|
||||
| ↳ `availability` | array | Verfügbarkeitsfenster |
|
||||
| ↳ `days` | array | Wochentage \(Montag, Dienstag usw.\) |
|
||||
| ↳ `startTime` | string | Startzeit im Format HH:MM |
|
||||
| ↳ `endTime` | string | Endzeit im Format HH:MM |
|
||||
| ↳ `overrides` | array | Datumsspezifische Verfügbarkeitsüberschreibungen |
|
||||
| ↳ `date` | string | Datum im Format JJJJ-MM-TT |
|
||||
| ↳ `startTime` | string | Startzeit im Format HH:MM |
|
||||
| ↳ `endTime` | string | Endzeit im Format HH:MM |
|
||||
|
||||
### `calcom_list_schedules`
|
||||
|
||||
Alle Verfügbarkeitszeitpläne von Cal.com auflisten
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | array | Array von Zeitplanobjekten |
|
||||
| ↳ `id` | number | Zeitplan-ID |
|
||||
| ↳ `ownerId` | number | Benutzer-ID des Eigentümers |
|
||||
| ↳ `name` | string | Zeitplanname |
|
||||
| ↳ `timeZone` | string | Zeitzone \(z. B. America/New_York\) |
|
||||
| ↳ `isDefault` | boolean | Ob dies der Standardzeitplan ist |
|
||||
| ↳ `availability` | array | Verfügbarkeitsfenster |
|
||||
| ↳ `days` | array | Wochentage \(Montag, Dienstag usw.\) |
|
||||
| ↳ `startTime` | string | Startzeit im Format HH:MM |
|
||||
| ↳ `endTime` | string | Endzeit im Format HH:MM |
|
||||
| ↳ `overrides` | array | Datumsspezifische Verfügbarkeitsüberschreibungen |
|
||||
| ↳ `date` | string | Datum im Format JJJJ-MM-TT |
|
||||
| ↳ `startTime` | string | Startzeit im Format HH:MM |
|
||||
| ↳ `endTime` | string | Endzeit im Format HH:MM |
|
||||
|
||||
### `calcom_update_schedule`
|
||||
|
||||
Einen bestehenden Zeitplan in Cal.com aktualisieren
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `scheduleId` | string | Ja | ID des zu aktualisierenden Zeitplans |
|
||||
| `name` | string | Nein | Neuer Name für den Zeitplan |
|
||||
| `timeZone` | string | Nein | Neue Zeitzone für den Zeitplan \(z. B. America/New_York\) |
|
||||
| `isDefault` | boolean | Nein | Ob dieser Zeitplan als Standard festgelegt werden soll |
|
||||
| `availability` | array | Nein | Neue Verfügbarkeitsintervalle für den Zeitplan |
|
||||
| `items` | object | Nein | Verfügbarkeitsintervall |
|
||||
| `properties` | array | Nein | Wochentage \(Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag\) |
|
||||
| `days` | array | Nein | Wochentage \(Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag\) |
|
||||
| `startTime` | string | Nein | Startzeit im Format HH:MM |
|
||||
| `endTime` | string | Nein | Endzeit im Format HH:MM |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Aktualisierte Zeitplandaten |
|
||||
| ↳ `id` | number | Zeitplan-ID |
|
||||
| ↳ `ownerId` | number | Benutzer-ID des Eigentümers |
|
||||
| ↳ `name` | string | Zeitplanname |
|
||||
| ↳ `timeZone` | string | Zeitzone \(z. B. America/New_York\) |
|
||||
| ↳ `isDefault` | boolean | Ob dies der Standardzeitplan ist |
|
||||
| ↳ `availability` | array | Verfügbarkeitsfenster |
|
||||
| ↳ `days` | array | Wochentage \(Montag, Dienstag usw.\) |
|
||||
| ↳ `startTime` | string | Startzeit im Format HH:MM |
|
||||
| ↳ `endTime` | string | Endzeit im Format HH:MM |
|
||||
| ↳ `overrides` | array | Datumsspezifische Verfügbarkeitsüberschreibungen |
|
||||
| ↳ `date` | string | Datum im Format JJJJ-MM-TT |
|
||||
| ↳ `startTime` | string | Startzeit im Format HH:MM |
|
||||
| ↳ `endTime` | string | Endzeit im Format HH:MM |
|
||||
|
||||
### `calcom_delete_schedule`
|
||||
|
||||
Einen Zeitplan aus Cal.com löschen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `scheduleId` | string | Ja | ID des zu löschenden Zeitplans |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus \(Erfolg oder Fehler\) |
|
||||
|
||||
### `calcom_get_default_schedule`
|
||||
|
||||
Den Standard-Verfügbarkeitszeitplan aus Cal.com abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | object | Standard-Zeitplandaten |
|
||||
| ↳ `id` | number | Zeitplan-ID |
|
||||
| ↳ `ownerId` | number | Benutzer-ID des Eigentümers |
|
||||
| ↳ `name` | string | Zeitplanname |
|
||||
| ↳ `timeZone` | string | Zeitzone \(z. B. America/New_York\) |
|
||||
| ↳ `isDefault` | boolean | Ob dies der Standardzeitplan ist |
|
||||
| ↳ `availability` | array | Verfügbarkeitsfenster |
|
||||
| ↳ `days` | array | Wochentage \(Montag, Dienstag usw.\) |
|
||||
| ↳ `startTime` | string | Startzeit im Format HH:MM |
|
||||
| ↳ `endTime` | string | Endzeit im Format HH:MM |
|
||||
| ↳ `overrides` | array | Datumsspezifische Verfügbarkeitsüberschreibungen |
|
||||
| ↳ `date` | string | Datum im Format JJJJ-MM-TT |
|
||||
| ↳ `startTime` | string | Startzeit im Format HH:MM |
|
||||
| ↳ `endTime` | string | Endzeit im Format HH:MM |
|
||||
|
||||
### `calcom_get_slots`
|
||||
|
||||
Verfügbare Buchungsslots für einen Cal.com-Ereignistyp innerhalb eines Zeitraums abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `start` | string | Ja | Beginn des Zeitraums im UTC ISO 8601-Format \(z. B. 2024-01-15T00:00:00Z\) |
|
||||
| `end` | string | Ja | Ende des Zeitraums im UTC ISO 8601-Format \(z. B. 2024-01-22T00:00:00Z\) |
|
||||
| `eventTypeId` | number | Nein | Ereignistyp-ID für direkte Suche |
|
||||
| `eventTypeSlug` | string | Nein | Ereignistyp-Slug \(erfordert, dass der Benutzername gesetzt ist\) |
|
||||
| `username` | string | Nein | Benutzername für persönliche Ereignistypen \(erforderlich bei Verwendung von eventTypeSlug\) |
|
||||
| `timeZone` | string | Nein | Zeitzone für zurückgegebene Slots \(Standard ist UTC\) |
|
||||
| `duration` | number | Nein | Slot-Länge in Minuten |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `status` | string | Antwortstatus |
|
||||
| `data` | json | Verfügbare Zeitslots gruppiert nach Datum \(Schlüssel im Format JJJJ-MM-TT\). Jedes Datum ist einem Array von Slot-Objekten mit Startzeit, optionaler Endzeit und Informationen zu Sitzplatz-Events zugeordnet. |
|
||||
@@ -165,8 +165,3 @@ Ein geplantes Ereignis stornieren
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `resource` | object | Stornierungsdetails |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `calendly`
|
||||
|
||||
@@ -52,8 +52,3 @@ Egal, ob Sie sofortige Zusammenfassungen verteilen, Aufgaben protokollieren oder
|
||||
## Nutzungsanleitung
|
||||
|
||||
Erhalten Sie Meeting-Notizen, Aufgaben, Transkripte und Aufzeichnungen, wenn Meetings verarbeitet werden. Circleback nutzt Webhooks, um Daten an Ihre Workflows zu übermitteln.
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `triggers`
|
||||
- Typ: `circleback`
|
||||
|
||||
@@ -53,13 +53,3 @@ Populate Clay with data from a JSON file. Enables direct communication and notif
|
||||
| `authToken` | string | Nein | Optionaler Auth-Token für die Clay-Webhook-Authentifizierung \(die meisten Webhooks benötigen dies nicht\) |
|
||||
|
||||
#### Output
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `data` | json | Antwortdaten vom Clay-Webhook |
|
||||
| `metadata` | object | Webhook-Antwort-Metadaten |
|
||||
|
||||
## Notes
|
||||
|
||||
- Category: `tools`
|
||||
- Type: `clay`
|
||||
|
||||
437
apps/docs/content/docs/de/tools/clerk.mdx
Normal file
437
apps/docs/content/docs/de/tools/clerk.mdx
Normal file
@@ -0,0 +1,437 @@
|
||||
---
|
||||
title: Clerk
|
||||
description: Verwalten Sie Benutzer, Organisationen und Sitzungen in Clerk
|
||||
---
|
||||
|
||||
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||
|
||||
<BlockInfoCard
|
||||
type="clerk"
|
||||
color="#131316"
|
||||
/>
|
||||
|
||||
{/* MANUAL-CONTENT-START:intro */}
|
||||
[Clerk](https://clerk.com/) ist eine umfassende Identitätsinfrastruktur-Plattform, die Ihnen hilft, Benutzer, Authentifizierung und Sitzungen für Ihre Anwendungen zu verwalten.
|
||||
|
||||
In Sim ermöglicht die Clerk-Integration Ihren Agenten, die Benutzer- und Sitzungsverwaltung durch einfach zu bedienende API-basierte Tools zu automatisieren. Agenten können sicher Benutzer auflisten, Benutzerprofile aktualisieren, Organisationen verwalten, Sitzungen überwachen und den Zugriff direkt in Ihrem Workflow widerrufen.
|
||||
|
||||
Mit Clerk können Sie:
|
||||
|
||||
- **Benutzer authentifizieren und Sitzungen verwalten**: Steuern Sie nahtlos Anmeldung, Registrierung und den Sitzungslebenszyklus für Ihre Benutzer.
|
||||
- **Benutzer auflisten und aktualisieren**: Rufen Sie automatisch Benutzerlisten ab, aktualisieren Sie Benutzerattribute oder zeigen Sie Profildetails als Teil Ihrer Agentenaufgaben an.
|
||||
- **Organisationen und Mitgliedschaften verwalten**: Fügen Sie Organisationen hinzu oder aktualisieren Sie diese und verwalten Sie Benutzermitgliedschaften übersichtlich.
|
||||
- **Sitzungen überwachen und widerrufen**: Sehen Sie aktive oder vergangene Benutzersitzungen ein und widerrufen Sie bei Bedarf sofort den Zugriff aus Sicherheitsgründen.
|
||||
|
||||
Die Integration ermöglicht eine Echtzeit- und nachvollziehbare Verwaltung Ihrer Benutzerbasis – alles innerhalb von Sim. Verbundene Agenten können das Onboarding automatisieren, Richtlinien durchsetzen, Verzeichnisse aktuell halten und auf Authentifizierungsereignisse oder organisatorische Änderungen reagieren, sodass Sie sichere und flexible Prozesse mit Clerk als Ihrer Identitäts-Engine betreiben können.
|
||||
{/* MANUAL-CONTENT-END */}
|
||||
|
||||
## Nutzungsanweisungen
|
||||
|
||||
Integrieren Sie Clerk-Authentifizierung und Benutzerverwaltung in Ihren Workflow. Erstellen, aktualisieren, löschen und listen Sie Benutzer auf. Verwalten Sie Organisationen und deren Mitgliedschaften. Überwachen und steuern Sie Benutzersitzungen.
|
||||
|
||||
## Tools
|
||||
|
||||
### `clerk_list_users`
|
||||
|
||||
Listen Sie alle Benutzer in Ihrer Clerk-Anwendung mit optionaler Filterung und Paginierung auf
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
|
||||
| `limit` | number | Nein | Anzahl der Ergebnisse pro Seite \(z. B. 10, 50, 100; Bereich: 1-500, Standard: 10\) |
|
||||
| `offset` | number | Nein | Anzahl der zu überspringenden Ergebnisse für die Paginierung \(z. B. 0, 10, 20\) |
|
||||
| `orderBy` | string | Nein | Sortierfeld mit optionalem +/- Präfix für die Richtung \(Standard: -created_at\) |
|
||||
| `emailAddress` | string | Nein | Filtern nach E-Mail-Adresse \(z. B. user@example.com oder user1@example.com,user2@example.com\) |
|
||||
| `phoneNumber` | string | Nein | Filtern nach Telefonnummer \(durch Komma getrennt für mehrere\) |
|
||||
| `externalId` | string | Nein | Filtern nach externer ID \(durch Komma getrennt für mehrere\) |
|
||||
| `username` | string | Nein | Filtern nach Benutzername \(durch Komma getrennt für mehrere\) |
|
||||
| `userId` | string | Nein | Filtern nach Benutzer-ID \(z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC oder durch Komma getrennt für mehrere\) |
|
||||
| `query` | string | Nein | Suchanfrage zur Übereinstimmung über E-Mail, Telefon, Benutzername und Namen \(z. B. john oder john@example.com\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `users` | array | Array von Clerk-Benutzerobjekten |
|
||||
| ↳ `id` | string | Benutzer-ID |
|
||||
| ↳ `username` | string | Benutzername |
|
||||
| ↳ `firstName` | string | Vorname |
|
||||
| ↳ `lastName` | string | Nachname |
|
||||
| ↳ `imageUrl` | string | Profilbild-URL |
|
||||
| ↳ `hasImage` | boolean | Ob Benutzer ein Profilbild hat |
|
||||
| ↳ `primaryEmailAddressId` | string | Primäre E-Mail-Adressen-ID |
|
||||
| ↳ `primaryPhoneNumberId` | string | Primäre Telefonnummer-ID |
|
||||
| ↳ `emailAddresses` | array | E-Mail-Adressen des Benutzers |
|
||||
| ↳ `id` | string | E-Mail-Adressen-ID |
|
||||
| ↳ `emailAddress` | string | E-Mail-Adresse |
|
||||
| ↳ `phoneNumbers` | array | Telefonnummern des Benutzers |
|
||||
| ↳ `id` | string | Telefonnummer-ID |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer |
|
||||
| ↳ `externalId` | string | Externe System-ID |
|
||||
| ↳ `passwordEnabled` | boolean | Ob Passwort aktiviert ist |
|
||||
| ↳ `twoFactorEnabled` | boolean | Ob 2FA aktiviert ist |
|
||||
| ↳ `banned` | boolean | Ob Benutzer gesperrt ist |
|
||||
| ↳ `locked` | boolean | Ob Benutzer blockiert ist |
|
||||
| ↳ `lastSignInAt` | number | Zeitstempel der letzten Anmeldung |
|
||||
| ↳ `lastActiveAt` | number | Zeitstempel der letzten Aktivität |
|
||||
| ↳ `createdAt` | number | Erstellungszeitstempel |
|
||||
| ↳ `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
|
||||
| ↳ `publicMetadata` | json | Öffentliche Metadaten |
|
||||
| `totalCount` | number | Gesamtanzahl der Benutzer, die der Abfrage entsprechen |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
|
||||
### `clerk_get_user`
|
||||
|
||||
Einen einzelnen Benutzer anhand seiner ID von Clerk abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
|
||||
| `userId` | string | Ja | Die ID des abzurufenden Benutzers \(z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Benutzer-ID |
|
||||
| `username` | string | Benutzername |
|
||||
| `firstName` | string | Vorname |
|
||||
| `lastName` | string | Nachname |
|
||||
| `imageUrl` | string | Profilbild-URL |
|
||||
| `hasImage` | boolean | Ob der Benutzer ein Profilbild hat |
|
||||
| `primaryEmailAddressId` | string | Primäre E-Mail-Adressen-ID |
|
||||
| `primaryPhoneNumberId` | string | Primäre Telefonnummer-ID |
|
||||
| `primaryWeb3WalletId` | string | Primäre Web3-Wallet-ID |
|
||||
| `emailAddresses` | array | E-Mail-Adressen des Benutzers |
|
||||
| ↳ `id` | string | E-Mail-Adressen-ID |
|
||||
| ↳ `emailAddress` | string | E-Mail-Adresse |
|
||||
| ↳ `verified` | boolean | Ob die E-Mail verifiziert ist |
|
||||
| `phoneNumbers` | array | Telefonnummern des Benutzers |
|
||||
| ↳ `id` | string | Telefonnummer-ID |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer |
|
||||
| ↳ `verified` | boolean | Ob die Telefonnummer verifiziert ist |
|
||||
| `externalId` | string | Externe System-ID |
|
||||
| `passwordEnabled` | boolean | Ob das Passwort aktiviert ist |
|
||||
| `twoFactorEnabled` | boolean | Ob 2FA aktiviert ist |
|
||||
| `totpEnabled` | boolean | Ob TOTP aktiviert ist |
|
||||
| `backupCodeEnabled` | boolean | Ob Backup-Codes aktiviert sind |
|
||||
| `banned` | boolean | Ob der Benutzer gesperrt ist |
|
||||
| `locked` | boolean | Ob der Benutzer blockiert ist |
|
||||
| `deleteSelfEnabled` | boolean | Ob der Benutzer sich selbst löschen kann |
|
||||
| `createOrganizationEnabled` | boolean | Ob der Benutzer Organisationen erstellen kann |
|
||||
| `lastSignInAt` | number | Zeitstempel der letzten Anmeldung |
|
||||
| `lastActiveAt` | number | Zeitstempel der letzten Aktivität |
|
||||
| `createdAt` | number | Erstellungszeitstempel |
|
||||
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
|
||||
| `publicMetadata` | json | Öffentliche Metadaten \(vom Frontend lesbar\) |
|
||||
| `privateMetadata` | json | Private Metadaten \(nur Backend\) |
|
||||
| `unsafeMetadata` | json | Unsichere Metadaten \(vom Frontend änderbar\) |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
|
||||
### `clerk_create_user`
|
||||
|
||||
Erstellen Sie einen neuen Benutzer in Ihrer Clerk-Anwendung
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
|
||||
| `emailAddress` | string | Nein | E-Mail-Adressen für den Benutzer \(durch Komma getrennt für mehrere\) |
|
||||
| `phoneNumber` | string | Nein | Telefonnummern für den Benutzer \(durch Komma getrennt für mehrere\) |
|
||||
| `username` | string | Nein | Benutzername für den Benutzer \(muss eindeutig sein\) |
|
||||
| `password` | string | Nein | Passwort für den Benutzer \(mindestens 8 Zeichen\) |
|
||||
| `firstName` | string | Nein | Vorname des Benutzers |
|
||||
| `lastName` | string | Nein | Nachname des Benutzers |
|
||||
| `externalId` | string | Nein | Externe System-ID \(muss eindeutig sein\) |
|
||||
| `publicMetadata` | json | Nein | Öffentliche Metadaten \(JSON-Objekt, lesbar vom Frontend\) |
|
||||
| `privateMetadata` | json | Nein | Private Metadaten \(JSON-Objekt, nur Backend\) |
|
||||
| `unsafeMetadata` | json | Nein | Unsichere Metadaten \(JSON-Objekt, änderbar vom Frontend\) |
|
||||
| `skipPasswordChecks` | boolean | Nein | Passwortvalidierungsprüfungen überspringen |
|
||||
| `skipPasswordRequirement` | boolean | Nein | Passwort optional machen |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Erstellte Benutzer-ID |
|
||||
| `username` | string | Benutzername |
|
||||
| `firstName` | string | Vorname |
|
||||
| `lastName` | string | Nachname |
|
||||
| `imageUrl` | string | Profilbild-URL |
|
||||
| `primaryEmailAddressId` | string | Primäre E-Mail-Adressen-ID |
|
||||
| `primaryPhoneNumberId` | string | Primäre Telefonnummer-ID |
|
||||
| `emailAddresses` | array | E-Mail-Adressen des Benutzers |
|
||||
| ↳ `id` | string | E-Mail-Adressen-ID |
|
||||
| ↳ `emailAddress` | string | E-Mail-Adresse |
|
||||
| ↳ `verified` | boolean | Ob die E-Mail verifiziert ist |
|
||||
| `phoneNumbers` | array | Telefonnummern des Benutzers |
|
||||
| ↳ `id` | string | Telefonnummer-ID |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer |
|
||||
| ↳ `verified` | boolean | Ob die Telefonnummer verifiziert ist |
|
||||
| `externalId` | string | Externe System-ID |
|
||||
| `createdAt` | number | Erstellungszeitstempel |
|
||||
| `updatedAt` | number | Letzter Aktualisierungszeitstempel |
|
||||
| `publicMetadata` | json | Öffentliche Metadaten |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
|
||||
### `clerk_update_user`
|
||||
|
||||
Aktualisieren Sie einen bestehenden Benutzer in Ihrer Clerk-Anwendung
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
|
||||
| `userId` | string | Ja | Die ID des zu aktualisierenden Benutzers \(z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) |
|
||||
| `firstName` | string | Nein | Vorname des Benutzers |
|
||||
| `lastName` | string | Nein | Nachname des Benutzers |
|
||||
| `username` | string | Nein | Benutzername \(muss eindeutig sein\) |
|
||||
| `password` | string | Nein | Neues Passwort \(mindestens 8 Zeichen\) |
|
||||
| `externalId` | string | Nein | Externe System-ID |
|
||||
| `primaryEmailAddressId` | string | Nein | ID der verifizierten E-Mail, die als primär festgelegt werden soll |
|
||||
| `primaryPhoneNumberId` | string | Nein | ID der verifizierten Telefonnummer, die als primär festgelegt werden soll |
|
||||
| `publicMetadata` | json | Nein | Öffentliche Metadaten \(JSON-Objekt\) |
|
||||
| `privateMetadata` | json | Nein | Private Metadaten \(JSON-Objekt\) |
|
||||
| `unsafeMetadata` | json | Nein | Unsichere Metadaten \(JSON-Objekt\) |
|
||||
| `skipPasswordChecks` | boolean | Nein | Passwortvalidierungsprüfungen überspringen |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Aktualisierte Benutzer-ID |
|
||||
| `username` | string | Benutzername |
|
||||
| `firstName` | string | Vorname |
|
||||
| `lastName` | string | Nachname |
|
||||
| `imageUrl` | string | Profilbild-URL |
|
||||
| `primaryEmailAddressId` | string | Primäre E-Mail-Adressen-ID |
|
||||
| `primaryPhoneNumberId` | string | Primäre Telefonnummer-ID |
|
||||
| `emailAddresses` | array | E-Mail-Adressen des Benutzers |
|
||||
| ↳ `id` | string | E-Mail-Adressen-ID |
|
||||
| ↳ `emailAddress` | string | E-Mail-Adresse |
|
||||
| ↳ `verified` | boolean | Ob die E-Mail verifiziert ist |
|
||||
| `phoneNumbers` | array | Telefonnummern des Benutzers |
|
||||
| ↳ `id` | string | Telefonnummer-ID |
|
||||
| ↳ `phoneNumber` | string | Telefonnummer |
|
||||
| ↳ `verified` | boolean | Ob die Telefonnummer verifiziert ist |
|
||||
| `externalId` | string | Externe System-ID |
|
||||
| `banned` | boolean | Ob der Benutzer gesperrt ist |
|
||||
| `locked` | boolean | Ob der Benutzer blockiert ist |
|
||||
| `createdAt` | number | Erstellungszeitstempel |
|
||||
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
|
||||
| `publicMetadata` | json | Öffentliche Metadaten |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
|
||||
### `clerk_delete_user`
|
||||
|
||||
Einen Benutzer aus Ihrer Clerk-Anwendung löschen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
|
||||
| `userId` | string | Ja | Die ID des zu löschenden Benutzers (z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | ID des gelöschten Benutzers |
|
||||
| `object` | string | Objekttyp (user) |
|
||||
| `deleted` | boolean | Ob der Benutzer gelöscht wurde |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
|
||||
### `clerk_list_organizations`
|
||||
|
||||
Alle Organisationen in Ihrer Clerk-Anwendung mit optionaler Filterung auflisten
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
|
||||
| `limit` | number | Nein | Anzahl der Ergebnisse pro Seite (z. B. 10, 50, 100; Bereich: 1–500, Standard: 10) |
|
||||
| `offset` | number | Nein | Anzahl der zu überspringenden Ergebnisse für die Paginierung (z. B. 0, 10, 20) |
|
||||
| `includeMembersCount` | boolean | Nein | Mitgliederanzahl für jede Organisation einbeziehen |
|
||||
| `query` | string | Nein | Suche nach Organisations-ID, Name oder Slug (z. B. Acme Corp oder acme-corp) |
|
||||
| `orderBy` | string | Nein | Sortierfeld (name, created_at, members_count) mit +/- Präfix |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `organizations` | array | Array von Clerk-Organisationsobjekten |
|
||||
| ↳ `id` | string | Organisations-ID |
|
||||
| ↳ `name` | string | Organisationsname |
|
||||
| ↳ `slug` | string | Organisations-Slug |
|
||||
| ↳ `imageUrl` | string | URL des Organisationsbilds |
|
||||
| ↳ `hasImage` | boolean | Ob die Organisation ein Bild hat |
|
||||
| ↳ `membersCount` | number | Anzahl der Mitglieder |
|
||||
| ↳ `pendingInvitationsCount` | number | Anzahl ausstehender Einladungen |
|
||||
| ↳ `maxAllowedMemberships` | number | Maximal zulässige Mitgliedschaften |
|
||||
| ↳ `adminDeleteEnabled` | boolean | Ob Admin-Löschung aktiviert ist |
|
||||
| ↳ `createdBy` | string | Benutzer-ID des Erstellers |
|
||||
| ↳ `createdAt` | number | Erstellungszeitstempel |
|
||||
| ↳ `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
|
||||
| ↳ `publicMetadata` | json | Öffentliche Metadaten |
|
||||
| `totalCount` | number | Gesamtanzahl der Organisationen |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
|
||||
### `clerk_get_organization`
|
||||
|
||||
Abrufen einer einzelnen Organisation nach ID oder Slug von Clerk
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
|
||||
| `organizationId` | string | Ja | Die ID oder der Slug der abzurufenden Organisation \(z. B. org_2NNEqL2nrIRdJ194ndJqAHwEfxC oder my-org-slug\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Organisations-ID |
|
||||
| `name` | string | Organisationsname |
|
||||
| `slug` | string | Organisations-Slug |
|
||||
| `imageUrl` | string | URL des Organisationsbilds |
|
||||
| `hasImage` | boolean | Ob die Organisation ein Bild hat |
|
||||
| `membersCount` | number | Anzahl der Mitglieder |
|
||||
| `pendingInvitationsCount` | number | Anzahl ausstehender Einladungen |
|
||||
| `maxAllowedMemberships` | number | Maximal zulässige Mitgliedschaften |
|
||||
| `adminDeleteEnabled` | boolean | Ob Admin-Löschung aktiviert ist |
|
||||
| `createdBy` | string | Benutzer-ID des Erstellers |
|
||||
| `createdAt` | number | Erstellungszeitstempel |
|
||||
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
|
||||
| `publicMetadata` | json | Öffentliche Metadaten |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
|
||||
### `clerk_create_organization`
|
||||
|
||||
Erstellen Sie eine neue Organisation in Ihrer Clerk-Anwendung
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
|
||||
| `name` | string | Ja | Name der Organisation |
|
||||
| `createdBy` | string | Ja | Benutzer-ID des Erstellers, der Administrator wird \(z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) |
|
||||
| `slug` | string | Nein | Slug-Identifikator für die Organisation |
|
||||
| `maxAllowedMemberships` | number | Nein | Maximale Mitgliederkapazität \(0 für unbegrenzt\) |
|
||||
| `publicMetadata` | json | Nein | Öffentliche Metadaten \(JSON-Objekt\) |
|
||||
| `privateMetadata` | json | Nein | Private Metadaten \(JSON-Objekt\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Erstellte Organisations-ID |
|
||||
| `name` | string | Organisationsname |
|
||||
| `slug` | string | Organisations-Slug |
|
||||
| `imageUrl` | string | URL des Organisationsbildes |
|
||||
| `hasImage` | boolean | Ob die Organisation ein Bild hat |
|
||||
| `membersCount` | number | Anzahl der Mitglieder |
|
||||
| `pendingInvitationsCount` | number | Anzahl ausstehender Einladungen |
|
||||
| `maxAllowedMemberships` | number | Maximal zulässige Mitgliedschaften |
|
||||
| `adminDeleteEnabled` | boolean | Ob das Löschen durch den Administrator aktiviert ist |
|
||||
| `createdBy` | string | Benutzer-ID des Erstellers |
|
||||
| `createdAt` | number | Erstellungszeitstempel |
|
||||
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
|
||||
| `publicMetadata` | json | Öffentliche Metadaten |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
|
||||
### `clerk_list_sessions`
|
||||
|
||||
Sitzungen für einen Benutzer oder Client in Ihrer Clerk-Anwendung auflisten
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
|
||||
| `userId` | string | Nein | Benutzer-ID, für die Sitzungen aufgelistet werden sollen \(z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC; erforderlich, wenn clientId nicht angegeben ist\) |
|
||||
| `clientId` | string | Nein | Client-ID, für die Sitzungen aufgelistet werden sollen \(erforderlich, wenn userId nicht angegeben ist\) |
|
||||
| `status` | string | Nein | Nach Sitzungsstatus filtern \(abandoned, active, ended, expired, pending, removed, replaced, revoked\) |
|
||||
| `limit` | number | Nein | Anzahl der Ergebnisse pro Seite \(z. B. 10, 50, 100; Bereich: 1-500, Standard: 10\) |
|
||||
| `offset` | number | Nein | Anzahl der zu überspringenden Ergebnisse für die Paginierung \(z. B. 0, 10, 20\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `sessions` | array | Array von Clerk-Sitzungsobjekten |
|
||||
| ↳ `id` | string | Sitzungs-ID |
|
||||
| ↳ `userId` | string | Benutzer-ID |
|
||||
| ↳ `clientId` | string | Client-ID |
|
||||
| ↳ `status` | string | Sitzungsstatus |
|
||||
| ↳ `lastActiveAt` | number | Zeitstempel der letzten Aktivität |
|
||||
| ↳ `lastActiveOrganizationId` | string | ID der zuletzt aktiven Organisation |
|
||||
| ↳ `expireAt` | number | Ablaufzeitstempel |
|
||||
| ↳ `abandonAt` | number | Abbruchzeitstempel |
|
||||
| ↳ `createdAt` | number | Erstellungszeitstempel |
|
||||
| ↳ `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
|
||||
| `totalCount` | number | Gesamtanzahl der Sitzungen |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
|
||||
### `clerk_get_session`
|
||||
|
||||
Eine einzelne Sitzung anhand der ID von Clerk abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der geheime Clerk-Schlüssel für die API-Authentifizierung |
|
||||
| `sessionId` | string | Ja | Die ID der abzurufenden Sitzung \(z. B. sess_2NNEqL2nrIRdJ194ndJqAHwEfxC\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Sitzungs-ID |
|
||||
| `userId` | string | Benutzer-ID |
|
||||
| `clientId` | string | Client-ID |
|
||||
| `status` | string | Sitzungsstatus |
|
||||
| `lastActiveAt` | number | Zeitstempel der letzten Aktivität |
|
||||
| `lastActiveOrganizationId` | string | ID der zuletzt aktiven Organisation |
|
||||
| `expireAt` | number | Ablaufzeitstempel |
|
||||
| `abandonAt` | number | Zeitstempel für Abbruch |
|
||||
| `createdAt` | number | Erstellungszeitstempel |
|
||||
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
|
||||
### `clerk_revoke_session`
|
||||
|
||||
Eine Sitzung widerrufen, um sie sofort ungültig zu machen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `secretKey` | string | Ja | Der geheime Clerk-Schlüssel für die API-Authentifizierung |
|
||||
| `sessionId` | string | Ja | Die ID der zu widerrufenden Sitzung \(z. B. sess_2NNEqL2nrIRdJ194ndJqAHwEfxC\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Sitzungs-ID |
|
||||
| `userId` | string | Benutzer-ID |
|
||||
| `clientId` | string | Client-ID |
|
||||
| `status` | string | Sitzungsstatus \(sollte widerrufen sein\) |
|
||||
| `lastActiveAt` | number | Zeitstempel der letzten Aktivität |
|
||||
| `lastActiveOrganizationId` | string | ID der zuletzt aktiven Organisation |
|
||||
| `expireAt` | number | Ablaufzeitstempel |
|
||||
| `abandonAt` | number | Zeitstempel für Abbruch |
|
||||
| `createdAt` | number | Erstellungszeitstempel |
|
||||
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
|
||||
| `success` | boolean | Erfolgsstatus der Operation |
|
||||
@@ -354,3 +354,512 @@ Listet alle Confluence-Spaces auf, auf die der Benutzer zugreifen kann.
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `confluence`
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z. B. ihrfirma.atlassian.net) |
|
||||
| `blogPostId` | string | Ja | Die ID des abzurufenden Blogbeitrags |
|
||||
| `bodyFormat` | string | Nein | Format für den Blogbeitrag-Body: storage, atlas_doc_format oder view |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO 8601-Zeitstempel der Operation |
|
||||
| `id` | string | Blogbeitrag-ID |
|
||||
| `title` | string | Blogbeitrag-Titel |
|
||||
| `status` | string | Blogbeitrag-Status |
|
||||
| `spaceId` | string | Space-ID |
|
||||
| `authorId` | string | Konto-ID des Autors |
|
||||
| `createdAt` | string | Erstellungszeitstempel |
|
||||
| `version` | object | Versionsinformationen |
|
||||
| ↳ `number` | number | Versionsnummer |
|
||||
| ↳ `message` | string | Versionsnachricht |
|
||||
| ↳ `minorEdit` | boolean | Ob dies eine geringfügige Bearbeitung ist |
|
||||
| ↳ `authorId` | string | Konto-ID des Versionsautors |
|
||||
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
|
||||
| `body` | object | Blogbeitrag-Body-Inhalt im angeforderten Format |
|
||||
| ↳ `storage` | object | Body im Speicherformat (Confluence-Markup) |
|
||||
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
|
||||
| ↳ `representation` | string | Inhaltsdarstellungstyp |
|
||||
| ↳ `view` | object | Body im Ansichtsformat (gerendertes HTML) |
|
||||
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
|
||||
| ↳ `representation` | string | Inhaltsdarstellungstyp |
|
||||
| ↳ `atlas_doc_format` | object | Body im Atlassian Document Format (ADF) |
|
||||
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
|
||||
| ↳ `representation` | string | Inhaltsdarstellungstyp |
|
||||
| `webUrl` | string | URL zum Anzeigen des Blogbeitrags |
|
||||
|
||||
### `confluence_create_blogpost`
|
||||
|
||||
Erstellen Sie einen neuen Blogbeitrag in einem Confluence-Space.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `spaceId` | string | Ja | Die ID des Spaces, in dem der Blogbeitrag erstellt werden soll |
|
||||
| `title` | string | Ja | Titel des Blogbeitrags |
|
||||
| `content` | string | Ja | Blogbeitrag-Inhalt im Confluence-Speicherformat (HTML) |
|
||||
| `status` | string | Nein | Blogbeitrag-Status: current (Standard) oder draft |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO 8601-Zeitstempel der Operation |
|
||||
| `id` | string | Erstellte Blogbeitrag-ID |
|
||||
| `title` | string | Blogbeitrag-Titel |
|
||||
| `status` | string | Blogbeitrag-Status |
|
||||
| `spaceId` | string | Space-ID |
|
||||
| `authorId` | string | Konto-ID des Autors |
|
||||
| `body` | object | Blogbeitrag-Inhalt |
|
||||
| ↳ `storage` | object | Inhalt im Speicherformat (Confluence-Markup) |
|
||||
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
|
||||
| ↳ `representation` | string | Inhaltsdarstellungstyp |
|
||||
| ↳ `view` | object | Inhalt im Anzeigeformat (gerendertes HTML) |
|
||||
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
|
||||
| ↳ `representation` | string | Inhaltsdarstellungstyp |
|
||||
| ↳ `atlas_doc_format` | object | Inhalt im Atlassian Document Format (ADF) |
|
||||
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
|
||||
| ↳ `representation` | string | Inhaltsdarstellungstyp |
|
||||
| `version` | object | Versionsinformationen des Blogbeitrags |
|
||||
| ↳ `number` | number | Versionsnummer |
|
||||
| ↳ `message` | string | Versionsnachricht |
|
||||
| ↳ `minorEdit` | boolean | Ob dies eine geringfügige Bearbeitung ist |
|
||||
| ↳ `authorId` | string | Konto-ID des Versionsautors |
|
||||
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
|
||||
| `webUrl` | string | URL zum Anzeigen des Blogbeitrags |
|
||||
|
||||
### `confluence_list_blogposts_in_space`
|
||||
|
||||
Listet alle Blogbeiträge innerhalb eines bestimmten Confluence-Spaces auf.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `spaceId` | string | Ja | Die ID des Confluence-Spaces, aus dem Blogbeiträge aufgelistet werden sollen |
|
||||
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Blogbeiträge (Standard: 25, max: 250) |
|
||||
| `status` | string | Nein | Filtern nach Status: current, archived, trashed oder draft |
|
||||
| `bodyFormat` | string | Nein | Format für den Blogbeitrags-Body: storage, atlas_doc_format oder view |
|
||||
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO 8601-Zeitstempel der Operation |
|
||||
| `blogPosts` | array | Array von Blogbeiträgen im Space |
|
||||
| ↳ `id` | string | Blogbeitrags-ID |
|
||||
| ↳ `title` | string | Blogbeitragstitel |
|
||||
| ↳ `status` | string | Blogbeitragsstatus |
|
||||
| ↳ `spaceId` | string | Space-ID |
|
||||
| ↳ `authorId` | string | Konto-ID des Autors |
|
||||
| ↳ `createdAt` | string | Erstellungszeitstempel |
|
||||
| ↳ `version` | object | Versionsinformationen |
|
||||
| ↳ `number` | number | Versionsnummer |
|
||||
| ↳ `message` | string | Versionsnachricht |
|
||||
| ↳ `minorEdit` | boolean | Ob dies eine geringfügige Bearbeitung ist |
|
||||
| ↳ `authorId` | string | Konto-ID des Versionsautors |
|
||||
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
|
||||
| ↳ `body` | object | Blogbeitrags-Body-Inhalt |
|
||||
| ↳ `storage` | object | Body im Speicherformat (Confluence-Markup) |
|
||||
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
|
||||
| ↳ `representation` | string | Inhaltsdarstellungstyp |
|
||||
| ↳ `view` | object | Body im Ansichtsformat (gerendertes HTML) |
|
||||
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
|
||||
| ↳ `representation` | string | Inhaltsdarstellungstyp |
|
||||
| ↳ `atlas_doc_format` | object | Body im Atlassian Document Format (ADF) |
|
||||
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
|
||||
| ↳ `representation` | string | Inhaltsdarstellungstyp |
|
||||
| ↳ `webUrl` | string | URL zum Anzeigen des Blogbeitrags |
|
||||
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
|
||||
|
||||
### `confluence_create_comment`
|
||||
|
||||
Fügen Sie einen Kommentar zu einer Confluence-Seite hinzu.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `pageId` | string | Ja | Confluence-Seiten-ID, zu der ein Kommentar hinzugefügt werden soll |
|
||||
| `comment` | string | Ja | Kommentartext im Confluence-Speicherformat |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | Zeitstempel der Erstellung |
|
||||
| `commentId` | string | Erstellte Kommentar-ID |
|
||||
| `pageId` | string | Seiten-ID |
|
||||
|
||||
### `confluence_list_comments`
|
||||
|
||||
Listen Sie alle Kommentare auf einer Confluence-Seite auf.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `pageId` | string | Ja | Confluence-Seiten-ID, von der Kommentare aufgelistet werden sollen |
|
||||
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Kommentare (Standard: 25) |
|
||||
| `bodyFormat` | string | Nein | Format für den Kommentartext: storage, atlas_doc_format, view oder export_view (Standard: storage) |
|
||||
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO 8601-Zeitstempel der Operation |
|
||||
| `comments` | array | Array von Confluence-Kommentaren |
|
||||
| ↳ `id` | string | Eindeutige Kommentar-ID |
|
||||
| ↳ `status` | string | Kommentarstatus (z. B. current) |
|
||||
| ↳ `title` | string | Kommentartitel |
|
||||
| ↳ `pageId` | string | ID der Seite, zu der der Kommentar gehört |
|
||||
| ↳ `blogPostId` | string | ID des Blogposts, zu dem der Kommentar gehört |
|
||||
| ↳ `parentCommentId` | string | ID des übergeordneten Kommentars |
|
||||
| ↳ `body` | object | Kommentarinhalt |
|
||||
| ↳ `value` | string | Kommentarinhalt |
|
||||
| ↳ `representation` | string | Format der Inhaltsdarstellung (z. B. storage, view) |
|
||||
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Kommentarerstellung |
|
||||
| ↳ `authorId` | string | Account-ID des Kommentarautors |
|
||||
| ↳ `version` | object | Versionsinformationen des Kommentars |
|
||||
| ↳ `number` | number | Versionsnummer |
|
||||
| ↳ `message` | string | Versionsnachricht |
|
||||
| ↳ `minorEdit` | boolean | Ob es sich um eine geringfügige Bearbeitung handelt |
|
||||
| ↳ `authorId` | string | Account-ID des Versionsautors |
|
||||
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
|
||||
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
|
||||
|
||||
### `confluence_update_comment`
|
||||
|
||||
Aktualisiert einen vorhandenen Kommentar auf einer Confluence-Seite.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `commentId` | string | Ja | Confluence-Kommentar-ID zum Aktualisieren |
|
||||
| `comment` | string | Ja | Aktualisierter Kommentartext im Confluence-Speicherformat |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | Zeitstempel der Aktualisierung |
|
||||
| `commentId` | string | Aktualisierte Kommentar-ID |
|
||||
| `updated` | boolean | Aktualisierungsstatus |
|
||||
|
||||
### `confluence_delete_comment`
|
||||
|
||||
Löscht einen Kommentar von einer Confluence-Seite.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `commentId` | string | Ja | Confluence-Kommentar-ID zum Löschen |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | Zeitstempel der Löschung |
|
||||
| `commentId` | string | Gelöschte Kommentar-ID |
|
||||
| `deleted` | boolean | Löschstatus |
|
||||
|
||||
### `confluence_upload_attachment`
|
||||
|
||||
Laden Sie eine Datei als Anhang zu einer Confluence-Seite hoch.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z. B. ihrfirma.atlassian.net) |
|
||||
| `pageId` | string | Ja | Confluence-Seiten-ID, an die die Datei angehängt werden soll |
|
||||
| `file` | file | Ja | Die als Anhang hochzuladende Datei |
|
||||
| `fileName` | string | Nein | Optionaler benutzerdefinierter Dateiname für den Anhang |
|
||||
| `comment` | string | Nein | Optionaler Kommentar zum Anhang |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | Zeitstempel des Uploads |
|
||||
| `attachmentId` | string | Hochgeladene Anhangs-ID |
|
||||
| `title` | string | Dateiname des Anhangs |
|
||||
| `fileSize` | number | Dateigröße in Bytes |
|
||||
| `mediaType` | string | MIME-Typ des Anhangs |
|
||||
| `downloadUrl` | string | Download-URL für den Anhang |
|
||||
| `pageId` | string | Seiten-ID, zu der der Anhang hinzugefügt wurde |
|
||||
|
||||
### `confluence_list_attachments`
|
||||
|
||||
Listen Sie alle Anhänge auf einer Confluence-Seite auf.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z. B. ihrfirma.atlassian.net) |
|
||||
| `pageId` | string | Ja | Confluence-Seiten-ID, von der Anhänge aufgelistet werden sollen |
|
||||
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Anhänge (Standard: 50, max: 250) |
|
||||
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO 8601-Zeitstempel der Operation |
|
||||
| `attachments` | array | Array von Confluence-Anhängen |
|
||||
| ↳ `id` | string | Eindeutige Anhangs-ID (mit Präfix "att") |
|
||||
| ↳ `title` | string | Dateiname des Anhangs |
|
||||
| ↳ `status` | string | Anhangsstatus (z. B. current, archived, trashed) |
|
||||
| ↳ `mediaType` | string | MIME-Typ des Anhangs |
|
||||
| ↳ `fileSize` | number | Dateigröße in Bytes |
|
||||
| ↳ `downloadUrl` | string | URL zum Herunterladen des Anhangs |
|
||||
| ↳ `webuiUrl` | string | URL zum Anzeigen des Anhangs in der Confluence-Oberfläche |
|
||||
| ↳ `pageId` | string | ID der Seite, zu der der Anhang gehört |
|
||||
| ↳ `blogPostId` | string | ID des Blogbeitrags, zu dem der Anhang gehört |
|
||||
| ↳ `comment` | string | Kommentar/Beschreibung des Anhangs |
|
||||
| ↳ `version` | object | Versionsinformationen des Anhangs |
|
||||
| ↳ `number` | number | Versionsnummer |
|
||||
| ↳ `message` | string | Versionsnachricht |
|
||||
| ↳ `minorEdit` | boolean | Ob es sich um eine geringfügige Bearbeitung handelt |
|
||||
| ↳ `authorId` | string | Konto-ID des Versionsautors |
|
||||
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
|
||||
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
|
||||
|
||||
### `confluence_delete_attachment`
|
||||
|
||||
Löschen eines Anhangs von einer Confluence-Seite (verschiebt ihn in den Papierkorb).
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `attachmentId` | string | Ja | Confluence-Anhangs-ID zum Löschen |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | Zeitstempel der Löschung |
|
||||
| `attachmentId` | string | Gelöschte Anhangs-ID |
|
||||
| `deleted` | boolean | Löschstatus |
|
||||
|
||||
### `confluence_list_labels`
|
||||
|
||||
Alle Labels auf einer Confluence-Seite auflisten.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `pageId` | string | Ja | Confluence-Seiten-ID, von der Labels aufgelistet werden sollen |
|
||||
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Labels (Standard: 25, max: 250) |
|
||||
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | Zeitstempel des Abrufs |
|
||||
| `labels` | array | Array von Labels auf der Seite |
|
||||
| ↳ `id` | string | Eindeutige Label-ID |
|
||||
| ↳ `name` | string | Label-Name |
|
||||
| ↳ `prefix` | string | Label-Präfix/Typ (z.B. global, my, team) |
|
||||
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
|
||||
|
||||
### `confluence_add_label`
|
||||
|
||||
Fügen Sie einer Confluence-Seite ein Label zur Organisation und Kategorisierung hinzu.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `pageId` | string | Ja | Confluence-Seiten-ID, zu der das Label hinzugefügt werden soll |
|
||||
| `labelName` | string | Ja | Name des hinzuzufügenden Labels |
|
||||
| `prefix` | string | Nein | Label-Präfix: global (Standard), my, team oder system |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO 8601-Zeitstempel der Operation |
|
||||
| `pageId` | string | Seiten-ID, zu der das Label hinzugefügt wurde |
|
||||
| `labelName` | string | Name des hinzugefügten Labels |
|
||||
| `labelId` | string | ID des hinzugefügten Labels |
|
||||
|
||||
### `confluence_delete_label`
|
||||
|
||||
Entfernen Sie ein Label von einer Confluence-Seite.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `pageId` | string | Ja | Confluence-Seiten-ID, von der das Label entfernt werden soll |
|
||||
| `labelName` | string | Ja | Name des zu entfernenden Labels |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO 8601-Zeitstempel der Operation |
|
||||
| `pageId` | string | Seiten-ID, von der das Label entfernt wurde |
|
||||
| `labelName` | string | Name des entfernten Labels |
|
||||
| `deleted` | boolean | Löschstatus |
|
||||
|
||||
### `confluence_get_pages_by_label`
|
||||
|
||||
Ruft alle Seiten ab, auf die ein bestimmtes Label angewendet wurde.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z. B. ihrfirma.atlassian.net) |
|
||||
| `labelId` | string | Ja | Die ID des Labels, für das Seiten abgerufen werden sollen |
|
||||
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Seiten (Standard: 50, max: 250) |
|
||||
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO 8601-Zeitstempel der Operation |
|
||||
| `labelId` | string | ID des Labels |
|
||||
| `pages` | array | Array von Seiten mit diesem Label |
|
||||
| ↳ `id` | string | Eindeutige Seitenkennung |
|
||||
| ↳ `title` | string | Seitentitel |
|
||||
| ↳ `status` | string | Seitenstatus (z. B. current, archived, trashed, draft) |
|
||||
| ↳ `spaceId` | string | ID des Spaces, der die Seite enthält |
|
||||
| ↳ `parentId` | string | ID der übergeordneten Seite (null bei oberster Ebene) |
|
||||
| ↳ `authorId` | string | Account-ID des Seitenautors |
|
||||
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Seitenerstellung |
|
||||
| ↳ `version` | object | Seitenversionsinformationen |
|
||||
| ↳ `number` | number | Versionsnummer |
|
||||
| ↳ `message` | string | Versionsnachricht |
|
||||
| ↳ `minorEdit` | boolean | Ob dies eine geringfügige Bearbeitung ist |
|
||||
| ↳ `authorId` | string | Account-ID des Versionsautors |
|
||||
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
|
||||
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
|
||||
|
||||
### `confluence_list_space_labels`
|
||||
|
||||
Alle Labels auflisten, die mit einem Confluence-Space verknüpft sind.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `spaceId` | string | Ja | Die ID des Confluence-Space, von dem Labels aufgelistet werden sollen |
|
||||
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Labels (Standard: 25, max: 250) |
|
||||
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO 8601-Zeitstempel der Operation |
|
||||
| `spaceId` | string | ID des Space |
|
||||
| `labels` | array | Array von Labels im Space |
|
||||
| ↳ `id` | string | Eindeutige Label-ID |
|
||||
| ↳ `name` | string | Label-Name |
|
||||
| ↳ `prefix` | string | Label-Präfix/Typ (z.B. global, my, team) |
|
||||
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
|
||||
|
||||
### `confluence_get_space`
|
||||
|
||||
Details zu einem bestimmten Confluence-Space abrufen.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
|
||||
| `spaceId` | string | Ja | Confluence-Space-ID zum Abrufen |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO 8601-Zeitstempel der Operation |
|
||||
| `spaceId` | string | Space-ID |
|
||||
| `name` | string | Space-Name |
|
||||
| `key` | string | Space-Schlüssel |
|
||||
| `type` | string | Space-Typ (global, personal) |
|
||||
| `status` | string | Space-Status (current, archived) |
|
||||
| `url` | string | URL zum Anzeigen des Space in Confluence |
|
||||
| `authorId` | string | Account-ID des Space-Erstellers |
|
||||
| `createdAt` | string | ISO 8601-Zeitstempel der Space-Erstellung |
|
||||
| `homepageId` | string | ID der Space-Startseite |
|
||||
| `description` | object | Space-Beschreibungsinhalt |
|
||||
| ↳ `value` | string | Beschreibungstext |
|
||||
| ↳ `representation` | string | Format der Inhaltsdarstellung (z. B. plain, view, storage) |
|
||||
|
||||
### `confluence_list_spaces`
|
||||
|
||||
Listet alle Confluence-Spaces auf, auf die der Benutzer zugreifen kann.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `domain` | string | Ja | Ihre Confluence-Domain (z. B. ihrfirma.atlassian.net) |
|
||||
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Spaces (Standard: 25, max: 250) |
|
||||
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
|
||||
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `ts` | string | ISO-8601-Zeitstempel der Operation |
|
||||
| `spaces` | array | Array von Confluence-Spaces |
|
||||
| ↳ `id` | string | Eindeutige Space-ID |
|
||||
| ↳ `key` | string | Space-Schlüssel \(Kurzbezeichner für URLs\) |
|
||||
| ↳ `name` | string | Space-Name |
|
||||
| ↳ `type` | string | Space-Typ \(z. B. global, personal\) |
|
||||
| ↳ `status` | string | Space-Status \(z. B. current, archived\) |
|
||||
| ↳ `authorId` | string | Account-ID des Space-Erstellers |
|
||||
| ↳ `createdAt` | string | ISO-8601-Zeitstempel der Space-Erstellung |
|
||||
| ↳ `homepageId` | string | ID der Space-Startseite |
|
||||
| ↳ `description` | object | Space-Beschreibung |
|
||||
| ↳ `value` | string | Beschreibungstext |
|
||||
| ↳ `representation` | string | Format der Inhaltsdarstellung \(z. B. plain, view, storage\) |
|
||||
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
|
||||
|
||||
@@ -168,15 +168,3 @@ Löscht einen Cloud-Agenten dauerhaft. Diese Aktion kann nicht rückgängig gema
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Cursor API-Schlüssel |
|
||||
| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `content` | string | Erfolgsmeldung |
|
||||
| `metadata` | object | Ergebnis-Metadaten |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `cursor`
|
||||
|
||||
@@ -295,8 +295,3 @@ Eine geplante Ausfallzeit abbrechen.
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `success` | boolean | Ob die Ausfallzeit erfolgreich abgebrochen wurde |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `datadog`
|
||||
|
||||
@@ -730,8 +730,3 @@ Einen Discord-Webhook löschen
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `message` | string | Erfolgs- oder Fehlermeldung |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `discord`
|
||||
|
||||
@@ -212,8 +212,3 @@ Suche nach Dateien und Ordnern in Dropbox
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `matches` | array | Suchergebnisse |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `dropbox`
|
||||
|
||||
107
apps/docs/content/docs/de/tools/dspy.mdx
Normal file
107
apps/docs/content/docs/de/tools/dspy.mdx
Normal file
@@ -0,0 +1,107 @@
|
||||
---
|
||||
title: DSPy
|
||||
description: Führen Sie Vorhersagen mit selbst gehosteten DSPy-Programmen aus
|
||||
---
|
||||
|
||||
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||
|
||||
<BlockInfoCard
|
||||
type="dspy"
|
||||
color="#E0E0E0"
|
||||
/>
|
||||
|
||||
{/* MANUAL-CONTENT-START:intro */}
|
||||
[DSPy](https://github.com/stanford-oval/dspy) ist ein Open-Source-Framework für die Programmierung – statt Prompting – von Sprachmodellen. DSPy ermöglicht es Ihnen, interpretierbare und modulare LLM-gestützte Agenten mithilfe von Python-Funktionen, strukturierten Modulen und deklarativen Signaturen zu erstellen, wodurch es einfach wird, Sprachmodellanwendungen zu komponieren, zu debuggen und zuverlässig bereitzustellen.
|
||||
|
||||
Mit DSPy in Sim können Sie:
|
||||
|
||||
- **Benutzerdefinierte Vorhersagen ausführen**: Verbinden Sie Ihren selbst gehosteten DSPy-Server und rufen Sie Vorhersage-Endpunkte für eine Vielzahl von natürlichsprachlichen Aufgaben auf.
|
||||
- **Chain of Thought und ReAct-Reasoning**: Nutzen Sie fortgeschrittene DSPy-Module für schrittweises Reasoning, mehrstufige Dialoge und Action-Observation-Schleifen.
|
||||
- **Integration in Ihre Workflows**: Automatisieren Sie LLM-Vorhersagen und Reasoning als Teil jeder Sim-Automatisierung oder Agentenroutine.
|
||||
- **Benutzerdefinierte Endpunkte und Kontext bereitstellen**: Rufen Sie flexibel Ihre eigenen DSPy-gestützten APIs mit benutzerdefinierter Authentifizierung, Endpunkten, Eingabefeldern und Kontext auf.
|
||||
|
||||
Diese Funktionen ermöglichen es Ihren Sim-Agenten, auf modulare, interpretierbare LLM-basierte Programme für Aufgaben wie Fragebeantwortung, Dokumentenanalyse, Entscheidungsunterstützung und mehr zuzugreifen – wobei Sie die Kontrolle über das Modell, die Daten und die Logik behalten.
|
||||
{/* MANUAL-CONTENT-END */}
|
||||
|
||||
## Nutzungsanweisungen
|
||||
|
||||
Integrieren Sie sich mit Ihren selbst gehosteten DSPy-Programmen für LLM-gestützte Vorhersagen. Unterstützt Predict, Chain of Thought und ReAct-Agenten. DSPy ist das Framework für die Programmierung – nicht das Prompting – von Sprachmodellen.
|
||||
|
||||
## Tools
|
||||
|
||||
### `dspy_predict`
|
||||
|
||||
Führen Sie eine Vorhersage mit einem selbst gehosteten DSPy-Programm-Endpunkt aus
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `baseUrl` | string | Ja | Basis-URL des DSPy-Servers \(z. B. https://your-dspy-server.com\) |
|
||||
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung \(falls von Ihrem Server erforderlich\) |
|
||||
| `endpoint` | string | Nein | API-Endpunkt-Pfad \(Standard ist /predict\) |
|
||||
| `input` | string | Ja | Der Eingabetext, der an das DSPy-Programm gesendet werden soll |
|
||||
| `inputField` | string | Nein | Name des Eingabefelds, das vom DSPy-Programm erwartet wird \(Standard ist "text"\) |
|
||||
| `context` | string | Nein | Zusätzlicher Kontext, der dem DSPy-Programm bereitgestellt werden soll |
|
||||
| `additionalInputs` | json | Nein | Zusätzliche Schlüssel-Wert-Paare, die in den Request-Body aufgenommen werden sollen |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `answer` | string | Die Hauptausgabe/Antwort des DSPy-Programms |
|
||||
| `reasoning` | string | Die Begründung oder Erklärung hinter der Antwort \(falls verfügbar\) |
|
||||
| `status` | string | Antwortstatus vom DSPy-Server \(Erfolg oder Fehler\) |
|
||||
| `rawOutput` | json | Die vollständige Rohausgabe des DSPy-Programms \(result.toDict\(\)\) |
|
||||
|
||||
### `dspy_chain_of_thought`
|
||||
|
||||
Führen Sie eine Chain of Thought-Vorhersage mit einem selbst gehosteten DSPy ChainOfThought-Programm-Endpunkt aus
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `baseUrl` | string | Ja | Basis-URL des DSPy-Servers \(z. B. https://your-dspy-server.com\) |
|
||||
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung \(falls von Ihrem Server erforderlich\) |
|
||||
| `endpoint` | string | Nein | API-Endpunkt-Pfad \(Standard ist /predict\) |
|
||||
| `question` | string | Ja | Die Frage, die mithilfe von Chain of Thought-Reasoning beantwortet werden soll |
|
||||
| `context` | string | Nein | Zusätzlicher Kontext zur Beantwortung der Frage |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `answer` | string | Die durch Chain of Thought-Reasoning generierte Antwort |
|
||||
| `reasoning` | string | Die schrittweise Begründung, die zur Antwort geführt hat |
|
||||
| `status` | string | Antwortstatus vom DSPy-Server \(Erfolg oder Fehler\) |
|
||||
| `rawOutput` | json | Die vollständige Rohausgabe des DSPy-Programms \(result.toDict\(\)\) |
|
||||
|
||||
### `dspy_react`
|
||||
|
||||
Führen Sie einen ReAct-Agenten mit einem selbst gehosteten DSPy ReAct-Programm-Endpunkt für mehrstufiges Denken und Handeln aus
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `baseUrl` | string | Ja | Basis-URL des DSPy-Servers \(z. B. https://your-dspy-server.com\) |
|
||||
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung \(falls von Ihrem Server erforderlich\) |
|
||||
| `endpoint` | string | Nein | API-Endpunkt-Pfad \(Standardwert: /predict\) |
|
||||
| `task` | string | Ja | Die Aufgabe oder Frage, an der der ReAct-Agent arbeiten soll |
|
||||
| `context` | string | Nein | Zusätzlicher Kontext für die Aufgabe |
|
||||
| `maxIterations` | number | Nein | Maximale Anzahl von Denkiterationen \(Standardwert: Servereinstellung\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `answer` | string | Die endgültige Antwort oder das Ergebnis des ReAct-Agenten |
|
||||
| `reasoning` | string | Die Gesamtzusammenfassung des Denkprozesses des Agenten |
|
||||
| `trajectory` | array | Der schrittweise Verlauf von Gedanken, Aktionen und Beobachtungen |
|
||||
| ↳ `thought` | string | Der Denkprozess in diesem Schritt |
|
||||
| ↳ `toolName` | string | Der Name des aufgerufenen Tools/der Aktion |
|
||||
| ↳ `toolArgs` | json | An das Tool übergebene Argumente |
|
||||
| ↳ `observation` | string | Die Beobachtung/das Ergebnis der Tool-Ausführung |
|
||||
| `status` | string | Antwortstatus vom DSPy-Server \(Erfolg oder Fehler\) |
|
||||
| `rawOutput` | json | Die vollständige Rohausgabe des DSPy-Programms \(result.toDict\(\)\) |
|
||||
@@ -56,8 +56,3 @@ Durchsuche das Web mit der DuckDuckGo Instant Answers API. Liefert sofortige Ant
|
||||
| `answerType` | string | Typ der Antwort \(z.B. calc, ip, usw.\) |
|
||||
| `type` | string | Antworttyp: A \(Artikel\), D \(Begriffsklärung\), C \(Kategorie\), N \(Name\), E \(Exklusiv\) |
|
||||
| `relatedTopics` | array | Array verwandter Themen mit URLs und Beschreibungen |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `duckduckgo`
|
||||
|
||||
@@ -186,3 +186,20 @@ Ein Element aus einer DynamoDB-Tabelle löschen
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `dynamodb`
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `region` | string | Ja | AWS-Region (z.B. us-east-1) |
|
||||
| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID |
|
||||
| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel |
|
||||
| `tableName` | string | Nein | Optionaler Tabellenname, um ein detailliertes Schema zu erhalten (z.B. "Users", "Orders"). Wenn nicht angegeben, werden alle Tabellen aufgelistet. |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `message` | string | Statusmeldung der Operation |
|
||||
| `tables` | array | Liste der Tabellennamen in der Region |
|
||||
| `tableDetails` | object | Detaillierte Schemainformationen für eine bestimmte Tabelle |
|
||||
|
||||
@@ -363,3 +363,22 @@ Erhalte umfassende Statistiken über den Elasticsearch-Cluster.
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `elasticsearch`
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `deploymentType` | string | Ja | Bereitstellungstyp: self_hosted oder cloud |
|
||||
| `host` | string | Nein | Elasticsearch-Host-URL \(für self-hosted\) |
|
||||
| `cloudId` | string | Nein | Elastic Cloud ID \(für Cloud-Bereitstellungen\) |
|
||||
| `authMethod` | string | Ja | Authentifizierungsmethode: api_key oder basic_auth |
|
||||
| `apiKey` | string | Nein | Elasticsearch API-Schlüssel |
|
||||
| `username` | string | Nein | Benutzername für Basic-Auth |
|
||||
| `password` | string | Nein | Passwort für Basic-Auth |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `message` | string | Zusammenfassende Nachricht über die Indizes |
|
||||
| `indices` | json | Array von Indexinformationsobjekten |
|
||||
|
||||
@@ -49,8 +49,3 @@ TTS mit ElevenLabs-Stimmen konvertieren
|
||||
| --------- | ---- | ----------- |
|
||||
| `audioUrl` | string | Die URL der generierten Audiodatei |
|
||||
| `audioFile` | file | Die generierte Audiodatei |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `elevenlabs`
|
||||
|
||||
925
apps/docs/content/docs/de/tools/enrich.mdx
Normal file
925
apps/docs/content/docs/de/tools/enrich.mdx
Normal file
@@ -0,0 +1,925 @@
|
||||
---
|
||||
title: Enrich
|
||||
description: B2B-Datenanreicherung und LinkedIn-Intelligence mit Enrich.so
|
||||
---
|
||||
|
||||
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||
|
||||
<BlockInfoCard
|
||||
type="enrich"
|
||||
color="#E5E5E6"
|
||||
/>
|
||||
|
||||
{/* MANUAL-CONTENT-START:intro */}
|
||||
[Enrich.so](https://enrich.so/) liefert präzise B2B-Datenanreicherung und LinkedIn-Intelligence in Echtzeit. Die Plattform bietet dynamischen Zugriff auf öffentliche und strukturierte Unternehmens-, Kontakt- und berufliche Informationen und ermöglicht es Teams, umfassendere Profile zu erstellen, die Lead-Qualität zu verbessern und effektivere Kontaktaufnahmen durchzuführen.
|
||||
|
||||
Mit Enrich.so können Sie:
|
||||
|
||||
- **Kontakt- und Unternehmensprofile anreichern**: Entdecken Sie sofort wichtige Datenpunkte für Leads, Interessenten und Unternehmen – nur mit einer E-Mail-Adresse oder einem LinkedIn-Profil.
|
||||
- **E-Mail-Zustellbarkeit überprüfen**: Prüfen Sie, ob E-Mail-Adressen gültig, zustellbar und sicher zu kontaktieren sind, bevor Sie versenden.
|
||||
- **Geschäftliche und private E-Mails finden**: Identifizieren Sie fehlende geschäftliche E-Mails aus einem LinkedIn-Profil oder private E-Mails, um Ihre Reichweite zu erweitern.
|
||||
- **Telefonnummern und Social-Media-Profile aufdecken**: Erschließen Sie zusätzliche Kommunikationskanäle für Kontakte durch Anreicherungstools.
|
||||
- **LinkedIn-Beiträge und Engagement analysieren**: Extrahieren Sie Erkenntnisse über Reichweite, Reaktionen und Zielgruppe aus öffentlichen LinkedIn-Inhalten.
|
||||
- **Erweiterte Personen- und Unternehmenssuche durchführen**: Ermöglichen Sie Ihren Agenten, Unternehmen und Fachkräfte anhand detaillierter Filter und Echtzeit-Intelligence zu finden.
|
||||
|
||||
Die Sim-Integration mit Enrich.so befähigt Ihre Agenten und Automatisierungen, B2B-Daten sofort abzufragen, anzureichern und zu validieren, wodurch die Produktivität in Workflows wie Vertriebsakquise, Recruiting, Marketing-Operations und mehr gesteigert wird. Die Kombination der Orchestrierungsfähigkeiten von Sim mit Enrich.so ermöglicht intelligentere, datengesteuerte Automatisierungsstrategien, die durch erstklassige B2B-Intelligence unterstützt werden.
|
||||
{/* MANUAL-CONTENT-END */}
|
||||
|
||||
## Nutzungsanleitung
|
||||
|
||||
Greifen Sie auf B2B-Daten-Intelligence in Echtzeit mit Enrich.so zu. Reichern Sie Profile aus E-Mail-Adressen an, finden Sie geschäftliche E-Mails aus LinkedIn, überprüfen Sie die E-Mail-Zustellbarkeit, suchen Sie nach Personen und Unternehmen und analysieren Sie das Engagement von LinkedIn-Beiträgen.
|
||||
|
||||
## Tools
|
||||
|
||||
### `enrich_check_credits`
|
||||
|
||||
Überprüfen Sie Ihre Enrich API-Guthaben-Nutzung und Ihr verbleibendes Guthaben.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `totalCredits` | number | Dem Konto insgesamt zugewiesene Credits |
|
||||
| `creditsUsed` | number | Bisher verbrauchte Credits |
|
||||
| `creditsRemaining` | number | Verbleibende verfügbare Credits |
|
||||
|
||||
### `enrich_email_to_profile`
|
||||
|
||||
Rufen Sie detaillierte LinkedIn-Profilinformationen über eine E-Mail-Adresse ab, einschließlich Berufserfahrung, Ausbildung und Fähigkeiten.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `email` | string | Ja | E-Mail-Adresse für die Suche \(z. B. john.doe@company.com\) |
|
||||
| `inRealtime` | boolean | Nein | Auf true setzen, um aktuelle Daten abzurufen und zwischengespeicherte Informationen zu umgehen |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `displayName` | string | Vollständiger Anzeigename |
|
||||
| `firstName` | string | Vorname |
|
||||
| `lastName` | string | Nachname |
|
||||
| `headline` | string | Berufliche Überschrift |
|
||||
| `occupation` | string | Aktuelle Tätigkeit |
|
||||
| `summary` | string | Profilzusammenfassung |
|
||||
| `location` | string | Standort |
|
||||
| `country` | string | Land |
|
||||
| `linkedInUrl` | string | LinkedIn-Profil-URL |
|
||||
| `photoUrl` | string | Profilfoto-URL |
|
||||
| `connectionCount` | number | Anzahl der Kontakte |
|
||||
| `isConnectionCountObfuscated` | boolean | Ob die Kontaktanzahl verschleiert ist \(500+\) |
|
||||
| `positionHistory` | array | Berufserfahrung |
|
||||
| ↳ `title` | string | Berufsbezeichnung |
|
||||
| ↳ `company` | string | Firmenname |
|
||||
| ↳ `startDate` | string | Startdatum |
|
||||
| ↳ `endDate` | string | Enddatum |
|
||||
| ↳ `location` | string | Standort |
|
||||
| `education` | array | Ausbildungsverlauf |
|
||||
| ↳ `school` | string | Schulname |
|
||||
| ↳ `degree` | string | Abschluss |
|
||||
| ↳ `fieldOfStudy` | string | Studienrichtung |
|
||||
| ↳ `startDate` | string | Startdatum |
|
||||
| ↳ `endDate` | string | Enddatum |
|
||||
| `certifications` | array | Berufliche Zertifizierungen |
|
||||
| ↳ `name` | string | Zertifizierungsname |
|
||||
| ↳ `authority` | string | Ausstellende Behörde |
|
||||
| ↳ `url` | string | Zertifizierungs-URL |
|
||||
| `skills` | array | Liste der Fähigkeiten |
|
||||
| `languages` | array | Liste der Sprachen |
|
||||
| `locale` | string | Profil-Locale \(z. B. en_US\) |
|
||||
| `version` | number | Profilversionsnummer |
|
||||
|
||||
### `enrich_email_to_person_lite`
|
||||
|
||||
Rufen Sie grundlegende LinkedIn-Profilinformationen über eine E-Mail-Adresse ab. Eine schlankere Version mit nur den wichtigsten Daten.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `email` | string | Ja | E-Mail-Adresse für die Suche \(z. B. john.doe@company.com\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `name` | string | Vollständiger Name |
|
||||
| `firstName` | string | Vorname |
|
||||
| `lastName` | string | Nachname |
|
||||
| `email` | string | E-Mail-Adresse |
|
||||
| `title` | string | Berufsbezeichnung |
|
||||
| `location` | string | Standort |
|
||||
| `company` | string | Aktuelles Unternehmen |
|
||||
| `companyLocation` | string | Unternehmensstandort |
|
||||
| `companyLinkedIn` | string | LinkedIn-URL des Unternehmens |
|
||||
| `profileId` | string | LinkedIn-Profil-ID |
|
||||
| `schoolName` | string | Schulname |
|
||||
| `schoolUrl` | string | Schul-URL |
|
||||
| `linkedInUrl` | string | LinkedIn-Profil-URL |
|
||||
| `photoUrl` | string | Profilfoto-URL |
|
||||
| `followerCount` | number | Anzahl der Follower |
|
||||
| `connectionCount` | number | Anzahl der Kontakte |
|
||||
| `languages` | array | Gesprochene Sprachen |
|
||||
| `projects` | array | Projekte |
|
||||
| `certifications` | array | Zertifizierungen |
|
||||
| `volunteerExperience` | array | Ehrenamtliche Tätigkeiten |
|
||||
|
||||
### `enrich_linkedin_profile`
|
||||
|
||||
Reichern Sie eine LinkedIn-Profil-URL mit detaillierten Informationen an, einschließlich Positionen, Ausbildung und Social-Media-Kennzahlen.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `url` | string | Ja | LinkedIn-Profil-URL \(z. B. linkedin.com/in/williamhgates\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `profileId` | string | LinkedIn-Profil-ID |
|
||||
| `firstName` | string | Vorname |
|
||||
| `lastName` | string | Nachname |
|
||||
| `subTitle` | string | Profil-Untertitel/Überschrift |
|
||||
| `profilePicture` | string | Profilbild-URL |
|
||||
| `backgroundImage` | string | Hintergrundbild-URL |
|
||||
| `industry` | string | Branche |
|
||||
| `location` | string | Standort |
|
||||
| `followersCount` | number | Anzahl der Follower |
|
||||
| `connectionsCount` | number | Anzahl der Kontakte |
|
||||
| `premium` | boolean | Ob das Konto Premium ist |
|
||||
| `influencer` | boolean | Ob das Konto ein Influencer ist |
|
||||
| `positions` | array | Berufspositionen |
|
||||
| ↳ `title` | string | Berufsbezeichnung |
|
||||
| ↳ `company` | string | Firmenname |
|
||||
| ↳ `companyLogo` | string | Firmenlogo-URL |
|
||||
| ↳ `startDate` | string | Startdatum |
|
||||
| ↳ `endDate` | string | Enddatum |
|
||||
| ↳ `location` | string | Standort |
|
||||
| `education` | array | Bildungshistorie |
|
||||
| ↳ `school` | string | Schulname |
|
||||
| ↳ `degree` | string | Abschluss |
|
||||
| ↳ `fieldOfStudy` | string | Studienrichtung |
|
||||
| ↳ `startDate` | string | Startdatum |
|
||||
| ↳ `endDate` | string | Enddatum |
|
||||
| `websites` | array | Persönliche Websites |
|
||||
|
||||
### `enrich_find_email`
|
||||
|
||||
Person finden
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `fullName` | string | Ja | Vollständiger Name der Person \(z. B. Max Mustermann\) |
|
||||
| `companyDomain` | string | Ja | Unternehmens-Domain \(z. B. beispiel.de\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `email` | string | Gefundene E-Mail-Adresse |
|
||||
| `firstName` | string | Vorname |
|
||||
| `lastName` | string | Nachname |
|
||||
| `domain` | string | Unternehmens-Domain |
|
||||
| `found` | boolean | Ob eine E-Mail gefunden wurde |
|
||||
| `acceptAll` | boolean | Ob die Domain alle E-Mails akzeptiert |
|
||||
|
||||
### `enrich_linkedin_to_work_email`
|
||||
|
||||
Geschäftliche E-Mail-Adresse aus einer LinkedIn-Profil-URL finden.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `linkedinProfile` | string | Ja | LinkedIn-Profil-URL \(z. B. https://www.linkedin.com/in/williamhgates\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `email` | string | Gefundene geschäftliche E-Mail-Adresse |
|
||||
| `found` | boolean | Ob eine E-Mail gefunden wurde |
|
||||
| `status` | string | Anfragestatus \(in_progress oder completed\) |
|
||||
|
||||
### `enrich_linkedin_to_personal_email`
|
||||
|
||||
Private E-Mail-Adresse aus einer LinkedIn-Profil-URL finden.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `linkedinProfile` | string | Ja | LinkedIn-Profil-URL \(z. B. linkedin.com/in/benutzername\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `email` | string | Persönliche E-Mail-Adresse |
|
||||
| `found` | boolean | Ob eine E-Mail-Adresse gefunden wurde |
|
||||
| `status` | string | Anfragestatus |
|
||||
|
||||
### `enrich_phone_finder`
|
||||
|
||||
Finden Sie eine Telefonnummer anhand einer LinkedIn-Profil-URL.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `linkedinProfile` | string | Ja | LinkedIn-Profil-URL \(z. B. linkedin.com/in/williamhgates\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `profileUrl` | string | LinkedIn-Profil-URL |
|
||||
| `mobileNumber` | string | Gefundene Mobiltelefonnummer |
|
||||
| `found` | boolean | Ob eine Telefonnummer gefunden wurde |
|
||||
| `status` | string | Anfragestatus \(in_progress oder completed\) |
|
||||
|
||||
### `enrich_email_to_phone`
|
||||
|
||||
Finden Sie eine Telefonnummer, die mit einer E-Mail-Adresse verknüpft ist.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `email` | string | Ja | Zu suchende E-Mail-Adresse \(z. B. john.doe@example.com\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `email` | string | Nachgeschlagene E-Mail-Adresse |
|
||||
| `mobileNumber` | string | Gefundene Mobiltelefonnummer |
|
||||
| `found` | boolean | Ob eine Telefonnummer gefunden wurde |
|
||||
| `status` | string | Anfragestatus \(in_progress oder completed\) |
|
||||
|
||||
### `enrich_verify_email`
|
||||
|
||||
Überprüfen Sie eine E-Mail-Adresse auf Zustellbarkeit, einschließlich Catch-All-Erkennung und Anbieteridentifikation.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `email` | string | Ja | Zu überprüfende E-Mail-Adresse \(z. B. john.doe@example.com\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `email` | string | Überprüfte E-Mail-Adresse |
|
||||
| `status` | string | Überprüfungsstatus |
|
||||
| `result` | string | Zustellbarkeitsergebnis \(deliverable, undeliverable usw.\) |
|
||||
| `confidenceScore` | number | Konfidenzwert \(0-100\) |
|
||||
| `smtpProvider` | string | E-Mail-Dienstanbieter \(z. B. Google, Microsoft\) |
|
||||
| `mailDisposable` | boolean | Ob die E-Mail von einem Wegwerf-Anbieter stammt |
|
||||
| `mailAcceptAll` | boolean | Ob die Domain eine Catch-All-Domain ist |
|
||||
| `free` | boolean | Ob die E-Mail einen kostenlosen E-Mail-Dienst verwendet |
|
||||
|
||||
### `enrich_disposable_email_check`
|
||||
|
||||
Überprüfen Sie, ob eine E-Mail-Adresse von einem Wegwerf- oder temporären E-Mail-Anbieter stammt. Gibt einen Score und Validierungsdetails zurück.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `email` | string | Ja | Zu überprüfende E-Mail-Adresse \(z. B. john.doe@example.com\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `email` | string | Geprüfte E-Mail-Adresse |
|
||||
| `score` | number | Validierungsbewertung \(0-100\) |
|
||||
| `testsPassed` | string | Anzahl bestandener Tests \(z. B. "3/3"\) |
|
||||
| `passed` | boolean | Ob die E-Mail alle Validierungstests bestanden hat |
|
||||
| `reason` | string | Grund für Fehler, falls E-Mail nicht bestanden hat |
|
||||
| `mailServerIp` | string | IP-Adresse des Mailservers |
|
||||
| `mxRecords` | array | MX-Einträge für die Domain |
|
||||
| ↳ `host` | string | MX-Eintrag-Host |
|
||||
| ↳ `pref` | number | MX-Eintrag-Präferenz |
|
||||
|
||||
### `enrich_email_to_ip`
|
||||
|
||||
Ermitteln Sie eine IP-Adresse, die mit einer E-Mail-Adresse verknüpft ist.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `email` | string | Ja | Zu suchende E-Mail-Adresse \(z. B. john.doe@example.com\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `email` | string | Gesuchte E-Mail-Adresse |
|
||||
| `ip` | string | Zugehörige IP-Adresse |
|
||||
| `found` | boolean | Ob eine IP-Adresse gefunden wurde |
|
||||
|
||||
### `enrich_ip_to_company`
|
||||
|
||||
Identifizieren Sie ein Unternehmen anhand einer IP-Adresse mit detaillierten firmografischen Informationen.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `ip` | string | Ja | Zu suchende IP-Adresse \(z. B. 86.92.60.221\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `name` | string | Firmenname |
|
||||
| `legalName` | string | Rechtlicher Firmenname |
|
||||
| `domain` | string | Primäre Domain |
|
||||
| `domainAliases` | array | Domain-Aliase |
|
||||
| `sector` | string | Geschäftsbereich |
|
||||
| `industry` | string | Branche |
|
||||
| `phone` | string | Telefonnummer |
|
||||
| `employees` | number | Anzahl der Mitarbeiter |
|
||||
| `revenue` | string | Geschätzter Umsatz |
|
||||
| `location` | json | Firmenstandort |
|
||||
| ↳ `city` | string | Stadt |
|
||||
| ↳ `state` | string | Bundesland |
|
||||
| ↳ `country` | string | Land |
|
||||
| ↳ `timezone` | string | Zeitzone |
|
||||
| `linkedInUrl` | string | LinkedIn-Unternehmens-URL |
|
||||
| `twitterUrl` | string | Twitter-URL |
|
||||
| `facebookUrl` | string | Facebook-URL |
|
||||
|
||||
### `enrich_company_lookup`
|
||||
|
||||
Umfassende Unternehmensinformationen nach Name oder Domain abrufen, einschließlich Finanzierung, Standort und Social-Media-Profile.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `name` | string | Nein | Firmenname \(z. B. Google\) |
|
||||
| `domain` | string | Nein | Firmendomain \(z. B. google.com\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `name` | string | Firmenname |
|
||||
| `universalName` | string | Universeller Firmenname |
|
||||
| `companyId` | string | Firmen-ID |
|
||||
| `description` | string | Firmenbeschreibung |
|
||||
| `phone` | string | Telefonnummer |
|
||||
| `linkedInUrl` | string | LinkedIn-Unternehmens-URL |
|
||||
| `websiteUrl` | string | Firmenwebsite |
|
||||
| `followers` | number | Anzahl der LinkedIn-Follower |
|
||||
| `staffCount` | number | Anzahl der Mitarbeiter |
|
||||
| `foundedDate` | string | Gründungsdatum |
|
||||
| `type` | string | Unternehmenstyp |
|
||||
| `industries` | array | Branchen |
|
||||
| `specialties` | array | Unternehmensspezialisierungen |
|
||||
| `headquarters` | json | Hauptsitz |
|
||||
| ↳ `city` | string | Stadt |
|
||||
| ↳ `country` | string | Land |
|
||||
| ↳ `postalCode` | string | Postleitzahl |
|
||||
| ↳ `line1` | string | Adresszeile 1 |
|
||||
| `logo` | string | Firmenlogo-URL |
|
||||
| `coverImage` | string | Titelbild-URL |
|
||||
| `fundingRounds` | array | Finanzierungshistorie |
|
||||
| ↳ `roundType` | string | Finanzierungsrunde |
|
||||
| ↳ `amount` | number | Eingeworbener Betrag |
|
||||
| ↳ `currency` | string | Währung |
|
||||
| ↳ `investors` | array | Investoren |
|
||||
|
||||
### `enrich_company_funding`
|
||||
|
||||
Rufen Sie die Finanzierungshistorie, Traffic-Metriken und Führungskräfteinformationen eines Unternehmens nach Domain ab.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `domain` | string | Ja | Unternehmens-Domain \(z. B. example.com\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `legalName` | string | Rechtlicher Unternehmensname |
|
||||
| `employeeCount` | number | Anzahl der Mitarbeiter |
|
||||
| `headquarters` | string | Hauptsitz |
|
||||
| `industry` | string | Branche |
|
||||
| `totalFundingRaised` | number | Gesamte eingeworbene Finanzierung |
|
||||
| `fundingRounds` | array | Finanzierungsrunden |
|
||||
| ↳ `roundType` | string | Rundentyp |
|
||||
| ↳ `amount` | number | Eingeworbener Betrag |
|
||||
| ↳ `date` | string | Datum |
|
||||
| ↳ `investors` | array | Investoren |
|
||||
| `monthlyVisits` | number | Monatliche Website-Besuche |
|
||||
| `trafficChange` | number | Traffic-Veränderung in Prozent |
|
||||
| `itSpending` | number | Geschätzte IT-Ausgaben in USD |
|
||||
| `executives` | array | Führungsteam |
|
||||
| ↳ `name` | string | Name |
|
||||
| ↳ `title` | string | Titel |
|
||||
|
||||
### `enrich_company_revenue`
|
||||
|
||||
Rufen Sie Umsatzdaten, CEO-Informationen und Wettbewerbsanalysen eines Unternehmens nach Domain ab.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `domain` | string | Ja | Unternehmens-Domain \(z. B. clay.io\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `companyName` | string | Firmenname |
|
||||
| `shortDescription` | string | Kurze Firmenbeschreibung |
|
||||
| `fullSummary` | string | Vollständige Firmenzusammenfassung |
|
||||
| `revenue` | string | Firmenumsatz |
|
||||
| `revenueMin` | number | Minimale Umsatzschätzung |
|
||||
| `revenueMax` | number | Maximale Umsatzschätzung |
|
||||
| `employeeCount` | number | Anzahl der Mitarbeiter |
|
||||
| `founded` | string | Gründungsjahr |
|
||||
| `ownership` | string | Eigentumsform |
|
||||
| `status` | string | Firmenstatus \(z. B. Aktiv\) |
|
||||
| `website` | string | Firmenwebsite-URL |
|
||||
| `ceo` | json | CEO-Informationen |
|
||||
| ↳ `name` | string | CEO-Name |
|
||||
| ↳ `designation` | string | CEO-Bezeichnung/Titel |
|
||||
| ↳ `rating` | number | CEO-Bewertung |
|
||||
| `socialLinks` | json | Social-Media-Links |
|
||||
| ↳ `linkedIn` | string | LinkedIn-URL |
|
||||
| ↳ `twitter` | string | Twitter-URL |
|
||||
| ↳ `facebook` | string | Facebook-URL |
|
||||
| `totalFunding` | string | Gesamte eingeworbene Finanzierung |
|
||||
| `fundingRounds` | number | Anzahl der Finanzierungsrunden |
|
||||
| `competitors` | array | Wettbewerber |
|
||||
| ↳ `name` | string | Name des Wettbewerbers |
|
||||
| ↳ `revenue` | string | Umsatz |
|
||||
| ↳ `employeeCount` | number | Mitarbeiterzahl |
|
||||
| ↳ `headquarters` | string | Hauptsitz |
|
||||
|
||||
### `enrich_search_people`
|
||||
|
||||
Suche nach Fachkräften anhand verschiedener Kriterien wie Name, Titel, Fähigkeiten, Ausbildung und Unternehmen.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `firstName` | string | Nein | Vorname |
|
||||
| `lastName` | string | Nein | Nachname |
|
||||
| `summary` | string | Nein | Schlüsselwörter für berufliche Zusammenfassung |
|
||||
| `subTitle` | string | Nein | Berufsbezeichnung/Untertitel |
|
||||
| `locationCountry` | string | Nein | Land |
|
||||
| `locationCity` | string | Nein | Stadt |
|
||||
| `locationState` | string | Nein | Bundesland/Provinz |
|
||||
| `influencer` | boolean | Nein | Nur nach Influencern filtern |
|
||||
| `premium` | boolean | Nein | Nur nach Premium-Konten filtern |
|
||||
| `language` | string | Nein | Hauptsprache |
|
||||
| `industry` | string | Nein | Branche |
|
||||
| `currentJobTitles` | json | Nein | Aktuelle Berufsbezeichnungen \(Array\) |
|
||||
| `pastJobTitles` | json | Nein | Frühere Berufsbezeichnungen \(Array\) |
|
||||
| `skills` | json | Nein | Zu suchende Fähigkeiten \(Array\) |
|
||||
| `schoolNames` | json | Nein | Schulnamen \(Array\) |
|
||||
| `certifications` | json | Nein | Zertifizierungen zum Filtern \(Array\) |
|
||||
| `degreeNames` | json | Nein | Abschlussnamen zum Filtern \(Array\) |
|
||||
| `studyFields` | json | Nein | Studienfächer zum Filtern \(Array\) |
|
||||
| `currentCompanies` | json | Nein | Aktuelle Unternehmens-IDs zum Filtern \(Array von Zahlen\) |
|
||||
| `pastCompanies` | json | Nein | Frühere Unternehmens-IDs zum Filtern \(Array von Zahlen\) |
|
||||
| `currentPage` | number | Nein | Seitennummer \(Standard: 1\) |
|
||||
| `pageSize` | number | Nein | Ergebnisse pro Seite \(Standard: 20\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `currentPage` | number | Aktuelle Seitennummer |
|
||||
| `totalPage` | number | Gesamtanzahl der Seiten |
|
||||
| `pageSize` | number | Ergebnisse pro Seite |
|
||||
| `profiles` | array | Suchergebnisse |
|
||||
| ↳ `profileIdentifier` | string | Profil-ID |
|
||||
| ↳ `givenName` | string | Vorname |
|
||||
| ↳ `familyName` | string | Nachname |
|
||||
| ↳ `currentPosition` | string | Aktuelle Berufsbezeichnung |
|
||||
| ↳ `profileImage` | string | Profilbild-URL |
|
||||
| ↳ `externalProfileUrl` | string | LinkedIn-URL |
|
||||
| ↳ `city` | string | Stadt |
|
||||
| ↳ `country` | string | Land |
|
||||
| ↳ `expertSkills` | array | Fähigkeiten |
|
||||
|
||||
### `enrich_search_company`
|
||||
|
||||
Suche nach Unternehmen anhand verschiedener Kriterien wie Name, Branche, Standort und Größe.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `name` | string | Nein | Unternehmensname |
|
||||
| `website` | string | Nein | Unternehmenswebsite-URL |
|
||||
| `tagline` | string | Nein | Unternehmens-Slogan |
|
||||
| `type` | string | Nein | Unternehmenstyp \(z. B. Privat, Öffentlich\) |
|
||||
| `description` | string | Nein | Schlüsselwörter der Unternehmensbeschreibung |
|
||||
| `industries` | json | Nein | Branchen zum Filtern \(Array\) |
|
||||
| `locationCountry` | string | Nein | Land |
|
||||
| `locationCity` | string | Nein | Stadt |
|
||||
| `postalCode` | string | Nein | Postleitzahl |
|
||||
| `locationCountryList` | json | Nein | Mehrere Länder zum Filtern \(Array\) |
|
||||
| `locationCityList` | json | Nein | Mehrere Städte zum Filtern \(Array\) |
|
||||
| `specialities` | json | Nein | Unternehmensspezialisierungen \(Array\) |
|
||||
| `followers` | number | Nein | Mindestanzahl an Followern |
|
||||
| `staffCount` | number | Nein | Maximale Mitarbeiterzahl |
|
||||
| `staffCountMin` | number | Nein | Minimale Mitarbeiterzahl |
|
||||
| `staffCountMax` | number | Nein | Maximale Mitarbeiterzahl |
|
||||
| `currentPage` | number | Nein | Seitennummer \(Standard: 1\) |
|
||||
| `pageSize` | number | Nein | Ergebnisse pro Seite \(Standard: 20\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `currentPage` | number | Aktuelle Seitennummer |
|
||||
| `totalPage` | number | Gesamtanzahl der Seiten |
|
||||
| `pageSize` | number | Ergebnisse pro Seite |
|
||||
| `companies` | array | Suchergebnisse |
|
||||
| ↳ `companyName` | string | Firmenname |
|
||||
| ↳ `tagline` | string | Firmen-Slogan |
|
||||
| ↳ `webAddress` | string | Website-URL |
|
||||
| ↳ `industries` | array | Branchen |
|
||||
| ↳ `teamSize` | number | Teamgröße |
|
||||
| ↳ `linkedInProfile` | string | LinkedIn-URL |
|
||||
|
||||
### `enrich_search_company_employees`
|
||||
|
||||
Suche nach Mitarbeitern in bestimmten Unternehmen nach Standort und Berufsbezeichnung.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `companyIds` | json | Nein | Array von Firmen-IDs, in denen gesucht werden soll |
|
||||
| `country` | string | Nein | Länderfilter \(z. B. Vereinigte Staaten\) |
|
||||
| `city` | string | Nein | Stadtfilter \(z. B. San Francisco\) |
|
||||
| `state` | string | Nein | Bundesland-Filter \(z. B. Kalifornien\) |
|
||||
| `jobTitles` | json | Nein | Berufsbezeichnungen zum Filtern \(Array\) |
|
||||
| `page` | number | Nein | Seitennummer \(Standard: 1\) |
|
||||
| `pageSize` | number | Nein | Ergebnisse pro Seite \(Standard: 10\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `currentPage` | number | Aktuelle Seitennummer |
|
||||
| `totalPage` | number | Gesamtanzahl der Seiten |
|
||||
| `pageSize` | number | Anzahl der Ergebnisse pro Seite |
|
||||
| `profiles` | array | Mitarbeiterprofile |
|
||||
| ↳ `profileIdentifier` | string | Profil-ID |
|
||||
| ↳ `givenName` | string | Vorname |
|
||||
| ↳ `familyName` | string | Nachname |
|
||||
| ↳ `currentPosition` | string | Aktuelle Berufsbezeichnung |
|
||||
| ↳ `profileImage` | string | Profilbild-URL |
|
||||
| ↳ `externalProfileUrl` | string | LinkedIn-URL |
|
||||
| ↳ `city` | string | Stadt |
|
||||
| ↳ `country` | string | Land |
|
||||
| ↳ `expertSkills` | array | Fähigkeiten |
|
||||
|
||||
### `enrich_search_similar_companies`
|
||||
|
||||
Finden Sie Unternehmen, die einem bestimmten Unternehmen ähnlich sind, anhand der LinkedIn-URL mit Filtern für Standort und Größe.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `url` | string | Ja | LinkedIn-Unternehmens-URL \(z. B. linkedin.com/company/google\) |
|
||||
| `accountLocation` | json | Nein | Nach Standorten filtern \(Array von Ländernamen\) |
|
||||
| `employeeSizeType` | string | Nein | Filtertyp für Mitarbeiterzahl \(z. B. RANGE\) |
|
||||
| `employeeSizeRange` | json | Nein | Bereiche der Mitarbeiterzahl \(Array von \{start, end\}-Objekten\) |
|
||||
| `page` | number | Nein | Seitennummer \(Standard: 1\) |
|
||||
| `num` | number | Nein | Anzahl der Ergebnisse pro Seite |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `companies` | array | Ähnliche Unternehmen |
|
||||
| ↳ `url` | string | LinkedIn-URL |
|
||||
| ↳ `name` | string | Unternehmensname |
|
||||
| ↳ `universalName` | string | Universeller Name |
|
||||
| ↳ `type` | string | Unternehmenstyp |
|
||||
| ↳ `description` | string | Beschreibung |
|
||||
| ↳ `phone` | string | Telefonnummer |
|
||||
| ↳ `website` | string | Website-URL |
|
||||
| ↳ `logo` | string | Logo-URL |
|
||||
| ↳ `foundedYear` | number | Gründungsjahr |
|
||||
| ↳ `staffTotal` | number | Gesamtzahl der Mitarbeiter |
|
||||
| ↳ `industries` | array | Branchen |
|
||||
| ↳ `relevancyScore` | number | Relevanzbewertung |
|
||||
| ↳ `relevancyValue` | string | Relevanzwert |
|
||||
|
||||
### `enrich_sales_pointer_people`
|
||||
|
||||
Erweiterte Personensuche mit komplexen Filtern für Standort, Unternehmensgröße, Seniorität, Erfahrung und mehr.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `page` | number | Ja | Seitennummer \(beginnt bei 1\) |
|
||||
| `filters` | json | Ja | Array von Filterobjekten. Jeder Filter hat einen Typ \(z. B. POSTAL_CODE, COMPANY_HEADCOUNT\), Werte \(Array mit id, text, selectionType: INCLUDED/EXCLUDED\) und optional selectedSubFilter |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `data` | array | Personenergebnisse |
|
||||
| ↳ `name` | string | Vollständiger Name |
|
||||
| ↳ `summary` | string | Berufliche Zusammenfassung |
|
||||
| ↳ `location` | string | Standort |
|
||||
| ↳ `profilePicture` | string | Profilbild-URL |
|
||||
| ↳ `linkedInUrn` | string | LinkedIn-URN |
|
||||
| ↳ `positions` | array | Berufspositionen |
|
||||
| ↳ `education` | array | Ausbildung |
|
||||
| `pagination` | json | Paginierungsinformationen |
|
||||
| ↳ `totalCount` | number | Gesamtergebnisse |
|
||||
| ↳ `returnedCount` | number | Zurückgegebene Anzahl |
|
||||
| ↳ `start` | number | Startposition |
|
||||
| ↳ `limit` | number | Limit |
|
||||
|
||||
### `enrich_search_posts`
|
||||
|
||||
Durchsuchen Sie LinkedIn-Beiträge nach Schlüsselwörtern mit Datumsfilterung.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `keywords` | string | Ja | Suchbegriffe \(z. B. "KI-Automatisierung"\) |
|
||||
| `datePosted` | string | Nein | Zeitfilter \(z. B. past_week, past_month\) |
|
||||
| `page` | number | Nein | Seitennummer \(Standard: 1\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `count` | number | Gesamtanzahl der Ergebnisse |
|
||||
| `posts` | array | Suchergebnisse |
|
||||
| ↳ `url` | string | Beitrags-URL |
|
||||
| ↳ `postId` | string | Beitrags-ID |
|
||||
| ↳ `author` | object | Autoreninformationen |
|
||||
| ↳ `name` | string | Autorenname |
|
||||
| ↳ `headline` | string | Autoren-Headline |
|
||||
| ↳ `linkedInUrl` | string | LinkedIn-URL des Autors |
|
||||
| ↳ `profileImage` | string | Profilbild des Autors |
|
||||
| ↳ `timestamp` | string | Zeitstempel des Beitrags |
|
||||
| ↳ `textContent` | string | Textinhalt des Beitrags |
|
||||
| ↳ `hashtags` | array | Hashtags |
|
||||
| ↳ `mediaUrls` | array | Medien-URLs |
|
||||
| ↳ `reactions` | number | Anzahl der Reaktionen |
|
||||
| ↳ `commentsCount` | number | Anzahl der Kommentare |
|
||||
|
||||
### `enrich_get_post_details`
|
||||
|
||||
Detaillierte Informationen zu einem LinkedIn-Beitrag anhand der URL abrufen.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `url` | string | Ja | LinkedIn-Beitrags-URL |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `postId` | string | Beitrags-ID |
|
||||
| `author` | json | Autoreninformationen |
|
||||
| ↳ `name` | string | Autorenname |
|
||||
| ↳ `headline` | string | Autoren-Headline |
|
||||
| ↳ `linkedInUrl` | string | LinkedIn-URL des Autors |
|
||||
| ↳ `profileImage` | string | Profilbild des Autors |
|
||||
| `timestamp` | string | Zeitstempel des Beitrags |
|
||||
| `textContent` | string | Textinhalt des Beitrags |
|
||||
| `hashtags` | array | Hashtags |
|
||||
| `mediaUrls` | array | Medien-URLs |
|
||||
| `reactions` | number | Anzahl der Reaktionen |
|
||||
| `commentsCount` | number | Anzahl der Kommentare |
|
||||
|
||||
### `enrich_search_post_reactions`
|
||||
|
||||
Reaktionen auf einen LinkedIn-Beitrag mit Filterung nach Reaktionstyp abrufen.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `postUrn` | string | Ja | LinkedIn-Aktivitäts-URN \(z. B. urn:li:activity:7231931952839196672\) |
|
||||
| `reactionType` | string | Ja | Reaktionstyp-Filter: all, like, love, celebrate, insightful oder funny \(Standard: all\) |
|
||||
| `page` | number | Ja | Seitennummer \(beginnt bei 1\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `page` | number | Aktuelle Seitennummer |
|
||||
| `totalPage` | number | Gesamtanzahl der Seiten |
|
||||
| `count` | number | Anzahl der zurückgegebenen Reaktionen |
|
||||
| `reactions` | array | Reaktionen |
|
||||
| ↳ `reactionType` | string | Art der Reaktion |
|
||||
| ↳ `reactor` | object | Person, die reagiert hat |
|
||||
| ↳ `name` | string | Name |
|
||||
| ↳ `subTitle` | string | Berufsbezeichnung |
|
||||
| ↳ `profileId` | string | Profil-ID |
|
||||
| ↳ `profilePicture` | string | Profilbild-URL |
|
||||
| ↳ `linkedInUrl` | string | LinkedIn-URL |
|
||||
|
||||
### `enrich_search_post_comments`
|
||||
|
||||
Kommentare zu einem LinkedIn-Beitrag abrufen.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `postUrn` | string | Ja | LinkedIn-Aktivitäts-URN \(z. B. urn:li:activity:7191163324208705536\) |
|
||||
| `page` | number | Nein | Seitennummer \(beginnt bei 1, Standard: 1\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `page` | number | Aktuelle Seitennummer |
|
||||
| `totalPage` | number | Gesamtanzahl der Seiten |
|
||||
| `count` | number | Anzahl der zurückgegebenen Kommentare |
|
||||
| `comments` | array | Kommentare |
|
||||
| ↳ `activityId` | string | Kommentar-Aktivitäts-ID |
|
||||
| ↳ `commentary` | string | Kommentartext |
|
||||
| ↳ `linkedInUrl` | string | Link zum Kommentar |
|
||||
| ↳ `commenter` | object | Informationen zum Kommentator |
|
||||
| ↳ `profileId` | string | Profil-ID |
|
||||
| ↳ `firstName` | string | Vorname |
|
||||
| ↳ `lastName` | string | Nachname |
|
||||
| ↳ `subTitle` | string | Untertitel/Überschrift |
|
||||
| ↳ `profilePicture` | string | Profilbild-URL |
|
||||
| ↳ `backgroundImage` | string | Hintergrundbild-URL |
|
||||
| ↳ `entityUrn` | string | Entity-URN |
|
||||
| ↳ `objectUrn` | string | Objekt-URN |
|
||||
| ↳ `profileType` | string | Profiltyp |
|
||||
| ↳ `reactionBreakdown` | object | Reaktionen auf den Kommentar |
|
||||
| ↳ `likes` | number | Anzahl der Likes |
|
||||
| ↳ `empathy` | number | Anzahl der Empathie-Reaktionen |
|
||||
| ↳ `other` | number | Anzahl der sonstigen Reaktionen |
|
||||
|
||||
### `enrich_search_people_activities`
|
||||
|
||||
Person abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `profileId` | string | Ja | LinkedIn-Profil-ID |
|
||||
| `activityType` | string | Ja | Aktivitätstyp: posts, comments oder articles |
|
||||
| `paginationToken` | string | Nein | Paginierungs-Token für die nächste Ergebnisseite |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `paginationToken` | string | Token zum Abrufen der nächsten Seite |
|
||||
| `activityType` | string | Typ der zurückgegebenen Aktivitäten |
|
||||
| `activities` | array | Aktivitäten |
|
||||
| ↳ `activityId` | string | Aktivitäts-ID |
|
||||
| ↳ `commentary` | string | Textinhalt der Aktivität |
|
||||
| ↳ `linkedInUrl` | string | Link zur Aktivität |
|
||||
| ↳ `timeElapsed` | string | Verstrichene Zeit seit der Aktivität |
|
||||
| ↳ `numReactions` | number | Gesamtanzahl der Reaktionen |
|
||||
| ↳ `author` | object | Informationen zum Autor der Aktivität |
|
||||
| ↳ `name` | string | Name des Autors |
|
||||
| ↳ `profileId` | string | Profil-ID |
|
||||
| ↳ `profilePicture` | string | URL des Profilbilds |
|
||||
| ↳ `reactionBreakdown` | object | Reaktionen |
|
||||
| ↳ `likes` | number | Likes |
|
||||
| ↳ `empathy` | number | Empathie-Reaktionen |
|
||||
| ↳ `other` | number | Sonstige Reaktionen |
|
||||
| ↳ `attachments` | array | Anhang-URLs |
|
||||
|
||||
### `enrich_search_company_activities`
|
||||
|
||||
Unternehmen abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `companyId` | string | Ja | LinkedIn-Unternehmens-ID |
|
||||
| `activityType` | string | Ja | Aktivitätstyp: Posts, Kommentare oder Artikel |
|
||||
| `paginationToken` | string | Nein | Paginierungs-Token für die nächste Ergebnisseite |
|
||||
| `offset` | number | Nein | Anzahl der zu überspringenden Datensätze \(Standard: 0\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `paginationToken` | string | Token zum Abrufen der nächsten Seite |
|
||||
| `activityType` | string | Typ der zurückgegebenen Aktivitäten |
|
||||
| `activities` | array | Aktivitäten |
|
||||
| ↳ `activityId` | string | Aktivitäts-ID |
|
||||
| ↳ `commentary` | string | Textinhalt der Aktivität |
|
||||
| ↳ `linkedInUrl` | string | Link zur Aktivität |
|
||||
| ↳ `timeElapsed` | string | Verstrichene Zeit seit der Aktivität |
|
||||
| ↳ `numReactions` | number | Gesamtanzahl der Reaktionen |
|
||||
| ↳ `author` | object | Informationen zum Autor der Aktivität |
|
||||
| ↳ `name` | string | Name des Autors |
|
||||
| ↳ `profileId` | string | Profil-ID |
|
||||
| ↳ `profilePicture` | string | URL des Profilbilds |
|
||||
| ↳ `reactionBreakdown` | object | Reaktionen |
|
||||
| ↳ `likes` | number | Likes |
|
||||
| ↳ `empathy` | number | Empathie-Reaktionen |
|
||||
| ↳ `other` | number | Sonstige Reaktionen |
|
||||
| ↳ `attachments` | array | Anhänge |
|
||||
|
||||
### `enrich_reverse_hash_lookup`
|
||||
|
||||
Wandelt einen MD5-E-Mail-Hash zurück in die ursprüngliche E-Mail-Adresse und den Anzeigenamen um.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
|
||||
| `hash` | string | Ja | MD5-Hash-Wert zum Nachschlagen |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `hash` | string | MD5-Hash, der nachgeschlagen wurde |
|
||||
| `email` | string | Ursprüngliche E-Mail-Adresse |
|
||||
| `displayName` | string | Anzeigename, der mit der E-Mail verknüpft ist |
|
||||
| `found` | boolean | Ob eine E-Mail für den Hash gefunden wurde |
|
||||
|
||||
### `enrich_search_logo`
|
||||
|
||||
Ruft die URL eines Firmenlogos anhand der Domain ab.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Enrich API-Schlüssel |
|
||||
| `url` | string | Ja | Firmendomain \(z. B. google.com\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `logoUrl` | string | URL zum Abrufen des Firmenlogos |
|
||||
| `domain` | string | Domain, die nachgeschlagen wurde |
|
||||
@@ -143,8 +143,3 @@ Führe umfassende Recherchen mit KI durch, um detaillierte Berichte mit Quellena
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `research` | array | Umfassende Forschungsergebnisse mit Quellenangaben und Zusammenfassungen |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `exa`
|
||||
|
||||
@@ -6,7 +6,7 @@ description: Mehrere Dateien lesen und parsen
|
||||
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||
|
||||
<BlockInfoCard
|
||||
type="file"
|
||||
type="file_v3"
|
||||
color="#40916C"
|
||||
/>
|
||||
|
||||
@@ -47,8 +47,3 @@ Parsen einer oder mehrerer hochgeladener Dateien oder Dateien von URLs (Text, PD
|
||||
| --------- | ---- | ----------- |
|
||||
| `files` | array | Array der geparsten Dateien |
|
||||
| `combinedContent` | string | Kombinierter Inhalt aller geparsten Dateien |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `file`
|
||||
|
||||
@@ -171,8 +171,3 @@ Autonomer Web-Datenextraktions-Agent. Sucht und sammelt Informationen basierend
|
||||
| `creditsUsed` | number | Anzahl der von dieser Agent-Aufgabe verbrauchten Credits |
|
||||
| `expiresAt` | string | Zeitstempel, wann die Ergebnisse ablaufen \(24 Stunden\) |
|
||||
| `sources` | object | Array der vom Agent verwendeten Quell-URLs |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `firecrawl`
|
||||
|
||||
@@ -6,7 +6,7 @@ description: Interagieren Sie mit Fireflies.ai-Besprechungstranskripten und -auf
|
||||
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||
|
||||
<BlockInfoCard
|
||||
type="fireflies"
|
||||
type="fireflies_v2"
|
||||
color="#100730"
|
||||
/>
|
||||
|
||||
@@ -226,8 +226,3 @@ Alle Kontakte aus Ihren Fireflies.ai-Meetings auflisten
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `contacts` | array | Liste der Kontakte aus Meetings |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `fireflies`
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -422,8 +422,3 @@ Eine laufende GitLab-Pipeline abbrechen
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `pipeline` | object | Die abgebrochene GitLab-Pipeline |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `gitlab`
|
||||
|
||||
@@ -264,13 +264,3 @@ Label(s) von einer Gmail-Nachricht entfernen
|
||||
| `labelIds` | string | Ja | Durch Kommas getrennte Label-IDs zum Entfernen \(z.B. INBOX, Label_123\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `content` | string | Erfolgsmeldung |
|
||||
| `metadata` | object | E-Mail-Metadaten |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `gmail`
|
||||
|
||||
92
apps/docs/content/docs/de/tools/google_books.mdx
Normal file
92
apps/docs/content/docs/de/tools/google_books.mdx
Normal file
@@ -0,0 +1,92 @@
|
||||
---
|
||||
title: Google Books
|
||||
description: Buchinformationen suchen und abrufen
|
||||
---
|
||||
|
||||
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||
|
||||
<BlockInfoCard
|
||||
type="google_books"
|
||||
color="#FFFFFF"
|
||||
/>
|
||||
|
||||
## Nutzungsanleitung
|
||||
|
||||
Suchen Sie nach Büchern über die Google Books API. Finden Sie Bände nach Titel, Autor, ISBN oder Stichwörtern und rufen Sie detaillierte Informationen zu bestimmten Büchern ab, einschließlich Beschreibungen, Bewertungen und Veröffentlichungsdetails.
|
||||
|
||||
## Tools
|
||||
|
||||
### `google_books_volume_search`
|
||||
|
||||
Suchen Sie nach Büchern über die Google Books API
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Google Books API-Schlüssel |
|
||||
| `query` | string | Ja | Suchanfrage. Unterstützt spezielle Schlüsselwörter: intitle:, inauthor:, inpublisher:, subject:, isbn: |
|
||||
| `filter` | string | Nein | Ergebnisse nach Verfügbarkeit filtern \(partial, full, free-ebooks, paid-ebooks, ebooks\) |
|
||||
| `printType` | string | Nein | Auf Drucktyp beschränken \(all, books, magazines\) |
|
||||
| `orderBy` | string | Nein | Sortierreihenfolge \(relevance, newest\) |
|
||||
| `startIndex` | number | Nein | Index des ersten zurückzugebenden Ergebnisses \(für Paginierung\) |
|
||||
| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Ergebnisse \(1-40\) |
|
||||
| `langRestrict` | string | Nein | Ergebnisse auf eine bestimmte Sprache beschränken \(ISO 639-1-Code\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `totalItems` | number | Gesamtanzahl der übereinstimmenden Ergebnisse |
|
||||
| `volumes` | array | Liste der übereinstimmenden Bände |
|
||||
| ↳ `id` | string | Band-ID |
|
||||
| ↳ `title` | string | Buchtitel |
|
||||
| ↳ `subtitle` | string | Buchuntertitel |
|
||||
| ↳ `authors` | array | Liste der Autoren |
|
||||
| ↳ `publisher` | string | Verlagsname |
|
||||
| ↳ `publishedDate` | string | Veröffentlichungsdatum |
|
||||
| ↳ `description` | string | Buchbeschreibung |
|
||||
| ↳ `pageCount` | number | Anzahl der Seiten |
|
||||
| ↳ `categories` | array | Buchkategorien |
|
||||
| ↳ `averageRating` | number | Durchschnittliche Bewertung \(1-5\) |
|
||||
| ↳ `ratingsCount` | number | Anzahl der Bewertungen |
|
||||
| ↳ `language` | string | Sprachcode |
|
||||
| ↳ `previewLink` | string | Link zur Vorschau auf Google Books |
|
||||
| ↳ `infoLink` | string | Link zur Infoseite |
|
||||
| ↳ `thumbnailUrl` | string | URL des Buchcover-Thumbnails |
|
||||
| ↳ `isbn10` | string | ISBN-10-Kennung |
|
||||
| ↳ `isbn13` | string | ISBN-13-Kennung |
|
||||
|
||||
### `google_books_volume_details`
|
||||
|
||||
Detaillierte Informationen über ein bestimmtes Buchvolumen abrufen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `apiKey` | string | Ja | Google Books API-Schlüssel |
|
||||
| `volumeId` | string | Ja | Die ID des abzurufenden Volumens |
|
||||
| `projection` | string | Nein | Projektionsebene \(full, lite\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Volumen-ID |
|
||||
| `title` | string | Buchtitel |
|
||||
| `subtitle` | string | Buchuntertitel |
|
||||
| `authors` | array | Liste der Autoren |
|
||||
| `publisher` | string | Verlagsname |
|
||||
| `publishedDate` | string | Veröffentlichungsdatum |
|
||||
| `description` | string | Buchbeschreibung |
|
||||
| `pageCount` | number | Anzahl der Seiten |
|
||||
| `categories` | array | Buchkategorien |
|
||||
| `averageRating` | number | Durchschnittliche Bewertung \(1-5\) |
|
||||
| `ratingsCount` | number | Anzahl der Bewertungen |
|
||||
| `language` | string | Sprachcode |
|
||||
| `previewLink` | string | Link zur Vorschau auf Google Books |
|
||||
| `infoLink` | string | Link zur Infoseite |
|
||||
| `thumbnailUrl` | string | URL des Buchcover-Thumbnails |
|
||||
| `isbn10` | string | ISBN-10-Kennung |
|
||||
| `isbn13` | string | ISBN-13-Kennung |
|
||||
@@ -139,3 +139,145 @@ Teilnehmer zu einem bestehenden Google Kalender-Ereignis einladen
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `google_calendar`
|
||||
|
||||
Ein Ereignis in einen anderen Kalender verschieben. Gibt nur API-konforme Felder zurück.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `calendarId` | string | Nein | Quell-Google-Kalender-ID (z. B. primary oder calendar@group.calendar.google.com) |
|
||||
| `eventId` | string | Ja | Google-Kalender-Ereignis-ID, die verschoben werden soll |
|
||||
| `destinationCalendarId` | string | Ja | Ziel-Google-Kalender-ID |
|
||||
| `sendUpdates` | string | Nein | Wie Updates an Teilnehmer gesendet werden: all, externalOnly oder none |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Ereignis-ID |
|
||||
| `htmlLink` | string | Ereignis-Link |
|
||||
| `status` | string | Ereignisstatus |
|
||||
| `summary` | string | Ereignistitel |
|
||||
| `description` | string | Ereignisbeschreibung |
|
||||
| `location` | string | Ereignisort |
|
||||
| `start` | json | Ereignisstart |
|
||||
| `end` | json | Ereignisende |
|
||||
| `attendees` | json | Ereignisteilnehmer |
|
||||
| `creator` | json | Ereignisersteller |
|
||||
| `organizer` | json | Ereignisorganisator |
|
||||
|
||||
### `google_calendar_instances`
|
||||
|
||||
Instanzen eines wiederkehrenden Ereignisses aus Google Kalender abrufen. Gibt nur API-konforme Felder zurück.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `calendarId` | string | Nein | Google-Kalender-ID (z. B. primary oder calendar@group.calendar.google.com) |
|
||||
| `eventId` | string | Ja | ID des wiederkehrenden Ereignisses, dessen Instanzen abgerufen werden sollen |
|
||||
| `timeMin` | string | Nein | Untere Grenze für Instanzen (RFC3339-Zeitstempel, z. B. 2025-06-03T00:00:00Z) |
|
||||
| `timeMax` | string | Nein | Obere Grenze für Instanzen (RFC3339-Zeitstempel, z. B. 2025-06-04T00:00:00Z) |
|
||||
| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Instanzen (Standard 250, max. 2500) |
|
||||
| `pageToken` | string | Nein | Token zum Abrufen nachfolgender Ergebnisseiten |
|
||||
| `showDeleted` | boolean | Nein | Gelöschte Instanzen einschließen |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `nextPageToken` | string | Nächstes Seiten-Token |
|
||||
| `timeZone` | string | Kalender-Zeitzone |
|
||||
| `instances` | json | Liste der wiederkehrenden Ereignisinstanzen |
|
||||
|
||||
### `google_calendar_list_calendars`
|
||||
|
||||
Alle Kalender des Benutzers auflisten
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `minAccessRole` | string | Nein | Minimale Zugriffsrolle für zurückgegebene Kalender: freeBusyReader, reader, writer oder owner |
|
||||
| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Kalender (Standard 100, max. 250) |
|
||||
| `pageToken` | string | Nein | Token zum Abrufen nachfolgender Ergebnisseiten |
|
||||
| `showDeleted` | boolean | Nein | Gelöschte Kalender einschließen |
|
||||
| `showHidden` | boolean | Nein | Ausgeblendete Kalender einschließen |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `nextPageToken` | string | Nächstes Seiten-Token |
|
||||
| `calendars` | array | Liste der Kalender |
|
||||
| ↳ `id` | string | Kalender-ID |
|
||||
| ↳ `summary` | string | Kalendertitel |
|
||||
| ↳ `description` | string | Kalenderbeschreibung |
|
||||
| ↳ `location` | string | Kalenderort |
|
||||
| ↳ `timeZone` | string | Kalender-Zeitzone |
|
||||
| ↳ `accessRole` | string | Zugriffsrolle für den Kalender |
|
||||
| ↳ `backgroundColor` | string | Kalender-Hintergrundfarbe |
|
||||
| ↳ `foregroundColor` | string | Kalender-Vordergrundfarbe |
|
||||
| ↳ `primary` | boolean | Ob dies der Hauptkalender ist |
|
||||
| ↳ `hidden` | boolean | Ob der Kalender ausgeblendet ist |
|
||||
| ↳ `selected` | boolean | Ob der Kalender ausgewählt ist |
|
||||
|
||||
### `google_calendar_quick_add`
|
||||
|
||||
Ereignisse aus natürlichsprachlichem Text erstellen. Gibt nur API-konforme Felder zurück.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `calendarId` | string | Nein | Google Kalender-ID (z. B. primary oder calendar@group.calendar.google.com) |
|
||||
| `text` | string | Ja | Natürlichsprachlicher Text, der das Ereignis beschreibt (z. B. "Meeting mit John morgen um 15 Uhr") |
|
||||
| `attendees` | array | Nein | Array von E-Mail-Adressen der Teilnehmer (kommagetrennte Zeichenkette wird ebenfalls akzeptiert) |
|
||||
| `sendUpdates` | string | Nein | Wie Updates an Teilnehmer gesendet werden: all, externalOnly oder none |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Ereignis-ID |
|
||||
| `htmlLink` | string | Ereignis-Link |
|
||||
| `status` | string | Ereignisstatus |
|
||||
| `summary` | string | Ereignistitel |
|
||||
| `description` | string | Ereignisbeschreibung |
|
||||
| `location` | string | Ereignisort |
|
||||
| `start` | json | Ereignisstart |
|
||||
| `end` | json | Ereignisende |
|
||||
| `attendees` | json | Ereignisteilnehmer |
|
||||
| `creator` | json | Ereignisersteller |
|
||||
| `organizer` | json | Ereignisorganisator |
|
||||
|
||||
### `google_calendar_invite`
|
||||
|
||||
Teilnehmer zu einem bestehenden Google Kalender-Ereignis einladen. Gibt nur API-konforme Felder zurück.
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `calendarId` | string | Nein | Google Kalender-ID (z. B. primary oder calendar@group.calendar.google.com) |
|
||||
| `eventId` | string | Ja | Google Kalender-Ereignis-ID, zu der Teilnehmer eingeladen werden sollen |
|
||||
| `attendees` | array | Ja | Array von E-Mail-Adressen der einzuladenden Teilnehmer |
|
||||
| `sendUpdates` | string | Nein | Wie Updates an Teilnehmer gesendet werden: all, externalOnly oder none |
|
||||
| `replaceExisting` | boolean | Nein | Ob bestehende Teilnehmer ersetzt oder hinzugefügt werden sollen (Standard ist false) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Ereignis-ID |
|
||||
| `htmlLink` | string | Ereignis-Link |
|
||||
| `status` | string | Ereignisstatus |
|
||||
| `summary` | string | Ereignistitel |
|
||||
| `description` | string | Ereignisbeschreibung |
|
||||
| `location` | string | Ereignisort |
|
||||
| `start` | json | Ereignisbeginn |
|
||||
| `end` | json | Ereignisende |
|
||||
| `attendees` | json | Ereignisteilnehmer |
|
||||
| `creator` | json | Ereignisersteller |
|
||||
| `organizer` | json | Ereignisorganisator |
|
||||
|
||||
@@ -102,27 +102,3 @@ Inhalte in einem Google Docs-Dokument schreiben oder aktualisieren
|
||||
| --------- | ---- | ----------- |
|
||||
| `updatedContent` | boolean | Gibt an, ob der Dokumentinhalt erfolgreich aktualisiert wurde |
|
||||
| `metadata` | json | Aktualisierte Dokument-Metadaten einschließlich ID, Titel und URL |
|
||||
|
||||
### `google_docs_create`
|
||||
|
||||
Ein neues Google Docs-Dokument erstellen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `title` | string | Ja | Der Titel des zu erstellenden Dokuments |
|
||||
| `content` | string | Nein | Der Inhalt des zu erstellenden Dokuments |
|
||||
| `folderSelector` | string | Nein | Wählen Sie den Ordner aus, in dem das Dokument erstellt werden soll |
|
||||
| `folderId` | string | Nein | Die ID des Ordners, in dem das Dokument erstellt werden soll \(interne Verwendung\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `metadata` | json | Metadaten des erstellten Dokuments einschließlich ID, Titel und URL |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `google_docs`
|
||||
|
||||
@@ -124,3 +124,270 @@ Dateien und Ordner in Google Drive auflisten
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `google_drive`
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `file` | file | Heruntergeladene Datei, gespeichert in Ausführungsdateien |
|
||||
| `metadata` | object | Vollständige Dateimetadaten von Google Drive |
|
||||
| ↳ `id` | string | Google Drive-Datei-ID |
|
||||
| ↳ `kind` | string | Ressourcentyp-Kennung |
|
||||
| ↳ `name` | string | Dateiname |
|
||||
| ↳ `mimeType` | string | MIME-Typ |
|
||||
| ↳ `description` | string | Dateibeschreibung |
|
||||
| ↳ `originalFilename` | string | Original hochgeladener Dateiname |
|
||||
| ↳ `fullFileExtension` | string | Vollständige Dateierweiterung |
|
||||
| ↳ `fileExtension` | string | Dateierweiterung |
|
||||
| ↳ `owners` | json | Liste der Dateieigentümer |
|
||||
| ↳ `permissions` | json | Dateiberechtigungen |
|
||||
| ↳ `permissionIds` | json | Berechtigungs-IDs |
|
||||
| ↳ `shared` | boolean | Ob Datei geteilt ist |
|
||||
| ↳ `ownedByMe` | boolean | Ob im Besitz des aktuellen Benutzers |
|
||||
| ↳ `writersCanShare` | boolean | Ob Autoren teilen können |
|
||||
| ↳ `viewersCanCopyContent` | boolean | Ob Betrachter kopieren können |
|
||||
| ↳ `copyRequiresWriterPermission` | boolean | Ob Kopieren Autorenberechtigung erfordert |
|
||||
| ↳ `sharingUser` | json | Benutzer, der die Datei geteilt hat |
|
||||
| ↳ `starred` | boolean | Ob Datei mit Stern markiert ist |
|
||||
| ↳ `trashed` | boolean | Ob Datei im Papierkorb ist |
|
||||
| ↳ `explicitlyTrashed` | boolean | Ob explizit in Papierkorb verschoben |
|
||||
| ↳ `appProperties` | json | App-spezifische Eigenschaften |
|
||||
| ↳ `createdTime` | string | Dateierstellungszeit |
|
||||
| ↳ `modifiedTime` | string | Letzte Änderungszeit |
|
||||
| ↳ `modifiedByMeTime` | string | Wann vom aktuellen Benutzer geändert |
|
||||
| ↳ `viewedByMeTime` | string | Wann zuletzt vom aktuellen Benutzer angesehen |
|
||||
| ↳ `sharedWithMeTime` | string | Wann mit aktuellem Benutzer geteilt |
|
||||
| ↳ `lastModifyingUser` | json | Benutzer, der die Datei zuletzt geändert hat |
|
||||
| ↳ `viewedByMe` | boolean | Ob vom aktuellen Benutzer angesehen |
|
||||
| ↳ `modifiedByMe` | boolean | Ob vom aktuellen Benutzer geändert |
|
||||
| ↳ `webViewLink` | string | URL zum Anzeigen im Browser |
|
||||
| ↳ `webContentLink` | string | Direkte Download-URL |
|
||||
| ↳ `iconLink` | string | URL zum Dateisymbol |
|
||||
| ↳ `thumbnailLink` | string | URL zum Vorschaubild |
|
||||
| ↳ `exportLinks` | json | Exportformat-Links |
|
||||
| ↳ `size` | string | Dateigröße in Bytes |
|
||||
| ↳ `quotaBytesUsed` | string | Verwendetes Speicherkontingent |
|
||||
| ↳ `md5Checksum` | string | MD5-Hash |
|
||||
| ↳ `sha1Checksum` | string | SHA-1-Hash |
|
||||
| ↳ `sha256Checksum` | string | SHA-256-Hash |
|
||||
| ↳ `parents` | json | Übergeordnete Ordner-IDs |
|
||||
| ↳ `spaces` | json | Bereiche, die Datei enthalten |
|
||||
| ↳ `driveId` | string | Geteilte Laufwerk-ID |
|
||||
| ↳ `capabilities` | json | Benutzerfähigkeiten für Datei |
|
||||
| ↳ `version` | string | Versionsnummer |
|
||||
| ↳ `headRevisionId` | string | Hauptrevisions-ID |
|
||||
| ↳ `hasThumbnail` | boolean | Ob Vorschaubild vorhanden |
|
||||
| ↳ `thumbnailVersion` | string | Vorschaubild-Version |
|
||||
| ↳ `imageMediaMetadata` | json | Bildspezifische Metadaten |
|
||||
| ↳ `videoMediaMetadata` | json | Videospezifische Metadaten |
|
||||
| ↳ `isAppAuthorized` | boolean | Ob von anfragender App erstellt |
|
||||
| ↳ `contentRestrictions` | json | Inhaltsbeschränkungen |
|
||||
| ↳ `linkShareMetadata` | json | Link-Freigabe-Metadaten |
|
||||
| ↳ `revisions` | json | Dateirevisionshistorie \(nur erste 100 Revisionen\) |
|
||||
|
||||
### `google_drive_copy`
|
||||
|
||||
Erstellen Sie eine Kopie einer Datei in Google Drive
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `fileId` | string | Ja | Die ID der zu kopierenden Datei |
|
||||
| `newName` | string | Nein | Name für die kopierte Datei (Standard: "Kopie von [ursprünglicher Name]") |
|
||||
| `destinationFolderId` | string | Nein | ID des Ordners, in dem die Kopie abgelegt werden soll (Standard: gleicher Speicherort wie das Original) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `file` | json | Die Metadaten der kopierten Datei |
|
||||
| ↳ `id` | string | Google Drive-Datei-ID der Kopie |
|
||||
| ↳ `kind` | string | Ressourcentyp-Kennung |
|
||||
| ↳ `name` | string | Dateiname |
|
||||
| ↳ `mimeType` | string | MIME-Typ |
|
||||
| ↳ `webViewLink` | string | URL zum Anzeigen im Browser |
|
||||
| ↳ `parents` | json | IDs der übergeordneten Ordner |
|
||||
| ↳ `createdTime` | string | Erstellungszeit der Datei |
|
||||
| ↳ `modifiedTime` | string | Zeitpunkt der letzten Änderung |
|
||||
| ↳ `owners` | json | Liste der Dateieigentümer |
|
||||
| ↳ `size` | string | Dateigröße in Bytes |
|
||||
|
||||
### `google_drive_update`
|
||||
|
||||
Aktualisieren Sie Dateimetadaten in Google Drive (umbenennen, verschieben, mit Stern markieren, Beschreibung hinzufügen)
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `fileId` | string | Ja | Die ID der zu aktualisierenden Datei |
|
||||
| `name` | string | Nein | Neuer Name für die Datei |
|
||||
| `description` | string | Nein | Neue Beschreibung für die Datei |
|
||||
| `addParents` | string | Nein | Durch Kommas getrennte Liste von IDs übergeordneter Ordner, die hinzugefügt werden sollen (verschiebt die Datei in diese Ordner) |
|
||||
| `removeParents` | string | Nein | Durch Kommas getrennte Liste von IDs übergeordneter Ordner, die entfernt werden sollen |
|
||||
| `starred` | boolean | Nein | Ob die Datei mit einem Stern markiert oder die Markierung entfernt werden soll |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `file` | json | Die aktualisierten Dateimetadaten |
|
||||
| ↳ `id` | string | Google Drive-Datei-ID |
|
||||
| ↳ `kind` | string | Ressourcentyp-Kennung |
|
||||
| ↳ `name` | string | Dateiname |
|
||||
| ↳ `mimeType` | string | MIME-Typ |
|
||||
| ↳ `description` | string | Dateibeschreibung |
|
||||
| ↳ `starred` | boolean | Ob die Datei mit Stern markiert ist |
|
||||
| ↳ `webViewLink` | string | URL zum Anzeigen im Browser |
|
||||
| ↳ `parents` | json | IDs der übergeordneten Ordner |
|
||||
| ↳ `modifiedTime` | string | Zeitpunkt der letzten Änderung |
|
||||
|
||||
### `google_drive_trash`
|
||||
|
||||
Eine Datei in den Papierkorb von Google Drive verschieben (kann später wiederhergestellt werden)
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `fileId` | string | Ja | Die ID der Datei, die in den Papierkorb verschoben werden soll |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `file` | json | Die Metadaten der gelöschten Datei |
|
||||
| ↳ `id` | string | Google Drive-Datei-ID |
|
||||
| ↳ `kind` | string | Ressourcentyp-Kennung |
|
||||
| ↳ `name` | string | Dateiname |
|
||||
| ↳ `mimeType` | string | MIME-Typ |
|
||||
| ↳ `trashed` | boolean | Ob sich die Datei im Papierkorb befindet (sollte true sein) |
|
||||
| ↳ `trashedTime` | string | Zeitpunkt, zu dem die Datei gelöscht wurde |
|
||||
| ↳ `webViewLink` | string | URL zum Anzeigen im Browser |
|
||||
|
||||
### `google_drive_delete`
|
||||
|
||||
Eine Datei dauerhaft aus Google Drive löschen (umgeht den Papierkorb)
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `fileId` | string | Ja | Die ID der Datei, die dauerhaft gelöscht werden soll |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `deleted` | boolean | Ob die Datei erfolgreich gelöscht wurde |
|
||||
| `fileId` | string | Die ID der gelöschten Datei |
|
||||
|
||||
### `google_drive_share`
|
||||
|
||||
Eine Datei mit einem Benutzer, einer Gruppe, einer Domain teilen oder öffentlich machen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `fileId` | string | Ja | Die ID der Datei, die geteilt werden soll |
|
||||
| `type` | string | Ja | Art des Empfängers: user, group, domain oder anyone |
|
||||
| `role` | string | Ja | Berechtigungsrolle: owner \(Eigentümerschaft übertragen\), organizer \(nur freigegebenes Laufwerk\), fileOrganizer \(nur freigegebenes Laufwerk\), writer \(bearbeiten\), commenter \(ansehen und kommentieren\), reader \(nur ansehen\) |
|
||||
| `email` | string | Nein | E-Mail-Adresse des Benutzers oder der Gruppe \(erforderlich für type=user oder type=group\) |
|
||||
| `domain` | string | Nein | Domain, mit der geteilt werden soll \(erforderlich für type=domain\) |
|
||||
| `transferOwnership` | boolean | Nein | Erforderlich, wenn die Rolle owner ist. Überträgt die Eigentümerschaft an den angegebenen Benutzer. |
|
||||
| `moveToNewOwnersRoot` | boolean | Nein | Beim Übertragen der Eigentümerschaft die Datei in den Stammordner von „Meine Ablage" des neuen Eigentümers verschieben. |
|
||||
| `sendNotification` | boolean | Nein | Ob eine E-Mail-Benachrichtigung gesendet werden soll \(Standard: true\) |
|
||||
| `emailMessage` | string | Nein | Benutzerdefinierte Nachricht, die in die Benachrichtigungs-E-Mail aufgenommen werden soll |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `permission` | json | Die Details der erstellten Berechtigung |
|
||||
| ↳ `id` | string | Berechtigungs-ID |
|
||||
| ↳ `type` | string | Empfängertyp \(user, group, domain, anyone\) |
|
||||
| ↳ `role` | string | Berechtigungsrolle |
|
||||
| ↳ `emailAddress` | string | E-Mail des Empfängers |
|
||||
| ↳ `displayName` | string | Anzeigename des Empfängers |
|
||||
| ↳ `domain` | string | Domain des Empfängers |
|
||||
| ↳ `expirationTime` | string | Ablaufzeit |
|
||||
| ↳ `deleted` | boolean | Ob der Empfänger gelöscht wurde |
|
||||
|
||||
### `google_drive_unshare`
|
||||
|
||||
Eine Berechtigung von einer Datei entfernen (Zugriff widerrufen)
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `fileId` | string | Ja | Die ID der Datei, deren Berechtigungen geändert werden sollen |
|
||||
| `permissionId` | string | Ja | Die ID der zu entfernenden Berechtigung \(verwenden Sie list_permissions, um diese zu finden\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `removed` | boolean | Ob die Berechtigung erfolgreich entfernt wurde |
|
||||
| `fileId` | string | Die ID der Datei |
|
||||
| `permissionId` | string | Die ID der entfernten Berechtigung |
|
||||
|
||||
### `google_drive_list_permissions`
|
||||
|
||||
Alle Berechtigungen (wer hat Zugriff) für eine Datei in Google Drive auflisten
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `fileId` | string | Ja | Die ID der Datei, für die Berechtigungen aufgelistet werden sollen |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `permissions` | array | Liste der Berechtigungen für die Datei |
|
||||
| ↳ `id` | string | Berechtigungs-ID \(zum Entfernen der Berechtigung verwenden\) |
|
||||
| ↳ `type` | string | Empfängertyp \(user, group, domain, anyone\) |
|
||||
| ↳ `role` | string | Berechtigungsrolle \(owner, organizer, fileOrganizer, writer, commenter, reader\) |
|
||||
| ↳ `emailAddress` | string | E-Mail des Empfängers |
|
||||
| ↳ `displayName` | string | Anzeigename des Empfängers |
|
||||
| ↳ `photoLink` | string | Foto-URL des Empfängers |
|
||||
| ↳ `domain` | string | Domain des Empfängers |
|
||||
| ↳ `expirationTime` | string | Ablaufzeitpunkt der Berechtigung |
|
||||
| ↳ `deleted` | boolean | Ob das Empfängerkonto gelöscht wurde |
|
||||
| ↳ `allowFileDiscovery` | boolean | Ob die Datei vom Empfänger auffindbar ist |
|
||||
| ↳ `pendingOwner` | boolean | Ob eine Eigentumsübertragung aussteht |
|
||||
| ↳ `permissionDetails` | json | Details zu geerbten Berechtigungen |
|
||||
| `nextPageToken` | string | Token zum Abrufen der nächsten Seite von Berechtigungen |
|
||||
|
||||
### `google_drive_get_about`
|
||||
|
||||
Informationen über den Benutzer und sein Google Drive abrufen (Speicherkontingent, Funktionen)
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `user` | json | Informationen über den authentifizierten Benutzer |
|
||||
| ↳ `displayName` | string | Anzeigename des Benutzers |
|
||||
| ↳ `emailAddress` | string | E-Mail-Adresse des Benutzers |
|
||||
| ↳ `photoLink` | string | URL zum Profilfoto des Benutzers |
|
||||
| ↳ `permissionId` | string | Berechtigungs-ID des Benutzers |
|
||||
| ↳ `me` | boolean | Ob dies der authentifizierte Benutzer ist |
|
||||
| `storageQuota` | json | Informationen zum Speicherkontingent in Bytes |
|
||||
| ↳ `limit` | string | Gesamtes Speicherlimit in Bytes \(null für unbegrenzt\) |
|
||||
| ↳ `usage` | string | Insgesamt verwendeter Speicher in Bytes |
|
||||
| ↳ `usageInDrive` | string | Von Drive-Dateien verwendeter Speicher in Bytes |
|
||||
| ↳ `usageInDriveTrash` | string | Von gelöschten Dateien verwendeter Speicher in Bytes |
|
||||
| `canCreateDrives` | boolean | Ob der Benutzer geteilte Ablagen erstellen kann |
|
||||
| `importFormats` | json | Zuordnung von MIME-Typen, die importiert werden können, und ihren Zielformaten |
|
||||
| `exportFormats` | json | Zuordnung von Google Workspace-MIME-Typen und ihren exportierbaren Formaten |
|
||||
| `maxUploadSize` | string | Maximale Upload-Größe in Bytes |
|
||||
|
||||
@@ -52,3 +52,193 @@ Integrieren Sie Google Forms in Ihren Workflow. Geben Sie eine Formular-ID an, u
|
||||
|
||||
- Kategorie: `tools`
|
||||
- Typ: `google_forms`
|
||||
|
||||
Ruft eine Formularstruktur einschließlich ihrer Elemente, Einstellungen und Metadaten ab
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `formId` | string | Ja | Die ID des abzurufenden Google-Formulars |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `formId` | string | Die Formular-ID |
|
||||
| `title` | string | Der für Befragte sichtbare Formulartitel |
|
||||
| `description` | string | Die Formularbeschreibung |
|
||||
| `documentTitle` | string | Der in Drive sichtbare Dokumenttitel |
|
||||
| `responderUri` | string | Die URI zum Teilen mit Befragten |
|
||||
| `linkedSheetId` | string | Die ID der verknüpften Google-Tabelle |
|
||||
| `revisionId` | string | Die Revisions-ID des Formulars |
|
||||
| `items` | array | Die Formularelemente (Fragen, Abschnitte usw.) |
|
||||
| ↳ `itemId` | string | Element-ID |
|
||||
| ↳ `title` | string | Elementtitel |
|
||||
| ↳ `description` | string | Elementbeschreibung |
|
||||
| `settings` | json | Formulareinstellungen |
|
||||
| `publishSettings` | json | Formularveröffentlichungseinstellungen |
|
||||
|
||||
### `google_forms_create_form`
|
||||
|
||||
Erstellt ein neues Google-Formular mit einem Titel
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `title` | string | Ja | Der für Befragte sichtbare Titel des Formulars |
|
||||
| `documentTitle` | string | Nein | Der in Drive sichtbare Dokumenttitel (standardmäßig der Formulartitel) |
|
||||
| `unpublished` | boolean | Nein | Falls true, wird ein unveröffentlichtes Formular erstellt, das keine Antworten akzeptiert |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `formId` | string | Die ID des erstellten Formulars |
|
||||
| `title` | string | Der Formulartitel |
|
||||
| `documentTitle` | string | Der Dokumenttitel in Drive |
|
||||
| `responderUri` | string | Die URI zum Teilen mit Befragten |
|
||||
| `revisionId` | string | Die Revisions-ID des Formulars |
|
||||
|
||||
### `google_forms_batch_update`
|
||||
|
||||
Mehrere Aktualisierungen auf ein Formular anwenden (Elemente hinzufügen, Informationen aktualisieren, Einstellungen ändern usw.)
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `formId` | string | Ja | Google Forms Formular-ID |
|
||||
| `requests` | json | Ja | Array von Aktualisierungsanfragen (updateFormInfo, updateSettings, createItem, updateItem, moveItem, deleteItem) |
|
||||
| `includeFormInResponse` | boolean | Nein | Ob das aktualisierte Formular in der Antwort zurückgegeben werden soll |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `replies` | array | Die Antworten von jeder Aktualisierungsanfrage |
|
||||
| `writeControl` | object | Schreibsteuerungsinformationen mit Revisions-IDs |
|
||||
| ↳ `requiredRevisionId` | string | Erforderliche Revisions-ID zur Konflikterkennung |
|
||||
| ↳ `targetRevisionId` | string | Ziel-Revisions-ID |
|
||||
| `form` | object | Das aktualisierte Formular (falls includeFormInResponse true war) |
|
||||
| ↳ `formId` | string | Die Formular-ID |
|
||||
| ↳ `info` | object | Formularinformationen mit Titel und Beschreibung |
|
||||
| ↳ `title` | string | Der für Befragte sichtbare Formulartitel |
|
||||
| ↳ `description` | string | Die Formularbeschreibung |
|
||||
| ↳ `documentTitle` | string | Der in Drive sichtbare Dokumenttitel |
|
||||
| ↳ `settings` | object | Formulareinstellungen |
|
||||
| ↳ `quizSettings` | object | Quiz-Einstellungen |
|
||||
| ↳ `isQuiz` | boolean | Ob das Formular ein Quiz ist |
|
||||
| ↳ `emailCollectionType` | string | E-Mail-Erfassungstyp |
|
||||
| ↳ `revisionId` | string | Die Revisions-ID des Formulars |
|
||||
| ↳ `responderUri` | string | Die URI zum Teilen mit Befragten |
|
||||
| ↳ `linkedSheetId` | string | Die ID des verknüpften Google Sheets |
|
||||
| ↳ `publishSettings` | object | Formularveröffentlichungseinstellungen |
|
||||
| ↳ `publishState` | object | Aktueller Veröffentlichungsstatus |
|
||||
| ↳ `isPublished` | boolean | Ob das Formular veröffentlicht ist |
|
||||
| ↳ `isAcceptingResponses` | boolean | Ob das Formular Antworten akzeptiert |
|
||||
|
||||
### `google_forms_set_publish_settings`
|
||||
|
||||
Aktualisiert die Veröffentlichungseinstellungen eines Formulars (veröffentlichen/zurückziehen, Antworten akzeptieren)
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `formId` | string | Ja | Google Forms Formular-ID |
|
||||
| `isPublished` | boolean | Ja | Ob das Formular veröffentlicht und für andere sichtbar ist |
|
||||
| `isAcceptingResponses` | boolean | Nein | Ob das Formular Antworten akzeptiert \(wird auf false gesetzt, wenn isPublished false ist\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `formId` | string | Die Formular-ID |
|
||||
| `publishSettings` | json | Die aktualisierten Veröffentlichungseinstellungen |
|
||||
| ↳ `publishState` | object | Der Veröffentlichungsstatus |
|
||||
| ↳ `isPublished` | boolean | Ob das Formular veröffentlicht ist |
|
||||
| ↳ `isAcceptingResponses` | boolean | Ob das Formular Antworten akzeptiert |
|
||||
|
||||
### `google_forms_create_watch`
|
||||
|
||||
Erstellt eine Benachrichtigungsüberwachung für Formularänderungen (Schemaänderungen oder neue Antworten)
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `formId` | string | Ja | Google Forms Formular-ID zur Überwachung |
|
||||
| `eventType` | string | Ja | Zu überwachender Ereignistyp: SCHEMA \(Formularänderungen\) oder RESPONSES \(neue Einreichungen\) |
|
||||
| `topicName` | string | Ja | Der Cloud Pub/Sub Topic-Name \(Format: projects/\{project\}/topics/\{topic\}\) |
|
||||
| `watchId` | string | Nein | Benutzerdefinierte Watch-ID \(4-63 Zeichen, Kleinbuchstaben, Zahlen, Bindestriche\) |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Die Watch-ID |
|
||||
| `eventType` | string | Der überwachte Ereignistyp |
|
||||
| `topicName` | string | Das Cloud Pub/Sub-Thema |
|
||||
| `createTime` | string | Zeitpunkt der Erstellung der Watch |
|
||||
| `expireTime` | string | Ablaufzeitpunkt der Watch \(7 Tage nach Erstellung\) |
|
||||
| `state` | string | Der Watch-Status \(ACTIVE, SUSPENDED\) |
|
||||
|
||||
### `google_forms_list_watches`
|
||||
|
||||
Alle Benachrichtigungs-Watches für ein Formular auflisten
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `formId` | string | Ja | Google Forms Formular-ID |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `watches` | array | Liste der Watches für das Formular |
|
||||
| ↳ `id` | string | Watch-ID |
|
||||
| ↳ `eventType` | string | Ereignistyp \(SCHEMA oder RESPONSES\) |
|
||||
| ↳ `createTime` | string | Zeitpunkt der Erstellung der Watch |
|
||||
| ↳ `expireTime` | string | Ablaufzeitpunkt der Watch |
|
||||
| ↳ `state` | string | Watch-Status |
|
||||
|
||||
### `google_forms_delete_watch`
|
||||
|
||||
Eine Benachrichtigungs-Watch von einem Formular löschen
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `formId` | string | Ja | Google Forms Formular-ID |
|
||||
| `watchId` | string | Ja | Zu löschende Watch-ID |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `deleted` | boolean | Ob die Überwachung erfolgreich gelöscht wurde |
|
||||
|
||||
### `google_forms_renew_watch`
|
||||
|
||||
Verlängert eine Benachrichtigungsüberwachung um weitere 7 Tage
|
||||
|
||||
#### Eingabe
|
||||
|
||||
| Parameter | Typ | Erforderlich | Beschreibung |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `formId` | string | Ja | Google Forms Formular-ID |
|
||||
| `watchId` | string | Ja | Zu verlängernde Überwachungs-ID |
|
||||
|
||||
#### Ausgabe
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| --------- | ---- | ----------- |
|
||||
| `id` | string | Die Überwachungs-ID |
|
||||
| `eventType` | string | Der überwachte Ereignistyp |
|
||||
| `expireTime` | string | Die neue Ablaufzeit |
|
||||
| `state` | string | Der Überwachungsstatus |
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user