simulate.py, stays in Python
and drives your agent through a bridge child process, so the mock environment, scenarios, evals and report
are the same as for a Python agent.
The scan picks the bridge automatically for every Node agent its preflight accepts:
- Mastra
- Vercel AI SDK
- LangGraph.js
- OpenAI Agents JS
- A custom agent loop
Requirements
A bridge setup needs two runtimes on your machine:
Your agent’s own dependencies must already be installed (its
node_modules). Installing them is up to you; the
bridge never installs into your project.
What the bridge installs, and where
Everything the bridge writes lives under the plugin’s work folder,plurai_sim/, in your project:
The bridge never reads or changes your
package.json or your project’s .npmrc. Its one write outside the
work folder is npm’s cache under ~/.npm.
If the runtime install fails behind a proxy or private registry, set the registry or proxy in ~/.npmrc. Your
project’s .npmrc does not apply to the bridge’s install.
How your agent’s calls are mocked
The scan maps each external system your agent calls at the deepest boundary below your business logic:
Anything the map does not route fails closed at run time. An unmapped call, a refused shape, or a call to a host
you did not declare voids the turn as a harness fault that names it, even when your agent catches the error.
Conversation history stays your agent’s own. Each turn the bridge sends the thread id and the new user message
only, and your agent keeps history keyed on the thread, as it does in production.
Refused runtimes and shapes
The bridge refuses these by name, with the reason and a remedy. It never works around them.
Some client shapes cannot be mapped at the package level and are mapped at another seam instead. For example,
AWS SDK
send(new XCommand()) calls are mapped at the HTTP level, and query builders such as knex,
drizzle-orm, kysely or @supabase/supabase-js are mapped at HTTP or at your own data-access module.
A NestJS app may need a build before the bridge can import it, and a Next.js app’s runtime APIs can be refused.
The preflight says so with the remedy.
How a Run reads bridge outcomes
- A fail-closed event, a mocked call the harness could not serve, or the child’s death is a harness fault. The scenario is void, and the log tail is in its error record.
- An error your agent’s own code threw is a failed trial, owned by your agent.
- A provider failure is recorded as provider infrastructure, not as your agent’s failure.
Next steps
Scan your agent
Generate the harness and the bridge map.
Run the simulation
Score your agent across the suite.