
Both options you proposed will work — and you've actually identified the two best approaches. Let me walk through each.
Option 1 (Recommended): Pass the record ID — let the agent pull the text itself
This is the cleanest architecture and the one I'd use in production. The 2000-character constraint is on the input message field of the Power Automate connector, not on what the agent can process internally. So the trick is to never push the large text through the connector at all.
Here's the pattern:
The agent fetches the latest version of the record at query time, there is no payload size concern, and you keep full control over which columns you expose. This scales to any text length.
If you want to avoid a separate cloud flow, the Copilot Studio Dataverse connector (under Actions > Add a connector) can also query rows directly without needing to build a flow — worth checking if your table is straightforward.
Option 2: Upload a file and pass the URL or filename
Also feasible, and better suited to scenarios where the content is more static (documents, templates, reference material) rather than a frequently-changing Dataverse record.
Pattern:
For dynamic Dataverse records that change per-run, Option 1 is significantly less overhead — no file management, no cleanup, no stale content risk.
Why the limit exists
The ~2000-character constraint is a channel-level input limit on the message payload in the Power Automate connector, not an AI model limit. Copilot Studio's language model can handle much longer context — you just can't push large text through the conversation trigger field in one shot. Passing structured identifiers (record IDs, URLs) instead of raw text is the standard workaround across all channel types.
References