feat(integrations): extend ElevenLabs, Google Drive, Firecrawl, Pinecone, Resend, and S3 tool depth#5270
Conversation
…act status, credit usage tools
…speech-to-speech, audio-isolation tools
… tool routes (s3, elevenlabs, google_drive export)
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
PR SummaryMedium Risk Overview ElevenLabs becomes a multi-operation block (TTS plus sound effects, speech-to-speech, audio isolation, voice/model/account APIs) with a new Google Drive gains export (Workspace → PDF/DOCX/etc. via Firecrawl adds batch scrape, job status/cancel for crawl and extract, and credit usage. Pinecone adds vector update/delete, ID listing, index stats, and control-plane list/describe index. Resend adds audiences, broadcasts, and cancel scheduled email. S3 adds bucket lifecycle, head object, presigned URLs, and batch delete via new AWS SDK routes and Zod API contracts. Existing auth patterns ( Reviewed by Cursor Bugbot for commit 3062ecb. Configure here. |
Greptile SummaryThis PR deepens six integrations (ElevenLabs, Google Drive, Firecrawl, Pinecone, Resend, S3) by adding 41 new tools, new internal proxy routes for binary-output operations (ElevenLabs audio, Drive export, S3 bucket management), and updated documentation. The implementation reuses existing auth scopes and follows established tool-framework patterns for error handling.
Confidence Score: 5/5The new proxy routes are well-hardened (auth checks, DNS pinning, URL encoding, size limits) and the tool configs follow established patterns throughout. Two style-level observations exist but neither affects correctness in normal use. All new API routes go through apps/sim/tools/firecrawl/batch-scrape.ts (scrapeOptions spread ordering) and apps/sim/tools/elevenlabs/edit-voice-settings.ts / get-voice.ts / get-voice-settings.ts (voiceId not encodeURIComponent-wrapped) Important Files Changed
Sequence Diagram%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
participant Client as Workflow Executor
participant AudioProxy as /api/tools/elevenlabs/audio
participant ExportProxy as /api/tools/google_drive/export
participant S3Proxy as /api/tools/s3/*
participant ElevenLabs as api.elevenlabs.io
participant GoogleDrive as googleapis.com
participant AWS as AWS S3
Client->>AudioProxy: "POST {operation, apiKey, audioFile?}"
AudioProxy->>AudioProxy: checkInternalAuth + validateAlphanumericId(voiceId)
AudioProxy->>ElevenLabs: POST sound-generation / speech-to-speech / audio-isolation
ElevenLabs-->>AudioProxy: audio/mpeg binary
AudioProxy->>AudioProxy: readResponseToBufferWithLimit (25 MB cap)
AudioProxy-->>Client: "{audioUrl, audioFile}"
Client->>ExportProxy: "POST {accessToken, fileId, mimeType}"
ExportProxy->>ExportProxy: checkInternalAuth + encodeURIComponent(fileId)
ExportProxy->>GoogleDrive: "GET /files/{fileId} metadata (validateUrlWithDNS + pinnedIP)"
GoogleDrive-->>ExportProxy: file metadata
ExportProxy->>GoogleDrive: "GET /files/{fileId}/export?mimeType=... (10 MB cap)"
GoogleDrive-->>ExportProxy: exported bytes
ExportProxy-->>Client: "{file: {name, mimeType, data(base64), size}}"
Client->>S3Proxy: "POST {accessKeyId, secretAccessKey, region, ...}"
S3Proxy->>S3Proxy: checkInternalAuth + parseToolRequest (Zod contract)
S3Proxy->>AWS: AWS SDK command (CreateBucket / DeleteObjects / HeadObject / PresignedURL / ...)
AWS-->>S3Proxy: result
S3Proxy-->>Client: "{success, output}"
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
participant Client as Workflow Executor
participant AudioProxy as /api/tools/elevenlabs/audio
participant ExportProxy as /api/tools/google_drive/export
participant S3Proxy as /api/tools/s3/*
participant ElevenLabs as api.elevenlabs.io
participant GoogleDrive as googleapis.com
participant AWS as AWS S3
Client->>AudioProxy: "POST {operation, apiKey, audioFile?}"
AudioProxy->>AudioProxy: checkInternalAuth + validateAlphanumericId(voiceId)
AudioProxy->>ElevenLabs: POST sound-generation / speech-to-speech / audio-isolation
ElevenLabs-->>AudioProxy: audio/mpeg binary
AudioProxy->>AudioProxy: readResponseToBufferWithLimit (25 MB cap)
AudioProxy-->>Client: "{audioUrl, audioFile}"
Client->>ExportProxy: "POST {accessToken, fileId, mimeType}"
ExportProxy->>ExportProxy: checkInternalAuth + encodeURIComponent(fileId)
ExportProxy->>GoogleDrive: "GET /files/{fileId} metadata (validateUrlWithDNS + pinnedIP)"
GoogleDrive-->>ExportProxy: file metadata
ExportProxy->>GoogleDrive: "GET /files/{fileId}/export?mimeType=... (10 MB cap)"
GoogleDrive-->>ExportProxy: exported bytes
ExportProxy-->>Client: "{file: {name, mimeType, data(base64), size}}"
Client->>S3Proxy: "POST {accessKeyId, secretAccessKey, region, ...}"
S3Proxy->>S3Proxy: checkInternalAuth + parseToolRequest (Zod contract)
S3Proxy->>AWS: AWS SDK command (CreateBucket / DeleteObjects / HeadObject / PresignedURL / ...)
AWS-->>S3Proxy: result
S3Proxy-->>Client: "{success, output}"
Reviews (8): Last reviewed commit: "fix(integrations): I/O fidelity vs API d..." | Re-trigger Greptile |
- pinecone: read camelCase vectorType/deletionProtection (with snake_case fallback) so list_indexes/describe_index populate them; make describe_index_stats casing defensive - google-drive: URL-encode fileId in the export route - remove extraneous inline/section-divider comments across new blocks/tools; convert type docs to TSDoc
|
@greptile review |
|
@cursor review |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
2 issues from previous reviews remain unresolved.
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit e33543c. Configure here.
…scrape job-id guard, s3 head-object existence - elevenlabs: select stability/similarityBoost by operation so a stale edit-settings value can't bleed into a TTS call - firecrawl: fail fast with a clear error when batch scrape returns no job id (avoids a misleading polling timeout) - s3: head_object on a missing key now returns exists:false instead of a generic failure
|
@greptile review |
|
@cursor review |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 062eb50. Configure here.
…must match the missing-object output)
|
@greptile review |
|
@cursor review |
…Metadata Malformed JSON-string input now throws a clear '<field> must be valid JSON' error via a shared parseJsonParam helper instead of crashing the request body builder.
|
@greptile review |
|
@cursor review |
…delete_vectors Pinecone treats these delete selectors as mutually exclusive; the tool now requires exactly one and throws a clear error otherwise, instead of sending a conflicting body.
|
@greptile review |
|
@cursor review |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit c7308eb. Configure here.
- pinecone: normalize describe_index_stats per-namespace vector_count -> vectorCount - firecrawl: remove phantom 'sources' from extract_status, add real creditsUsed/tokensUsed; expose batch_scrape maxConcurrency/ignoreInvalidURLs - google-drive: drop undocumented supportsAllDrives from the files.export URL - elevenlabs: add next_page_token input to list_voices (fixes pagination dead-end) - resend: surface segment_id on get_broadcast; declare replyTo + segment_id in block outputs
|
@greptile review |
|
@cursor review |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 3062ecb. Configure here.
|
@greptile review |

Summary
Wave 3 of integration tool-depth: deepens six popular integrations that were shallow relative to their APIs. Every operation reuses the integration's existing scopes/auth — no new OAuth scopes;
lib/oauth/oauth.tsis untouched.What's added (41 new tools)
ElevenLabs (1 → 10 tools; API key) — list/get voices, get/edit voice settings, list models, get user, plus sound-effects, speech-to-speech, and audio-isolation (binary out via an internal route)
Google Drive (reuses
drive) — list/get revisions, create/list/delete comments, export Google-native files to a formatFirecrawl (v2; API key) — crawl status/cancel, batch scrape + status, extract status, credit usage
Pinecone (API key) — delete/update vectors, describe-index-stats, list vector ids, list/describe indexes (data-plane vs control-plane handled per op)
Resend (API key) — audiences CRUD, broadcasts (create/send/get), cancel email
S3 (AWS key) — list/create/delete buckets, head-object, presigned URL, batch delete-objects (AWS SDK + internal routes)
Notes
tools.config.params; request/response shapes verified against each provider's live API docs.check-api-validationroute baseline is bumped 872 → 873 accordingly.integrations.jsoncatalog regenerated from the block registry.Validation
bunx tsc --noEmit: clean across changed filesbunx biome check: cleanblocks/blocks.test.ts: 83/83 pass (incl. canonical-param test)bun run check:api-validation: passed