RunAgent Dart/Flutter SDK
The Dart SDK mirrors the Python CLI client so Dart/Flutter services can trigger hosted or local RunAgent deployments. It wraps the /api/v1/agents/{agent_id}/run and /run-stream endpoints, handles auth/discovery, and translates responses into Dart-friendly types.
Feature Overview
- Native Dart arguments: Pass maps and lists directly
- Streaming and non-streaming guardrails:
run()rejects*_streamtags with a helpful errorrunStream()rejects non-stream tags with a helpful error
- Local vs Remote:
- Local DB discovery from
~/.runagent/runagent_local.db(override withhost/port) - Remote uses
RUNAGENT_BASE_URL(defaulthttps://backend.run-agent.ai) and Bearer token
- Local DB discovery from
- Authentication:
Authorization: Bearer RUNAGENT_API_KEYautomatically for remote calls- WS token fallback
?token=...for streams
- Error taxonomy:
AUTHENTICATION_ERROR,CONNECTION_ERROR,VALIDATION_ERROR,SERVER_ERROR,UNKNOWN_ERROR- Execution errors include
code,suggestion,detailswhen provided by backend
- Architecture:
getAgentArchitecture()normalizes envelope and legacy formats and enforcesARCHITECTURE_MISSINGwhen needed
- Config precedence:
- Explicit
RunAgentClientConfigfields → environment → defaults
- Explicit
- Extra params:
RunAgentClientConfig.extraParamsstored and retrievable viaclient.getExtraParams()
Installation
Option 1: Local Development (Current Setup)
If you're developing locally or the package isn't published to pub.dev yet, use a path dependency:
dependencies:
runagent:
path: ../runagent-dart # Adjust path relative to your project
Or use an absolute path:
dependencies:
runagent:
path: /home/azureuser/runagent/runagent-dart
Option 2: From pub.dev (When Published)
Once the package is published to pub.dev, you can use:
dependencies:
runagent: ^0.1.0
Then run:
flutter pub get
# or
dart pub get
Note: Requires Dart 3.0+.
Configuration Precedence
- Explicit
RunAgentClientConfigfields - Environment variables
RUNAGENT_API_KEYRUNAGENT_BASE_URL(defaults tohttps://backend.run-agent.ai)RUNAGENT_LOCAL,RUNAGENT_HOST,RUNAGENT_PORT,RUNAGENT_TIMEOUT
- Library defaults (e.g., local DB discovery, 300 s timeout)
When local is true (or RUNAGENT_LOCAL=true), the SDK reads ~/.runagent/runagent_local.db to discover the host/port unless they're provided directly.
Local vs Remote: Host/Port Optionality
- Remote (cloud or self-hosted base URL):
- Do not set
host/port. ProvideapiKey(or setRUNAGENT_API_KEY), and optionallybaseUrl. - Example:
final client = await RunAgentClient.create( RunAgentClientConfig.create( agentId: 'id', entrypointTag: 'minimal', apiKey: Platform.environment['RUNAGENT_API_KEY'], // baseUrl optional; defaults to https://backend.run-agent.ai ), );
- Do not set
- Local:
host/portare optional. If either is missing, the SDK discovers the value(s) from~/.runagent/runagent_local.dbfor the givenagentId.- If discovery fails (agent not registered), you'll get a clear
VALIDATION_ERRORsuggesting to passhost/portor register the agent locally. - Examples:
// Rely fully on DB discovery (no host/port) final client = await RunAgentClient.create( RunAgentClientConfig.create( agentId: 'local-id', entrypointTag: 'generic', local: true, ), ); // Provide only host, let port be discovered final client = await RunAgentClient.create( RunAgentClientConfig.create( agentId: 'local-id', entrypointTag: 'generic', local: true, host: '127.0.0.1', ), );
Quickstart (Remote)
import 'dart:io';
import 'package:runagent/runagent.dart';
Future<void> main() async {
final client = await RunAgentClient.create(
RunAgentClientConfig.create(
agentId: 'YOUR_AGENT_ID',
entrypointTag: 'minimal',
apiKey: Platform.environment['RUNAGENT_API_KEY'],
),
);
try {
final result = await client.run({
'message': 'Summarize Q4 retention metrics',
});
print('Response: $result');
} catch (e) {
if (e is RunAgentError) {
print('Error: ${e.message}');
if (e.suggestion != null) {
print('Suggestion: ${e.suggestion}');
}
}
}
}
Quickstart (Local)
final client = await RunAgentClient.create(
RunAgentClientConfig.create(
agentId: 'local-agent-id',
entrypointTag: 'generic',
local: true,
host: '127.0.0.1', // optional: falls back to DB entry
port: 8450,
),
);
If host/port are omitted, the SDK looks up the agent in ~/.runagent/runagent_local.db. Missing entries yield a helpful VALIDATION_ERROR.
Streaming Responses
await for (final chunk in client.runStream({
'prompt': 'Stream a haiku about Dart',
})) {
print(chunk);
}
- Local streams connect to
ws://{host}:{port}/api/v1/agents/{id}/run-stream. - Remote streams upgrade to
wss://backend.run-agent.ai/api/v1/...and append?token=RUNAGENT_API_KEY.
Extra Params & Metadata
RunAgentClientConfig.extraParams accepts arbitrary metadata; call client.getExtraParams() to retrieve a copy. Reserved for future features (tracing, tags) without breaking the API.
Error Handling
All SDK errors extend RunAgentError and expose concrete error types:
| Type | Meaning | Typical Fix |
|---|---|---|
AUTHENTICATION_ERROR |
API key missing/invalid | Set RUNAGENT_API_KEY or Config.apiKey |
CONNECTION_ERROR |
Network/DNS/TLS issues | Verify network, agent uptime |
VALIDATION_ERROR |
Bad config or missing agent | Check agentId, entrypoint, local DB |
SERVER_ERROR |
Upstream failure (5xx) | Retry or inspect agent logs |
Remote responses that return a structured error block become RunAgentExecutionError with code, suggestion, and details copied directly.
Use catch (e) and check e is RunAgentError to inspect fields.
Testing & Troubleshooting
dart testexercises the SDK build.- Enable debug logging in your application to capture request IDs.
- For local issues, run
runagent cli agents listto confirm the SQLite database contains the agent and the host/port match. - For remote failures, confirm the agent is deployed and the entrypoint tag is enabled in the RunAgent Cloud dashboard.
Publishing
See PUBLISH.md in this directory for release instructions (version bumps, tagging, and pub.dev publishing).
Libraries
- runagent
- RunAgent SDK for Dart/Flutter