diff --git a/README.md b/README.md index 317aa02b9d..aa25eda538 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,36 @@ Wait for the model to download, then visit [http://localhost:3000](http://localh docker compose -f docker-compose.ollama.yml exec ollama ollama pull llama3.1:8b ``` +#### Using an External Ollama Instance + +If you already have Ollama running on your host machine (outside Docker), you need to configure the `OLLAMA_URL` to use `host.docker.internal` instead of `localhost`: + +```bash +# Docker Desktop (macOS/Windows) +OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d + +# Linux (add extra_hosts or use host IP) +docker compose -f docker-compose.prod.yml up -d # Then set OLLAMA_URL to your host's IP +``` + +**Why?** When running inside Docker, `localhost` refers to the container itself, not your host machine. `host.docker.internal` is a special DNS name that resolves to the host. + +For Linux users, you can either: +- Use your host machine's actual IP address (e.g., `http://192.168.1.100:11434`) +- Add `extra_hosts: ["host.docker.internal:host-gateway"]` to the simstudio service in your compose file + +#### Using vLLM + +Sim also supports [vLLM](https://docs.vllm.ai/) for self-hosted models with OpenAI-compatible API: + +```bash +# Set these environment variables +VLLM_BASE_URL=http://your-vllm-server:8000 +VLLM_API_KEY=your_optional_api_key # Only if your vLLM instance requires auth +``` + +When running with Docker, use `host.docker.internal` if vLLM is on your host machine (same as Ollama above). + ### Self-hosted: Dev Containers 1. Open VS Code with the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) @@ -190,6 +220,46 @@ Copilot is a Sim-managed service. To use Copilot on a self-hosted instance: - Go to https://sim.ai → Settings → Copilot and generate a Copilot API key - Set `COPILOT_API_KEY` environment variable in your self-hosted apps/sim/.env file to that value +## Environment Variables + +Key environment variables for self-hosted deployments (see `apps/sim/.env.example` for full list): + +| Variable | Required | Description | +|----------|----------|-------------| +| `DATABASE_URL` | Yes | PostgreSQL connection string with pgvector | +| `BETTER_AUTH_SECRET` | Yes | Auth secret (`openssl rand -hex 32`) | +| `BETTER_AUTH_URL` | Yes | Your app URL (e.g., `http://localhost:3000`) | +| `NEXT_PUBLIC_APP_URL` | Yes | Public app URL (same as above) | +| `ENCRYPTION_KEY` | Yes | Encryption key (`openssl rand -hex 32`) | +| `OLLAMA_URL` | No | Ollama server URL (default: `http://localhost:11434`) | +| `VLLM_BASE_URL` | No | vLLM server URL for self-hosted models | +| `COPILOT_API_KEY` | No | API key from sim.ai for Copilot features | + +## Troubleshooting + +### Ollama models not showing in dropdown (Docker) + +If you're running Ollama on your host machine and Sim in Docker, change `OLLAMA_URL` from `localhost` to `host.docker.internal`: + +```bash +OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d +``` + +See [Using an External Ollama Instance](#using-an-external-ollama-instance) for details. + +### Database connection issues + +Ensure PostgreSQL has the pgvector extension installed. When using Docker, wait for the database to be healthy before running migrations. + +### Port conflicts + +If ports 3000, 3002, or 5432 are in use, configure alternatives: + +```bash +# Custom ports +NEXT_PUBLIC_APP_URL=http://localhost:3100 POSTGRES_PORT=5433 docker compose up -d +``` + ## Tech Stack - **Framework**: [Next.js](https://nextjs.org/) (App Router) diff --git a/apps/docs/app/[lang]/[[...slug]]/page.tsx b/apps/docs/app/[lang]/[[...slug]]/page.tsx index b75a7e5bab..f20d2604c3 100644 --- a/apps/docs/app/[lang]/[[...slug]]/page.tsx +++ b/apps/docs/app/[lang]/[[...slug]]/page.tsx @@ -182,7 +182,11 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l tableOfContent={{ style: 'clerk', enabled: true, - header:
On this page
, + header: ( +
+ On this page +
+ ), footer: , single: false, }} diff --git a/apps/docs/app/[lang]/layout.tsx b/apps/docs/app/[lang]/layout.tsx index c08bc3d877..4dbd3d5a4f 100644 --- a/apps/docs/app/[lang]/layout.tsx +++ b/apps/docs/app/[lang]/layout.tsx @@ -101,9 +101,6 @@ export default async function Layout({ children, params }: LayoutProps) { {children} diff --git a/apps/docs/app/global.css b/apps/docs/app/global.css index b309ef9a90..2a3effa4a0 100644 --- a/apps/docs/app/global.css +++ b/apps/docs/app/global.css @@ -96,45 +96,48 @@ aside#nd-sidebar { border-right: none !important; } -/* Responsive sidebar positioning */ -/* Mobile: Fumadocs handles drawer */ -@media (min-width: 768px) and (max-width: 1024px) { - aside[data-sidebar], - aside#nd-sidebar { - left: var(--sidebar-offset) !important; - } +/* Fumadocs v16: Add sidebar placeholder styling for grid area */ +[data-sidebar-placeholder] { + background: transparent !important; } -/* Desktop layout alignment */ -@media (min-width: 1025px) { - [data-sidebar-container] { - margin-left: var(--sidebar-offset) !important; +/* Fumadocs v16: Hide sidebar panel (floating collapse button) */ +[data-sidebar-panel] { + display: none !important; +} + +/* Mobile only: Reduce gap between navbar and content */ +@media (max-width: 1023px) { + #nd-docs-layout { + margin-top: -25px; } - aside[data-sidebar], - aside#nd-sidebar { - left: var(--sidebar-offset) !important; +} + +/* Desktop only: Apply custom navbar offset, sidebar width and margin offsets */ +/* On mobile, let fumadocs handle the layout natively */ +@media (min-width: 1024px) { + :root { + --fd-banner-height: 64px !important; } - /* TOC positioning - target all possible selectors */ - [data-toc], - aside[data-toc], - div[data-toc], - .fd-toc, - #nd-toc, - nav[data-toc], - aside:has([role="complementary"]) { - right: var(--toc-offset) !important; + + #nd-docs-layout { + --fd-docs-height: calc(100dvh - 64px) !important; + --fd-sidebar-width: 300px !important; + margin-left: var(--sidebar-offset) !important; + margin-right: var(--toc-offset) !important; } - /* Alternative TOC container targeting */ - [data-docs-page] > aside:last-child, - main ~ aside { - right: var(--toc-offset) !important; + /* Hide fumadocs nav on desktop - we use custom navbar there */ + #nd-docs-layout > header { + display: none !important; } } /* Sidebar spacing - compact like turborepo */ -[data-sidebar-viewport] { - padding: 0.5rem 20px 12px; +/* Fumadocs v16: [data-sidebar-viewport] doesn't exist, target #nd-sidebar > div instead */ +[data-sidebar-viewport], +#nd-sidebar > div { + padding: 0.5rem 12px 12px; background: transparent !important; background-color: transparent !important; } @@ -142,8 +145,9 @@ aside#nd-sidebar { /* Override sidebar item styling to match Raindrop */ /* Target Link and button elements in sidebar - override Fumadocs itemVariants */ /* Exclude the small chevron-only toggle buttons */ -#nd-sidebar a, -#nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) { +/* Using html prefix for higher specificity over Tailwind v4 utilities */ +html #nd-sidebar a, +html #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) { font-size: 0.9375rem !important; /* 15px to match Raindrop */ line-height: 1.4 !important; padding: 0.5rem 0.75rem !important; /* More compact like Raindrop */ @@ -154,14 +158,14 @@ aside#nd-sidebar { } /* Dark mode sidebar text */ -.dark #nd-sidebar a, -.dark #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) { +html.dark #nd-sidebar a, +html.dark #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) { color: rgba(255, 255, 255, 0.6) !important; } /* Light mode sidebar text */ -:root:not(.dark) #nd-sidebar a, -:root:not(.dark) #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) { +html:not(.dark) #nd-sidebar a, +html:not(.dark) #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) { color: rgba(0, 0, 0, 0.6) !important; } @@ -194,7 +198,10 @@ aside#nd-sidebar { } /* Section headers should be slightly larger */ -[data-sidebar-viewport] [data-separator] { +/* Fumadocs v16: Also target #nd-sidebar for compatibility */ +[data-sidebar-viewport] [data-separator], +#nd-sidebar [data-separator], +#nd-sidebar p { font-size: 0.75rem !important; font-weight: 600 !important; text-transform: uppercase !important; @@ -218,61 +225,61 @@ aside#nd-sidebar { } /* Dark mode active state */ -.dark #nd-sidebar a[data-active="true"], -.dark #nd-sidebar button[data-active="true"], -.dark #nd-sidebar a.bg-fd-primary\/10, -.dark #nd-sidebar a.text-fd-primary, -.dark #nd-sidebar a[class*="bg-fd-primary"], -.dark #nd-sidebar a[class*="text-fd-primary"], -.dark #nd-sidebar a.bg-purple-50\/80, -.dark #nd-sidebar a.text-purple-600, -.dark #nd-sidebar a[class*="bg-purple"], -.dark #nd-sidebar a[class*="text-purple"] { +html.dark #nd-sidebar a[data-active="true"], +html.dark #nd-sidebar button[data-active="true"], +html.dark #nd-sidebar a.bg-fd-primary\/10, +html.dark #nd-sidebar a.text-fd-primary, +html.dark #nd-sidebar a[class*="bg-fd-primary"], +html.dark #nd-sidebar a[class*="text-fd-primary"], +html.dark #nd-sidebar a.bg-purple-50\/80, +html.dark #nd-sidebar a.text-purple-600, +html.dark #nd-sidebar a[class*="bg-purple"], +html.dark #nd-sidebar a[class*="text-purple"] { background-color: rgba(255, 255, 255, 0.15) !important; color: rgba(255, 255, 255, 1) !important; } /* Light mode active state */ -:root:not(.dark) #nd-sidebar a[data-active="true"], -:root:not(.dark) #nd-sidebar button[data-active="true"], -:root:not(.dark) #nd-sidebar a.bg-fd-primary\/10, -:root:not(.dark) #nd-sidebar a.text-fd-primary, -:root:not(.dark) #nd-sidebar a[class*="bg-fd-primary"], -:root:not(.dark) #nd-sidebar a[class*="text-fd-primary"], -:root:not(.dark) #nd-sidebar a.bg-purple-50\/80, -:root:not(.dark) #nd-sidebar a.text-purple-600, -:root:not(.dark) #nd-sidebar a[class*="bg-purple"], -:root:not(.dark) #nd-sidebar a[class*="text-purple"] { +html:not(.dark) #nd-sidebar a[data-active="true"], +html:not(.dark) #nd-sidebar button[data-active="true"], +html:not(.dark) #nd-sidebar a.bg-fd-primary\/10, +html:not(.dark) #nd-sidebar a.text-fd-primary, +html:not(.dark) #nd-sidebar a[class*="bg-fd-primary"], +html:not(.dark) #nd-sidebar a[class*="text-fd-primary"], +html:not(.dark) #nd-sidebar a.bg-purple-50\/80, +html:not(.dark) #nd-sidebar a.text-purple-600, +html:not(.dark) #nd-sidebar a[class*="bg-purple"], +html:not(.dark) #nd-sidebar a[class*="text-purple"] { background-color: rgba(0, 0, 0, 0.07) !important; color: rgba(0, 0, 0, 0.9) !important; } /* Dark mode hover state */ -.dark #nd-sidebar a:hover:not([data-active="true"]), -.dark #nd-sidebar button:hover:not([data-active="true"]) { +html.dark #nd-sidebar a:hover:not([data-active="true"]), +html.dark #nd-sidebar button:hover:not([data-active="true"]) { background-color: rgba(255, 255, 255, 0.08) !important; } /* Light mode hover state */ -:root:not(.dark) #nd-sidebar a:hover:not([data-active="true"]), -:root:not(.dark) #nd-sidebar button:hover:not([data-active="true"]) { +html:not(.dark) #nd-sidebar a:hover:not([data-active="true"]), +html:not(.dark) #nd-sidebar button:hover:not([data-active="true"]) { background-color: rgba(0, 0, 0, 0.03) !important; } /* Dark mode - ensure active/selected items don't change on hover */ -.dark #nd-sidebar a.bg-purple-50\/80:hover, -.dark #nd-sidebar a[class*="bg-purple"]:hover, -.dark #nd-sidebar a[data-active="true"]:hover, -.dark #nd-sidebar button[data-active="true"]:hover { +html.dark #nd-sidebar a.bg-purple-50\/80:hover, +html.dark #nd-sidebar a[class*="bg-purple"]:hover, +html.dark #nd-sidebar a[data-active="true"]:hover, +html.dark #nd-sidebar button[data-active="true"]:hover { background-color: rgba(255, 255, 255, 0.15) !important; color: rgba(255, 255, 255, 1) !important; } /* Light mode - ensure active/selected items don't change on hover */ -:root:not(.dark) #nd-sidebar a.bg-purple-50\/80:hover, -:root:not(.dark) #nd-sidebar a[class*="bg-purple"]:hover, -:root:not(.dark) #nd-sidebar a[data-active="true"]:hover, -:root:not(.dark) #nd-sidebar button[data-active="true"]:hover { +html:not(.dark) #nd-sidebar a.bg-purple-50\/80:hover, +html:not(.dark) #nd-sidebar a[class*="bg-purple"]:hover, +html:not(.dark) #nd-sidebar a[data-active="true"]:hover, +html:not(.dark) #nd-sidebar button[data-active="true"]:hover { background-color: rgba(0, 0, 0, 0.07) !important; color: rgba(0, 0, 0, 0.9) !important; } @@ -351,7 +358,16 @@ aside[data-sidebar] > *:not([data-sidebar-viewport]) { [data-sidebar] [data-title], #nd-sidebar > a:first-child, #nd-sidebar > div:first-child > a:first-child, - #nd-sidebar img[alt="Sim"] { + #nd-sidebar img[alt="Sim"], + /* Hide theme toggle at bottom of sidebar on desktop */ + #nd-sidebar + > footer, + #nd-sidebar footer, + aside#nd-sidebar > *:last-child:not(div), + #nd-sidebar > button:last-child, + #nd-sidebar button[aria-label*="theme" i], + #nd-sidebar button[aria-label*="Theme"], + #nd-sidebar > div:last-child > button { display: none !important; visibility: hidden !important; height: 0 !important; @@ -498,13 +514,14 @@ main article, ============================================ */ /* Main content area - center and constrain like turborepo/raindrop */ +/* Note: --sidebar-offset and --toc-offset are now applied at #nd-docs-layout level */ main[data-main] { max-width: var(--spacing-fd-container, 1400px); margin-left: auto; margin-right: auto; padding-top: 1rem; - padding-left: calc(var(--sidebar-offset) + var(--content-gap)); - padding-right: calc(var(--toc-offset) + var(--content-gap)); + padding-left: var(--content-gap); + padding-right: var(--content-gap); order: 1 !important; } diff --git a/apps/docs/components/docs-layout/sidebar-components.tsx b/apps/docs/components/docs-layout/sidebar-components.tsx index e49702f994..e5fb882fba 100644 --- a/apps/docs/components/docs-layout/sidebar-components.tsx +++ b/apps/docs/components/docs-layout/sidebar-components.tsx @@ -7,8 +7,23 @@ import Link from 'next/link' import { usePathname } from 'next/navigation' import { cn } from '@/lib/utils' +const LANG_PREFIXES = ['/en', '/es', '/fr', '/de', '/ja', '/zh'] + +function stripLangPrefix(path: string): string { + for (const prefix of LANG_PREFIXES) { + if (path === prefix) return '/' + if (path.startsWith(`${prefix}/`)) return path.slice(prefix.length) + } + return path +} + function isActive(url: string, pathname: string, nested = true): boolean { - return url === pathname || (nested && pathname.startsWith(`${url}/`)) + const normalizedPathname = stripLangPrefix(pathname) + const normalizedUrl = stripLangPrefix(url) + return ( + normalizedUrl === normalizedPathname || + (nested && normalizedPathname.startsWith(`${normalizedUrl}/`)) + ) } export function SidebarItem({ item }: { item: Item }) { @@ -16,97 +31,158 @@ export function SidebarItem({ item }: { item: Item }) { const active = isActive(item.url, pathname, false) return ( -
  • - - {item.name} - -
  • + + {item.name} + ) } export function SidebarFolder({ item, children }: { item: Folder; children: ReactNode }) { const pathname = usePathname() const hasActiveChild = checkHasActiveChild(item, pathname) + const hasChildren = item.children.length > 0 const [open, setOpen] = useState(hasActiveChild) useEffect(() => { setOpen(hasActiveChild) }, [hasActiveChild]) + const active = item.index ? isActive(item.index.url, pathname, false) : false + + if (item.index && !hasChildren) { + return ( + + {item.name} + + ) + } + return ( -
  • - {item.index ? ( -
    +
    +
    + {item.index ? ( {item.name} + ) : ( + )} + {hasChildren && ( + -
    - ) : ( -
    + {hasChildren && ( +
    - {item.name} - - + {/* Mobile: simple indent */} +
    {children}
    + {/* Desktop: styled with border */} +
      + {children} +
    +
    )} -
    -
      - {children} -
    -
    -
  • + ) } export function SidebarSeparator({ item }: { item: Separator }) { return ( -

    +

    {item.name}

    ) diff --git a/apps/docs/components/icons.tsx b/apps/docs/components/icons.tsx index d6dc0ae4d2..06fd3443e4 100644 --- a/apps/docs/components/icons.tsx +++ b/apps/docs/components/icons.tsx @@ -4089,3 +4089,43 @@ export function PolymarketIcon(props: SVGProps) { ) } + +export function GoogleGroupsIcon(props: SVGProps) { + return ( + + + + + + + + ) +} + +export function CursorIcon(props: SVGProps) { + return ( + + + + ) +} diff --git a/apps/docs/components/navbar/navbar.tsx b/apps/docs/components/navbar/navbar.tsx index 59c75baea0..bbddf45e61 100644 --- a/apps/docs/components/navbar/navbar.tsx +++ b/apps/docs/components/navbar/navbar.tsx @@ -20,7 +20,7 @@ export function Navbar() {
    diff --git a/apps/docs/components/ui/icon-mapping.ts b/apps/docs/components/ui/icon-mapping.ts index a5267e9eb8..fb56fb1dbf 100644 --- a/apps/docs/components/ui/icon-mapping.ts +++ b/apps/docs/components/ui/icon-mapping.ts @@ -15,6 +15,7 @@ import { CalendlyIcon, ClayIcon, ConfluenceIcon, + CursorIcon, DatadogIcon, DiscordIcon, DocumentIcon, @@ -32,6 +33,7 @@ import { GoogleDocsIcon, GoogleDriveIcon, GoogleFormsIcon, + GoogleGroupsIcon, GoogleIcon, GoogleSheetsIcon, GoogleSlidesIcon, @@ -195,6 +197,7 @@ export const blockTypeToIconMap: Record = { google_vault: GoogleVaultIcon, google_slides: GoogleSlidesIcon, google_sheets: GoogleSheetsIcon, + google_groups: GoogleGroupsIcon, google_forms: GoogleFormsIcon, google_drive: GoogleDriveIcon, google_docs: GoogleDocsIcon, @@ -212,6 +215,7 @@ export const blockTypeToIconMap: Record = { dropbox: DropboxIcon, discord: DiscordIcon, datadog: DatadogIcon, + cursor: CursorIcon, confluence: ConfluenceIcon, clay: ClayIcon, calendly: CalendlyIcon, diff --git a/apps/docs/content/docs/de/blocks/condition.mdx b/apps/docs/content/docs/de/blocks/condition.mdx index 176c026ffe..5d8687e81d 100644 --- a/apps/docs/content/docs/de/blocks/condition.mdx +++ b/apps/docs/content/docs/de/blocks/condition.mdx @@ -143,7 +143,7 @@ Function (Process) → Condition (account_type === 'enterprise') → Advanced or ## Bewährte Praktiken - **Bedingungen korrekt anordnen**: Platzieren Sie spezifischere Bedingungen vor allgemeinen, um sicherzustellen, dass spezifische Logik Vorrang vor Fallbacks hat -- **Eine Standardbedingung einfügen**: Fügen Sie eine Auffangbedingung (`true`) als letzte Bedingung hinzu, um nicht übereinstimmende Fälle zu behandeln und zu verhindern, dass die Workflow-Ausführung stecken bleibt -- **Ausdrücke einfach halten**: Verwenden Sie klare, unkomplizierte boolesche Ausdrücke für bessere Lesbarkeit und einfachere Fehlersuche +- **Verwenden Sie den Else-Zweig bei Bedarf**: Wenn keine Bedingungen übereinstimmen und der Else-Zweig nicht verbunden ist, endet der Workflow-Zweig ordnungsgemäß. Verbinden Sie den Else-Zweig, wenn Sie einen Fallback-Pfad für nicht übereinstimmende Fälle benötigen +- **Halten Sie Ausdrücke einfach**: Verwenden Sie klare, unkomplizierte boolesche Ausdrücke für bessere Lesbarkeit und einfachere Fehlersuche - **Dokumentieren Sie Ihre Bedingungen**: Fügen Sie Beschreibungen hinzu, um den Zweck jeder Bedingung für bessere Teamzusammenarbeit und Wartung zu erklären -- **Grenzfälle testen**: Überprüfen Sie, ob Bedingungen Grenzwerte korrekt behandeln, indem Sie mit Werten an den Grenzen Ihrer Bedingungsbereiche testen +- **Testen Sie Grenzfälle**: Überprüfen Sie, ob Bedingungen Grenzwerte korrekt behandeln, indem Sie mit Werten an den Grenzen Ihrer Bedingungsbereiche testen diff --git a/apps/docs/content/docs/de/introduction/index.mdx b/apps/docs/content/docs/de/introduction/index.mdx index 5cc6003211..277562dd39 100644 --- a/apps/docs/content/docs/de/introduction/index.mdx +++ b/apps/docs/content/docs/de/introduction/index.mdx @@ -72,7 +72,7 @@ Für benutzerdefinierte Integrationen nutzen Sie unsere [MCP (Model Context Prot
    -## KI-gesteuerter Copilot +## Copilot **Fragen stellen & Anleitung erhalten** Der Copilot beantwortet Fragen zu Sim, erklärt Ihre Workflows und gibt Verbesserungsvorschläge. Verwenden Sie das `@` Symbol, um auf Workflows, Blöcke, Dokumentation, Wissen und Protokolle für kontextbezogene Unterstützung zu verweisen. diff --git a/apps/docs/content/docs/de/knowledgebase/index.mdx b/apps/docs/content/docs/de/knowledgebase/index.mdx index ad1f61d802..b6ce546fbd 100644 --- a/apps/docs/content/docs/de/knowledgebase/index.mdx +++ b/apps/docs/content/docs/de/knowledgebase/index.mdx @@ -1,5 +1,7 @@ --- -title: Wissensdatenbank +title: Übersicht +description: Laden Sie Ihre Dokumente hoch, verarbeiten und durchsuchen Sie sie + mit intelligenter Vektorsuche und Chunking --- import { Video } from '@/components/ui/video' diff --git a/apps/docs/content/docs/de/self-hosting/docker.mdx b/apps/docs/content/docs/de/self-hosting/docker.mdx new file mode 100644 index 0000000000..6623e7aabd --- /dev/null +++ b/apps/docs/content/docs/de/self-hosting/docker.mdx @@ -0,0 +1,155 @@ +--- +title: Docker +description: Sim Studio mit Docker Compose bereitstellen +--- + +import { Tab, Tabs } from 'fumadocs-ui/components/tabs' +import { Callout } from 'fumadocs-ui/components/callout' + +## Schnellstart + +```bash +# Clone and start +git clone https://github.com/simstudioai/sim.git && cd sim +docker compose -f docker-compose.prod.yml up -d +``` + +Öffnen Sie [http://localhost:3000](http://localhost:3000) + +## Produktionseinrichtung + +### 1. Umgebung konfigurieren + +```bash +# Generate secrets +cat > .env << EOF +DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio +BETTER_AUTH_SECRET=$(openssl rand -hex 32) +ENCRYPTION_KEY=$(openssl rand -hex 32) +INTERNAL_API_SECRET=$(openssl rand -hex 32) +NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com +BETTER_AUTH_URL=https://sim.yourdomain.com +NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com +EOF +``` + +### 2. Dienste starten + +```bash +docker compose -f docker-compose.prod.yml up -d +``` + +### 3. SSL einrichten + + + +Caddy verwaltet SSL-Zertifikate automatisch. + +```bash +# Install Caddy +sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl +curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg +curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list +sudo apt update && sudo apt install caddy +``` + +Erstellen Sie `/etc/caddy/Caddyfile`: + +``` +sim.yourdomain.com { + reverse_proxy localhost:3000 + + handle /socket.io/* { + reverse_proxy localhost:3002 + } +} +``` + +```bash +sudo systemctl restart caddy +``` + + + + +```bash +# Install +sudo apt install nginx certbot python3-certbot-nginx -y + +# Create /etc/nginx/sites-available/sim +server { + listen 80; + server_name sim.yourdomain.com; + + location / { + proxy_pass http://127.0.0.1:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /socket.io/ { + proxy_pass http://127.0.0.1:3002; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } +} + +# Enable and get certificate +sudo ln -s /etc/nginx/sites-available/sim /etc/nginx/sites-enabled/ +sudo certbot --nginx -d sim.yourdomain.com +``` + + + + +## Ollama + +```bash +# With GPU +docker compose -f docker-compose.ollama.yml --profile gpu --profile setup up -d + +# CPU only +docker compose -f docker-compose.ollama.yml --profile cpu --profile setup up -d +``` + +Zusätzliche Modelle herunterladen: + +```bash +docker compose -f docker-compose.ollama.yml exec ollama ollama pull llama3.2 +``` + +### Externes Ollama + +Wenn Ollama auf Ihrem Host-Rechner läuft (nicht in Docker): + +```bash +# macOS/Windows +OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d + +# Linux - use your host IP +OLLAMA_URL=http://192.168.1.100:11434 docker compose -f docker-compose.prod.yml up -d +``` + + + Innerhalb von Docker bezieht sich `localhost` auf den Container, nicht auf Ihren Host. Verwenden Sie `host.docker.internal` oder die IP-Adresse Ihres Hosts. + + +## Befehle + +```bash +# View logs +docker compose -f docker-compose.prod.yml logs -f simstudio + +# Stop +docker compose -f docker-compose.prod.yml down + +# Update +docker compose -f docker-compose.prod.yml pull && docker compose -f docker-compose.prod.yml up -d + +# Backup database +docker compose -f docker-compose.prod.yml exec db pg_dump -U postgres simstudio > backup.sql +``` diff --git a/apps/docs/content/docs/de/self-hosting/environment-variables.mdx b/apps/docs/content/docs/de/self-hosting/environment-variables.mdx new file mode 100644 index 0000000000..4a1f4d34df --- /dev/null +++ b/apps/docs/content/docs/de/self-hosting/environment-variables.mdx @@ -0,0 +1,87 @@ +--- +title: Umgebungsvariablen +description: Konfigurationsreferenz für Sim Studio +--- + +import { Callout } from 'fumadocs-ui/components/callout' + +## Erforderlich + +| Variable | Beschreibung | +|----------|-------------| +| `DATABASE_URL` | PostgreSQL-Verbindungszeichenfolge | +| `BETTER_AUTH_SECRET` | Auth-Secret (32 Hex-Zeichen): `openssl rand -hex 32` | +| `BETTER_AUTH_URL` | Ihre App-URL | +| `ENCRYPTION_KEY` | Verschlüsselungsschlüssel (32 Hex-Zeichen): `openssl rand -hex 32` | +| `INTERNAL_API_SECRET` | Internes API-Secret (32 Hex-Zeichen): `openssl rand -hex 32` | +| `NEXT_PUBLIC_APP_URL` | Öffentliche App-URL | +| `NEXT_PUBLIC_SOCKET_URL` | WebSocket-URL (Standard: `http://localhost:3002`) | + +## KI-Anbieter + +| Variable | Anbieter | +|----------|----------| +| `OPENAI_API_KEY` | OpenAI | +| `ANTHROPIC_API_KEY_1` | Anthropic Claude | +| `GEMINI_API_KEY_1` | Google Gemini | +| `MISTRAL_API_KEY` | Mistral | +| `OLLAMA_URL` | Ollama (Standard: `http://localhost:11434`) | + + + Für Lastausgleich fügen Sie mehrere Schlüssel mit den Suffixen `_1`, `_2`, `_3` hinzu (z.B. `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`). Funktioniert mit OpenAI, Anthropic und Gemini. + + + + In Docker verwenden Sie `OLLAMA_URL=http://host.docker.internal:11434` für Ollama auf dem Host-System. + + +### Azure OpenAI + +| Variable | Beschreibung | +|----------|-------------| +| `AZURE_OPENAI_API_KEY` | Azure OpenAI API-Schlüssel | +| `AZURE_OPENAI_ENDPOINT` | Azure OpenAI Endpoint-URL | +| `AZURE_OPENAI_API_VERSION` | API-Version (z.B. `2024-02-15-preview`) | + +### vLLM (Selbst-gehostet) + +| Variable | Beschreibung | +|----------|-------------| +| `VLLM_BASE_URL` | vLLM-Server-URL (z.B. `http://localhost:8000/v1`) | +| `VLLM_API_KEY` | Optionaler Bearer-Token für vLLM | + +## OAuth-Anbieter + +| Variable | Beschreibung | +|----------|-------------| +| `GOOGLE_CLIENT_ID` | Google OAuth Client-ID | +| `GOOGLE_CLIENT_SECRET` | Google OAuth Client-Secret | +| `GITHUB_CLIENT_ID` | GitHub OAuth Client-ID | +| `GITHUB_CLIENT_SECRET` | GitHub OAuth Client-Secret | + +## Optional + +| Variable | Beschreibung | +|----------|-------------| +| `API_ENCRYPTION_KEY` | Verschlüsselt gespeicherte API-Schlüssel (32 Hex-Zeichen): `openssl rand -hex 32` | +| `COPILOT_API_KEY` | API-Schlüssel für Copilot-Funktionen | +| `ADMIN_API_KEY` | Admin-API-Schlüssel für GitOps-Operationen | +| `RESEND_API_KEY` | E-Mail-Dienst für Benachrichtigungen | +| `ALLOWED_LOGIN_DOMAINS` | Registrierungen auf Domains beschränken (durch Kommas getrennt) | +| `ALLOWED_LOGIN_EMAILS` | Registrierungen auf bestimmte E-Mails beschränken (durch Kommas getrennt) | +| `DISABLE_REGISTRATION` | Auf `true` setzen, um neue Benutzerregistrierungen zu deaktivieren | + +## Beispiel .env + +```bash +DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio +BETTER_AUTH_SECRET= +BETTER_AUTH_URL=https://sim.yourdomain.com +ENCRYPTION_KEY= +INTERNAL_API_SECRET= +NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com +NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com +OPENAI_API_KEY=sk-... +``` + +Siehe `apps/sim/.env.example` für alle Optionen. diff --git a/apps/docs/content/docs/de/self-hosting/index.mdx b/apps/docs/content/docs/de/self-hosting/index.mdx new file mode 100644 index 0000000000..e615ea09b7 --- /dev/null +++ b/apps/docs/content/docs/de/self-hosting/index.mdx @@ -0,0 +1,50 @@ +--- +title: Self-Hosting +description: Stellen Sie Sim Studio auf Ihrer eigenen Infrastruktur bereit +--- + +import { Card, Cards } from 'fumadocs-ui/components/card' +import { Callout } from 'fumadocs-ui/components/callout' + +Stellen Sie Sim Studio auf Ihrer eigenen Infrastruktur mit Docker oder Kubernetes bereit. + +## Anforderungen + +| Ressource | Minimum | Empfohlen | +|----------|---------|-------------| +| CPU | 2 Kerne | 4+ Kerne | +| RAM | 12 GB | 16+ GB | +| Speicher | 20 GB SSD | 50+ GB SSD | +| Docker | 20.10+ | Neueste Version | + +## Schnellstart + +```bash +git clone https://github.com/simstudioai/sim.git && cd sim +docker compose -f docker-compose.prod.yml up -d +``` + +Öffnen Sie [http://localhost:3000](http://localhost:3000) + +## Bereitstellungsoptionen + + + + Bereitstellung mit Docker Compose auf jedem Server + + + Bereitstellung mit Helm auf Kubernetes-Clustern + + + Anleitungen für Railway, DigitalOcean, AWS, Azure, GCP + + + +## Architektur + +| Komponente | Port | Beschreibung | +|-----------|------|-------------| +| simstudio | 3000 | Hauptanwendung | +| realtime | 3002 | WebSocket-Server | +| db | 5432 | PostgreSQL mit pgvector | +| migrations | - | Datenbank-Migrationen (werden einmal ausgeführt) | diff --git a/apps/docs/content/docs/de/self-hosting/kubernetes.mdx b/apps/docs/content/docs/de/self-hosting/kubernetes.mdx new file mode 100644 index 0000000000..3cdfd712f1 --- /dev/null +++ b/apps/docs/content/docs/de/self-hosting/kubernetes.mdx @@ -0,0 +1,133 @@ +--- +title: Kubernetes +description: Sim Studio mit Helm bereitstellen +--- + +import { Tab, Tabs } from 'fumadocs-ui/components/tabs' +import { Callout } from 'fumadocs-ui/components/callout' + +## Voraussetzungen + +- Kubernetes 1.19+ +- Helm 3.0+ +- PV-Provisioner-Unterstützung + +## Installation + +```bash +# Clone repo +git clone https://github.com/simstudioai/sim.git && cd sim + +# Generate secrets +BETTER_AUTH_SECRET=$(openssl rand -hex 32) +ENCRYPTION_KEY=$(openssl rand -hex 32) +INTERNAL_API_SECRET=$(openssl rand -hex 32) + +# Install +helm install sim ./helm/sim \ + --set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \ + --set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \ + --set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \ + --namespace simstudio --create-namespace +``` + +## Cloud-spezifische Werte + + + + +```bash +helm install sim ./helm/sim \ + --values ./helm/sim/examples/values-aws.yaml \ + --set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \ + --set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \ + --set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \ + --set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \ + --namespace simstudio --create-namespace +``` + + + + +```bash +helm install sim ./helm/sim \ + --values ./helm/sim/examples/values-azure.yaml \ + --set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \ + --set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \ + --set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \ + --set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \ + --namespace simstudio --create-namespace +``` + + + + +```bash +helm install sim ./helm/sim \ + --values ./helm/sim/examples/values-gcp.yaml \ + --set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \ + --set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \ + --set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \ + --set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \ + --namespace simstudio --create-namespace +``` + + + + +## Schlüsselkonfiguration + +```yaml +# Custom values.yaml +app: + replicaCount: 2 + env: + NEXT_PUBLIC_APP_URL: "https://sim.yourdomain.com" + OPENAI_API_KEY: "sk-..." + +postgresql: + persistence: + size: 50Gi + +ingress: + enabled: true + className: nginx + tls: + enabled: true + app: + host: sim.yourdomain.com +``` + +Siehe `helm/sim/values.yaml` für alle Optionen. + +## Externe Datenbank + +```yaml +postgresql: + enabled: false + +externalDatabase: + enabled: true + host: "your-db-host" + port: 5432 + username: "postgres" + password: "your-password" + database: "simstudio" + sslMode: "require" +``` + +## Befehle + +```bash +# Port forward for local access +kubectl port-forward deployment/sim-sim-app 3000:3000 -n simstudio + +# View logs +kubectl logs -l app.kubernetes.io/component=app -n simstudio --tail=100 + +# Upgrade +helm upgrade sim ./helm/sim --namespace simstudio + +# Uninstall +helm uninstall sim --namespace simstudio +``` diff --git a/apps/docs/content/docs/de/self-hosting/platforms.mdx b/apps/docs/content/docs/de/self-hosting/platforms.mdx new file mode 100644 index 0000000000..ef34af4def --- /dev/null +++ b/apps/docs/content/docs/de/self-hosting/platforms.mdx @@ -0,0 +1,124 @@ +--- +title: Cloud-Plattformen +description: Sim Studio auf Cloud-Plattformen bereitstellen +--- + +import { Tab, Tabs } from 'fumadocs-ui/components/tabs' +import { Callout } from 'fumadocs-ui/components/callout' + +## Railway + +Bereitstellung mit einem Klick und automatischer PostgreSQL-Bereitstellung. + +[ + +![Auf Railway bereitstellen](https://railway.app/button.svg) + +](https://railway.com/new/template/sim-studio) + +Nach der Bereitstellung fügen Sie Umgebungsvariablen im Railway-Dashboard hinzu: +- `BETTER_AUTH_SECRET`, `ENCRYPTION_KEY`, `INTERNAL_API_SECRET` (automatisch generiert) +- `OPENAI_API_KEY` oder andere KI-Anbieter-Schlüssel +- Benutzerdefinierte Domain in Einstellungen → Netzwerk + +## VPS-Bereitstellung + +Für DigitalOcean, AWS EC2, Azure VMs oder jeden Linux-Server: + + + +**Empfohlen:** 16 GB RAM Droplet, Ubuntu 24.04 + +```bash +# Create Droplet via console, then SSH in +ssh root@your-droplet-ip +``` + + + +**Empfohlen:** t3.xlarge (16 GB RAM), Ubuntu 24.04 + +```bash +ssh -i your-key.pem ubuntu@your-ec2-ip +``` + + + +**Empfohlen:** Standard_D4s_v3 (16 GB RAM), Ubuntu 24.04 + +```bash +ssh azureuser@your-vm-ip +``` + + + + +### Docker installieren + +```bash +# Install Docker (official method) +curl -fsSL https://get.docker.com | sudo sh +sudo usermod -aG docker $USER + +# Logout and reconnect, then verify +docker --version +``` + +### Sim Studio bereitstellen + +```bash +git clone https://github.com/simstudioai/sim.git && cd sim + +# Create .env with secrets +cat > .env << EOF +DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio +BETTER_AUTH_SECRET=$(openssl rand -hex 32) +ENCRYPTION_KEY=$(openssl rand -hex 32) +INTERNAL_API_SECRET=$(openssl rand -hex 32) +NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com +BETTER_AUTH_URL=https://sim.yourdomain.com +NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com +EOF + +# Start +docker compose -f docker-compose.prod.yml up -d +``` + +### SSL mit Caddy + +```bash +# Install Caddy +sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl +curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg +curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list +sudo apt update && sudo apt install caddy + +# Configure (replace domain) +echo 'sim.yourdomain.com { + reverse_proxy localhost:3000 + handle /socket.io/* { + reverse_proxy localhost:3002 + } +}' | sudo tee /etc/caddy/Caddyfile + +sudo systemctl restart caddy +``` + +Richten Sie den DNS A-Eintrag Ihrer Domain auf die IP-Adresse Ihres Servers. + +## Kubernetes (EKS, AKS, GKE) + +Siehe den [Kubernetes-Leitfaden](/self-hosting/kubernetes) für Helm-Deployment auf verwaltetem Kubernetes. + +## Verwaltete Datenbank (Optional) + +Für den Produktivbetrieb sollten Sie einen verwalteten PostgreSQL-Dienst verwenden: + +- **AWS RDS** / **Azure Database** / **Cloud SQL** - Aktivieren Sie die pgvector-Erweiterung +- **Supabase** / **Neon** - pgvector enthalten + +Setzen Sie `DATABASE_URL` in Ihrer Umgebung: + +```bash +DATABASE_URL="postgresql://user:pass@host:5432/db?sslmode=require" +``` diff --git a/apps/docs/content/docs/de/self-hosting/troubleshooting.mdx b/apps/docs/content/docs/de/self-hosting/troubleshooting.mdx new file mode 100644 index 0000000000..97b4839984 --- /dev/null +++ b/apps/docs/content/docs/de/self-hosting/troubleshooting.mdx @@ -0,0 +1,113 @@ +--- +title: Fehlerbehebung +description: Häufige Probleme und Lösungen +--- + +## Datenbankverbindung fehlgeschlagen + +```bash +# Check database is running +docker compose ps db + +# Test connection +docker compose exec db psql -U postgres -c "SELECT 1" +``` + +Überprüfen Sie das `DATABASE_URL` Format: `postgresql://user:pass@host:5432/database` + +## Ollama-Modelle werden nicht angezeigt + +In Docker ist `localhost` = der Container, nicht Ihr Host-Rechner. + +```bash +# For host-machine Ollama, use: +OLLAMA_URL=http://host.docker.internal:11434 # macOS/Windows +OLLAMA_URL=http://192.168.1.x:11434 # Linux (use actual IP) +``` + +## WebSocket/Echtzeit funktioniert nicht + +1. Prüfen Sie, ob `NEXT_PUBLIC_SOCKET_URL` mit Ihrer Domain übereinstimmt +2. Überprüfen Sie, ob der Echtzeit-Dienst läuft: `docker compose ps realtime` +3. Stellen Sie sicher, dass der Reverse-Proxy WebSocket-Upgrades weiterleitet (siehe [Docker-Anleitung](/self-hosting/docker)) + +## 502 Bad Gateway + +```bash +# Check app is running +docker compose ps simstudio +docker compose logs simstudio + +# Common causes: out of memory, database not ready +``` + +## Migrationsfehler + +```bash +# View migration logs +docker compose logs migrations + +# Run manually +docker compose exec simstudio bun run db:migrate +``` + +## pgvector nicht gefunden + +Verwenden Sie das richtige PostgreSQL-Image: + +```yaml +image: pgvector/pgvector:pg17 # NOT postgres:17 +``` + +## Zertifikatsfehler (CERT_HAS_EXPIRED) + +Wenn Sie SSL-Zertifikatsfehler beim Aufrufen externer APIs sehen: + +```bash +# Update CA certificates in container +docker compose exec simstudio apt-get update && apt-get install -y ca-certificates + +# Or set in environment (not recommended for production) +NODE_TLS_REJECT_UNAUTHORIZED=0 +``` + +## Leere Seite nach dem Login + +1. Überprüfen Sie die Browser-Konsole auf Fehler +2. Stellen Sie sicher, dass `NEXT_PUBLIC_APP_URL` mit Ihrer tatsächlichen Domain übereinstimmt +3. Löschen Sie Browser-Cookies und lokalen Speicher +4. Prüfen Sie, ob alle Dienste laufen: `docker compose ps` + +## Windows-spezifische Probleme + +**Turbopack-Fehler unter Windows:** + +```bash +# Use WSL2 for better compatibility +wsl --install + +# Or disable Turbopack in package.json +# Change "next dev --turbopack" to "next dev" +``` + +**Zeilenende-Probleme:** + +```bash +# Configure git to use LF +git config --global core.autocrlf input +``` + +## Logs anzeigen + +```bash +# All services +docker compose logs -f + +# Specific service +docker compose logs -f simstudio +``` + +## Hilfe erhalten + +- [GitHub Issues](https://github.com/simstudioai/sim/issues) +- [Discord](https://discord.gg/Hr4UWYEcTT) diff --git a/apps/docs/content/docs/de/tools/cursor.mdx b/apps/docs/content/docs/de/tools/cursor.mdx new file mode 100644 index 0000000000..29e50be6af --- /dev/null +++ b/apps/docs/content/docs/de/tools/cursor.mdx @@ -0,0 +1,182 @@ +--- +title: Cursor +description: Starten und verwalten Sie Cursor Cloud-Agenten zur Arbeit an + GitHub-Repositories +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Cursor](https://www.cursor.so/) ist eine KI-IDE und cloudbasierte Plattform, mit der Sie leistungsstarke KI-Agenten starten und verwalten können, die direkt mit Ihren GitHub-Repositories arbeiten können. Cursor-Agenten können Entwicklungsaufgaben automatisieren, die Produktivität Ihres Teams steigern und mit Ihnen zusammenarbeiten, indem sie Codeänderungen vornehmen, auf natürlichsprachliche Anweisungen reagieren und einen Gesprächsverlauf über ihre Aktivitäten führen. + +Mit Cursor können Sie: + +- **Cloud-Agenten für Codebasen starten**: Erstellen Sie sofort neue KI-Agenten, die in der Cloud an Ihren Repositories arbeiten +- **Codierungsaufgaben mit natürlicher Sprache delegieren**: Leiten Sie Agenten mit schriftlichen Anweisungen, Änderungen und Klarstellungen an +- **Fortschritt und Ergebnisse überwachen**: Rufen Sie den Agentenstatus ab, sehen Sie detaillierte Ergebnisse und prüfen Sie aktuelle oder abgeschlossene Aufgaben +- **Zugriff auf den vollständigen Gesprächsverlauf**: Überprüfen Sie alle Eingabeaufforderungen und KI-Antworten für Transparenz und Nachvollziehbarkeit +- **Steuerung und Verwaltung des Agenten-Lebenszyklus**: Listen Sie aktive Agenten auf, beenden Sie Agenten und verwalten Sie API-basierte Agentenstarts und Nachverfolgungen + +In Sim ermöglicht die Cursor-Integration Ihren Agenten und Workflows, programmatisch mit Cursor-Cloud-Agenten zu interagieren. Das bedeutet, Sie können Sim verwenden, um: + +- Alle Cloud-Agenten auflisten und ihren aktuellen Status durchsuchen (`cursor_list_agents`) +- Aktuellen Status und Ausgaben für jeden Agenten abrufen (`cursor_get_agent`) +- Den vollständigen Gesprächsverlauf für jeden Codierungsagenten anzeigen (`cursor_get_conversation`) +- Nachfolgende Anweisungen oder neue Eingabeaufforderungen zu einem laufenden Agenten hinzufügen +- Agenten nach Bedarf verwalten und beenden + +Diese Integration hilft Ihnen, die flexible Intelligenz von Sim-Agenten mit den leistungsstarken Automatisierungsfunktionen von Cursor zu kombinieren, wodurch es möglich wird, KI-gesteuerte Entwicklung über Ihre Projekte hinweg zu skalieren. +{/* MANUAL-CONTENT-END */} + +## Gebrauchsanweisung + +Interagieren Sie mit der Cursor Cloud Agents API, um KI-Agenten zu starten, die an Ihren GitHub-Repositories arbeiten können. Unterstützt das Starten von Agenten, das Hinzufügen von Folgeanweisungen, die Statusprüfung, die Anzeige von Konversationen und die Verwaltung des Agenten-Lebenszyklus. + +## Tools + +### `cursor_list_agents` + +Listet alle Cloud-Agenten für den authentifizierten Benutzer mit optionaler Paginierung auf. + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Ja | Cursor API-Schlüssel | +| `limit` | number | Nein | Anzahl der zurückzugebenden Agenten \(Standard: 20, max: 100\) | +| `cursor` | string | Nein | Paginierungscursor aus der vorherigen Antwort | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `content` | string | Menschenlesbare Liste der Agenten | +| `metadata` | object | Metadaten der Agentenliste | + +### `cursor_get_agent` + +Ruft den aktuellen Status und die Ergebnisse eines Cloud-Agenten ab. + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Ja | Cursor API-Schlüssel | +| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `content` | string | Menschenlesbare Agentendetails | +| `metadata` | object | Agenten-Metadaten | + +### `cursor_get_conversation` + +Ruft den Konversationsverlauf eines Cloud-Agenten ab, einschließlich aller Benutzeraufforderungen und Assistentenantworten. + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Ja | Cursor API-Schlüssel | +| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) | + +#### Output + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `content` | string | Menschenlesbarer Konversationsverlauf | +| `metadata` | object | Konversations-Metadaten | + +### `cursor_launch_agent` + +Starten Sie einen neuen Cloud-Agenten, um an einem GitHub-Repository mit den angegebenen Anweisungen zu arbeiten. + +#### Input + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Ja | Cursor API-Schlüssel | +| `repository` | string | Ja | GitHub-Repository-URL \(z.B. https://github.com/your-org/your-repo\) | +| `ref` | string | Nein | Branch, Tag oder Commit, von dem aus gearbeitet werden soll \(standardmäßig der Hauptbranch\) | +| `promptText` | string | Ja | Der Anweisungstext für den Agenten | +| `promptImages` | string | Nein | JSON-Array von Bildobjekten mit Base64-Daten und Abmessungen | +| `model` | string | Nein | Zu verwendendes Modell \(leer lassen für automatische Auswahl\) | +| `branchName` | string | Nein | Benutzerdefinierter Branch-Name für den Agenten | +| `autoCreatePr` | boolean | Nein | Automatisches Erstellen eines PR, wenn der Agent fertig ist | +| `openAsCursorGithubApp` | boolean | Nein | Öffnen des PR als Cursor GitHub App | +| `skipReviewerRequest` | boolean | Nein | Überspringen der Anfrage nach Prüfern für den PR | + +#### Output + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `content` | string | Erfolgsmeldung mit Agenten-Details | +| `metadata` | object | Metadaten zum Startergebnis | + +### `cursor_add_followup` + +Fügen Sie einem bestehenden Cloud-Agenten eine Folgeanweisung hinzu. + +#### Input + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Ja | Cursor API-Schlüssel | +| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) | +| `followupPromptText` | string | Ja | Der Folgeanweisungstext für den Agenten | +| `promptImages` | string | Nein | JSON-Array von Bildobjekten mit Base64-Daten und Abmessungen \(max. 5\) | + +#### Output + +| Parameter | Type | Beschreibung | +| --------- | ---- | ----------- | +| `content` | string | Erfolgsmeldung | +| `metadata` | object | Ergebnis-Metadaten | + +### `cursor_stop_agent` + +Stoppt einen laufenden Cloud-Agenten. Dies pausiert den Agenten, ohne ihn zu löschen. + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Ja | Cursor API-Schlüssel | +| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `content` | string | Erfolgsmeldung | +| `metadata` | object | Ergebnis-Metadaten | + +### `cursor_delete_agent` + +Löscht einen Cloud-Agenten dauerhaft. Diese Aktion kann nicht rückgängig gemacht werden. + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Ja | Cursor API-Schlüssel | +| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `content` | string | Erfolgsmeldung | +| `metadata` | object | Ergebnis-Metadaten | + +## Hinweise + +- Kategorie: `tools` +- Typ: `cursor` diff --git a/apps/docs/content/docs/de/tools/google_groups.mdx b/apps/docs/content/docs/de/tools/google_groups.mdx new file mode 100644 index 0000000000..f9bdcb67ca --- /dev/null +++ b/apps/docs/content/docs/de/tools/google_groups.mdx @@ -0,0 +1,217 @@ +--- +title: Google Groups +description: Google Workspace-Gruppen und deren Mitglieder verwalten +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +## Gebrauchsanweisung + +Verbinden Sie sich mit Google Workspace, um Gruppen und deren Mitglieder mit der Admin SDK Directory API zu erstellen, zu aktualisieren und zu verwalten. + +## Tools + +### `google_groups_list_groups` + +Alle Gruppen in einer Google Workspace-Domain auflisten + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `customer` | string | Nein | Kunden-ID oder "my_customer" für die Domain des authentifizierten Benutzers | +| `domain` | string | Nein | Domainname zum Filtern von Gruppen | +| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Ergebnisse \(1-200\) | +| `pageToken` | string | Nein | Token für Paginierung | +| `query` | string | Nein | Suchabfrage zum Filtern von Gruppen \(z.B. "email:admin*"\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +### `google_groups_get_group` + +Details einer bestimmten Google-Gruppe nach E-Mail oder Gruppen-ID abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +### `google_groups_create_group` + +Eine neue Google-Gruppe in der Domain erstellen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `email` | string | Ja | E-Mail-Adresse für die neue Gruppe (z.B. team@yourdomain.com) | +| `name` | string | Ja | Anzeigename für die Gruppe | +| `description` | string | Nein | Beschreibung der Gruppe | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +### `google_groups_update_group` + +Eine bestehende Google-Gruppe aktualisieren + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID | +| `name` | string | Nein | Neuer Anzeigename für die Gruppe | +| `description` | string | Nein | Neue Beschreibung für die Gruppe | +| `email` | string | Nein | Neue E-Mail-Adresse für die Gruppe | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +### `google_groups_delete_group` + +Eine Google-Gruppe löschen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID zum Löschen | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +### `google_groups_list_members` + +Alle Mitglieder einer Google-Gruppe auflisten + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID | +| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Ergebnisse \(1-200\) | +| `pageToken` | string | Nein | Token für Seitenumbruch | +| `roles` | string | Nein | Nach Rollen filtern \(durch Komma getrennt: OWNER, MANAGER, MEMBER\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +### `google_groups_get_member` + +Details eines bestimmten Mitglieds in einer Google-Gruppe abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID | +| `memberKey` | string | Ja | E-Mail-Adresse des Mitglieds oder eindeutige Mitglieds-ID | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +### `google_groups_add_member` + +Ein neues Mitglied zu einer Google-Gruppe hinzufügen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID | +| `email` | string | Ja | E-Mail-Adresse des hinzuzufügenden Mitglieds | +| `role` | string | Nein | Rolle für das Mitglied \(MEMBER, MANAGER oder OWNER\). Standardmäßig MEMBER. | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +### `google_groups_remove_member` + +Ein Mitglied aus einer Google-Gruppe entfernen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID | +| `memberKey` | string | Ja | E-Mail-Adresse oder eindeutige ID des zu entfernenden Mitglieds | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +### `google_groups_update_member` + +Ein Mitglied aktualisieren + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID | +| `memberKey` | string | Ja | E-Mail-Adresse des Mitglieds oder eindeutige Mitglieds-ID | +| `role` | string | Ja | Neue Rolle für das Mitglied \(MEMBER, MANAGER oder OWNER\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +### `google_groups_has_member` + +Prüfen, ob ein Benutzer Mitglied einer Google-Gruppe ist + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID | +| `memberKey` | string | Ja | Zu prüfende E-Mail-Adresse des Mitglieds oder eindeutige Mitglieds-ID | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `output` | json | Google Groups API-Antwortdaten | + +## Hinweise + +- Kategorie: `tools` +- Typ: `google_groups` diff --git a/apps/docs/content/docs/de/tools/salesforce.mdx b/apps/docs/content/docs/de/tools/salesforce.mdx index 64ec7bbce6..f2a5f09eee 100644 --- a/apps/docs/content/docs/de/tools/salesforce.mdx +++ b/apps/docs/content/docs/de/tools/salesforce.mdx @@ -135,283 +135,684 @@ Löschen eines Kontos aus Salesforce CRM ### `salesforce_get_contacts` +Kontakt(e) aus Salesforce abrufen - einzelner Kontakt, wenn ID angegeben, oder Liste, wenn nicht + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `contactId` | string | Nein | Kontakt-ID \(wenn angegeben, wird ein einzelner Kontakt zurückgegeben\) | +| `limit` | string | Nein | Anzahl der Ergebnisse \(Standard: 100, max: 2000\). Nur für Listenabfrage. | +| `fields` | string | Nein | Kommagetrennte Felder \(z.B. "Id,FirstName,LastName,Email,Phone"\) | +| `orderBy` | string | Nein | Sortierfeld \(z.B. "LastName ASC"\). Nur für Listenabfrage. | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | | `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `output` | object | Kontaktdaten | ### `salesforce_create_contact` +Einen neuen Kontakt im Salesforce CRM erstellen + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `lastName` | string | Ja | Nachname \(erforderlich\) | +| `firstName` | string | Nein | Vorname | +| `email` | string | Nein | E-Mail-Adresse | +| `phone` | string | Nein | Telefonnummer | +| `accountId` | string | Nein | Konto-ID, mit der der Kontakt verknüpft werden soll | +| `title` | string | Nein | Keine Beschreibung | +| `department` | string | Nein | Abteilung | +| `mailingStreet` | string | Nein | Postanschrift \(Straße\) | +| `mailingCity` | string | Nein | Postanschrift \(Stadt\) | +| `mailingState` | string | Nein | Postanschrift \(Bundesland\) | +| `mailingPostalCode` | string | Nein | Postanschrift \(Postleitzahl\) | +| `mailingCountry` | string | Nein | Postanschrift \(Land\) | +| `description` | string | Nein | Kontaktbeschreibung | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | | `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `output` | object | Daten des erstellten Kontakts | ### `salesforce_update_contact` +Aktualisieren eines bestehenden Kontakts in Salesforce CRM + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `contactId` | string | Ja | Zu aktualisierende Kontakt-ID \(erforderlich\) | +| `lastName` | string | Nein | Nachname | +| `firstName` | string | Nein | Vorname | +| `email` | string | Nein | E-Mail-Adresse | +| `phone` | string | Nein | Telefonnummer | +| `accountId` | string | Nein | Zu verknüpfende Konto-ID | +| `title` | string | Nein | Keine Beschreibung | +| `department` | string | Nein | Abteilung | +| `mailingStreet` | string | Nein | Postanschrift (Straße) | +| `mailingCity` | string | Nein | Postanschrift (Stadt) | +| `mailingState` | string | Nein | Postanschrift (Bundesland) | +| `mailingPostalCode` | string | Nein | Postanschrift (Postleitzahl) | +| `mailingCountry` | string | Nein | Postanschrift (Land) | +| `description` | string | Nein | Beschreibung | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | | `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `output` | object | Daten des aktualisierten Kontakts | ### `salesforce_delete_contact` +Löschen eines Kontakts aus Salesforce CRM + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `contactId` | string | Ja | Zu löschende Kontakt-ID \(erforderlich\) | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | | `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `output` | object | Daten des gelöschten Kontakts | ### `salesforce_get_leads` +Lead(s) aus Salesforce abrufen + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `leadId` | string | Nein | Lead-ID \(optional\) | +| `limit` | string | Nein | Maximale Ergebnisse \(Standard: 100\) | +| `fields` | string | Nein | Kommagetrennte Felder | +| `orderBy` | string | Nein | Sortierfeld | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Lead-Daten | ### `salesforce_create_lead` +Einen neuen Lead erstellen + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `lastName` | string | Ja | Nachname \(erforderlich\) | +| `company` | string | Ja | Unternehmen \(erforderlich\) | +| `firstName` | string | Nein | Vorname | +| `email` | string | Nein | Keine Beschreibung | +| `phone` | string | Nein | Keine Beschreibung | +| `status` | string | Nein | Lead-Status | +| `leadSource` | string | Nein | Lead-Quelle | +| `title` | string | Nein | Keine Beschreibung | +| `description` | string | Nein | Beschreibung | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Erstellter Lead | ### `salesforce_update_lead` +Aktualisieren eines vorhandenen Leads + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `leadId` | string | Ja | Lead-ID (erforderlich) | +| `lastName` | string | Nein | Nachname | +| `company` | string | Nein | Keine Beschreibung | +| `firstName` | string | Nein | Vorname | +| `email` | string | Nein | Keine Beschreibung | +| `phone` | string | Nein | Keine Beschreibung | +| `status` | string | Nein | Lead-Status | +| `leadSource` | string | Nein | Lead-Quelle | +| `title` | string | Nein | Keine Beschreibung | +| `description` | string | Nein | Beschreibung | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Aktualisierter Lead | ### `salesforce_delete_lead` +Löschen eines Leads + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `leadId` | string | Ja | Lead-ID (erforderlich) | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Gelöschter Lead | ### `salesforce_get_opportunities` +Verkaufschance(n) aus Salesforce abrufen + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `opportunityId` | string | Nein | Verkaufschancen-ID \(optional\) | +| `limit` | string | Nein | Maximale Ergebnisse \(Standard: 100\) | +| `fields` | string | Nein | Kommagetrennte Felder | +| `orderBy` | string | Nein | Sortierfeld | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Verkaufschancendaten | ### `salesforce_create_opportunity` +Eine neue Verkaufschance erstellen + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `name` | string | Ja | Name der Verkaufschance \(erforderlich\) | +| `stageName` | string | Ja | Phasenname \(erforderlich\) | +| `closeDate` | string | Ja | Abschlussdatum JJJJ-MM-TT \(erforderlich\) | +| `accountId` | string | Nein | Konto-ID | +| `amount` | string | Nein | Betrag \(Zahl\) | +| `probability` | string | Nein | Wahrscheinlichkeit \(0-100\) | +| `description` | string | Nein | Beschreibung | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Erstellte Verkaufschance | ### `salesforce_update_opportunity` +Aktualisieren einer bestehenden Verkaufschance + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `opportunityId` | string | Ja | Verkaufschancen-ID (erforderlich) | +| `name` | string | Nein | Name der Verkaufschance | +| `stageName` | string | Nein | Phasenname | +| `closeDate` | string | Nein | Abschlussdatum JJJJ-MM-TT | +| `accountId` | string | Nein | Konto-ID | +| `amount` | string | Nein | Keine Beschreibung | +| `probability` | string | Nein | Wahrscheinlichkeit (0-100) | +| `description` | string | Nein | Beschreibung | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Aktualisierte Verkaufschance | ### `salesforce_delete_opportunity` +Löschen einer Verkaufschance + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `opportunityId` | string | Ja | Verkaufschancen-ID (erforderlich) | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Gelöschte Verkaufschance | ### `salesforce_get_cases` +Fall/Fälle aus Salesforce abrufen + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `caseId` | string | Nein | Fall-ID \(optional\) | +| `limit` | string | Nein | Maximale Ergebnisse \(Standard: 100\) | +| `fields` | string | Nein | Kommagetrennte Felder | +| `orderBy` | string | Nein | Sortierfeld | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Falldaten | ### `salesforce_create_case` +Einen neuen Fall erstellen + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `subject` | string | Ja | Fallbetreff \(erforderlich\) | +| `status` | string | Nein | Status \(z.B. Neu, In Bearbeitung, Eskaliert\) | +| `priority` | string | Nein | Priorität \(z.B. Niedrig, Mittel, Hoch\) | +| `origin` | string | Nein | Ursprung \(z.B. Telefon, E-Mail, Web\) | +| `contactId` | string | Nein | Kontakt-ID | +| `accountId` | string | Nein | Konto-ID | +| `description` | string | Nein | Beschreibung | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Erstellter Fall | ### `salesforce_update_case` +Aktualisieren eines vorhandenen Falls + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `caseId` | string | Ja | Fall-ID \(erforderlich\) | +| `subject` | string | Nein | Fallbetreff | +| `status` | string | Nein | Status | +| `priority` | string | Nein | Priorität | +| `description` | string | Nein | Beschreibung | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Aktualisierter Fall | ### `salesforce_delete_case` +Löschen eines Falls + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `caseId` | string | Ja | Fall-ID \(erforderlich\) | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Gelöschter Fall | ### `salesforce_get_tasks` +Aufgabe(n) von Salesforce abrufen + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `taskId` | string | Nein | Aufgaben-ID \(optional\) | +| `limit` | string | Nein | Maximale Ergebnisse \(Standard: 100\) | +| `fields` | string | Nein | Kommagetrennte Felder | +| `orderBy` | string | Nein | Sortierfeld | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Aufgabendaten | ### `salesforce_create_task` +Neue Aufgabe erstellen + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `subject` | string | Ja | Aufgabenbetreff \(erforderlich\) | +| `status` | string | Nein | Status \(z.B. Nicht begonnen, In Bearbeitung, Abgeschlossen\) | +| `priority` | string | Nein | Priorität \(z.B. Niedrig, Normal, Hoch\) | +| `activityDate` | string | Nein | Fälligkeitsdatum JJJJ-MM-TT | +| `whoId` | string | Nein | Zugehörige Kontakt-/Lead-ID | +| `whatId` | string | Nein | Zugehörige Konto-/Opportunity-ID | +| `description` | string | Nein | Beschreibung | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Erstellte Aufgabe | ### `salesforce_update_task` +Bestehende Aufgabe aktualisieren + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `taskId` | string | Ja | Aufgaben-ID \(erforderlich\) | +| `subject` | string | Nein | Aufgabenbetreff | +| `status` | string | Nein | Status | +| `priority` | string | Nein | Priorität | +| `activityDate` | string | Nein | Fälligkeitsdatum JJJJ-MM-TT | +| `description` | string | Nein | Beschreibung | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Aktualisierte Aufgabe | ### `salesforce_delete_task` +Aufgabe löschen + #### Eingabe | Parameter | Typ | Erforderlich | Beschreibung | | --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `taskId` | string | Ja | Aufgaben-ID \(erforderlich\) | #### Ausgabe | Parameter | Typ | Beschreibung | | --------- | ---- | ----------- | -| `success` | boolean | Status des Operationserfolgs | -| `output` | json | Ergebnisdaten der Operation | +| `success` | boolean | Erfolg | +| `output` | object | Gelöschte Aufgabe | + +### `salesforce_list_reports` + +Liste der für den aktuellen Benutzer zugänglichen Berichte abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `folderName` | string | Nein | Nach Ordnernamen filtern | +| `searchTerm` | string | Nein | Suchbegriff zum Filtern von Berichten nach Namen | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Berichtsdaten | + +### `salesforce_get_report` + +Metadaten und Beschreibungsinformationen für einen bestimmten Bericht abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `reportId` | string | Ja | Berichts-ID \(erforderlich\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Berichtsmetadaten | + +### `salesforce_run_report` + +Einen Bericht ausführen und die Ergebnisse abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `reportId` | string | Ja | Berichts-ID \(erforderlich\) | +| `includeDetails` | string | Nein | Detailzeilen einschließen \(true/false, Standard: true\) | +| `filters` | string | Nein | JSON-String der anzuwendenden Berichtsfilter | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Berichtsergebnisse | + +### `salesforce_list_report_types` + +Eine Liste der verfügbaren Berichtstypen abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Daten zu Berichtstypen | + +### `salesforce_list_dashboards` + +Eine Liste der für den aktuellen Benutzer zugänglichen Dashboards abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `folderName` | string | Nein | Nach Ordnernamen filtern | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Dashboard-Daten | + +### `salesforce_get_dashboard` + +Details und Ergebnisse für ein bestimmtes Dashboard abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `dashboardId` | string | Ja | Dashboard-ID \(erforderlich\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Dashboard-Daten | + +### `salesforce_refresh_dashboard` + +Ein Dashboard aktualisieren, um die neuesten Daten zu erhalten + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `dashboardId` | string | Ja | Dashboard-ID \(erforderlich\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Aktualisierte Dashboard-Daten | + +### `salesforce_query` + +Eine benutzerdefinierte SOQL-Abfrage ausführen, um Daten aus Salesforce abzurufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `query` | string | Ja | SOQL-Abfrage zur Ausführung \(z.B. SELECT Id, Name FROM Account LIMIT 10\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Abfrageergebnisse | + +### `salesforce_query_more` + +Abrufen zusätzlicher Abfrageergebnisse mit der nextRecordsUrl aus einer vorherigen Abfrage + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `nextRecordsUrl` | string | Ja | Die nextRecordsUrl aus einer vorherigen Abfrageantwort | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Abfrageergebnisse | + +### `salesforce_describe_object` + +Metadaten und Feldinformationen für ein Salesforce-Objekt abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | +| `objectName` | string | Ja | API-Name des Objekts \(z.B. Account, Contact, Lead, Custom_Object__c\) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Objekt-Metadaten | + +### `salesforce_list_objects` + +Liste aller verfügbaren Salesforce-Objekte abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `idToken` | string | Nein | Keine Beschreibung | +| `instanceUrl` | string | Nein | Keine Beschreibung | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `success` | boolean | Erfolgsstatus | +| `output` | object | Objektliste | ## Hinweise diff --git a/apps/docs/content/docs/en/blocks/condition.mdx b/apps/docs/content/docs/en/blocks/condition.mdx index 607fd64919..50c0488ad1 100644 --- a/apps/docs/content/docs/en/blocks/condition.mdx +++ b/apps/docs/content/docs/en/blocks/condition.mdx @@ -135,7 +135,7 @@ Function (Process) → Condition (account_type === 'enterprise') → Advanced or ## Best Practices - **Order conditions correctly**: Place more specific conditions before general ones to ensure specific logic takes precedence over fallbacks -- **Include a default condition**: Add a catch-all condition (`true`) as the last condition to handle unmatched cases and prevent workflow execution from getting stuck +- **Use the else branch when needed**: If no conditions match and the else branch is not connected, the workflow branch will end gracefully. Connect the else branch if you need a fallback path for unmatched cases - **Keep expressions simple**: Use clear, straightforward boolean expressions for better readability and easier debugging - **Document your conditions**: Add descriptions to explain the purpose of each condition for better team collaboration and maintenance - **Test edge cases**: Verify conditions handle boundary values correctly by testing with values at the edges of your condition ranges diff --git a/apps/docs/content/docs/en/introduction/index.mdx b/apps/docs/content/docs/en/introduction/index.mdx index 22a9617010..0843c61f12 100644 --- a/apps/docs/content/docs/en/introduction/index.mdx +++ b/apps/docs/content/docs/en/introduction/index.mdx @@ -72,7 +72,7 @@ For custom integrations, leverage our [MCP (Model Context Protocol) support](/mc