hertelerfeller
09/30/2026, 11:45 PMolearycrew
10/03/2026, 12:28 AMolearycrew
10/03/2026, 12:28 AMhertelerfeller
10/03/2026, 7:53 PMComposio Support Agent
10/04/2026, 6:32 AMhertelerfeller
10/04/2026, 8:45 PMComposio Support Agent
10/05/2026, 9:16 PM& parameter is enough to invalidate the signature and produce exactly the 400 you're seeing). The same applies if the URL sits in context for a while before use, since pre-signed URLs expire.
The reliable fix is to not route the URL through the agent's context at all. COMPOSIO_REMOTE_WORKBENCH runs in a sandbox that has helper functions preloaded, including run_composio_tool. Have the agent generate code that does both steps in one cell:
result = run_composio_tool("DROPBOX_READ_FILE", {"path": "/your/file.txt"})
s3_url = result["data"]["s3url"] # adjust key to the actual response shape
import requests
content = requests.get(s3_url).text
The URL then travels machine-to-machine — fetched fresh and used immediately — with no LLM re-serialization in between. As a bonus, this also keeps the file content out of the agent's context window.
If you'd like to confirm the diagnosis first, the S3 error body would settle it: S3 returns an XML payload with the 400 (e.g. a missing/invalid query parameter), which distinguishes a mangled URL from an expired one. A quick print(len(s3_url)) in the workbench compared against the original response length works too.hertelerfeller
10/07/2026, 1:21 AM