What It Is
Once the sidecar is running, the next question is simple: how does the core talk to your code? The answer isGrpcAgentClient. It is a Python class that behaves like a function. You call it with messages, it returns a string or dict, and internally it makes a gRPC call to the SDK process.
That is the key bridge between the engine and the driver.
The Problem It Solves
ManifestWorker has this line:manifest.run is a wrapper around the developer’s handler function. It takes a list of message dicts and returns a string or dict.
For TypeScript or Kotlin agents, we need the same call to go over the network. But we do not want to change ManifestWorker because it already handles task state transitions, error handling, tracing, and payment settlement.
Solution: make GrpcAgentClient a callable that quacks like a handler function.
How It Works
This is the bridge in its smallest form:The Response Contract
Everything downstream depends on this contract. The transport can change, but the return types cannot.| Handler returns | ManifestWorker does | Task state |
|---|---|---|
"The capital of France is Paris." | Creates message + artifact | completed |
{"state": "input-required", "prompt": "Can you clarify?"} | Creates message, keeps task open | input-required |
{"state": "auth-required"} | Creates message, keeps task open | auth-required |
ResultProcessor, ResponseDetector, and ArtifactBuilder then process them the same way they would process a local Python handler.
That is the bigger pattern again: the sidecar changes the transport, not the behavior contract.
Real Example
Here is the full path for one message:When It’s Created
The bridge gets attached during registration:Connection Lifecycle
The client connects lazily. The gRPC channel is created on the first call, not during initialization. That avoids connection errors during registration if the SDK server is not fully ready yet. When the SDK disconnects (Ctrl+C, crash), the next HandleMessages call fails with grpc.StatusCode.UNAVAILABLE. ManifestWorker’s existing error handling catches this and marks the task as failed.
Health Checks and Capabilities
The core can also ask the sidecar whether the driver is still healthy:The TypeScript SDK
That bridge is what the SDK wraps in a developer-friendly experience. You can use the OpenAI SDK, LangChain.js, or raw HTTP calls in your app. The sidecar does not care. You still call one function:Installation
What Happens When You Call bindufy()
The SDK is really an orchestrator for the sidecar lifecycle:
Handler Patterns
With the sidecar in place, handler authoring becomes the main job.Simple response
OpenAI SDK
LangChain.js
Multi-turn conversation
input-required. The user sends a follow-up. The core calls your handler again with the full conversation history.
Error handling
If your handler throws, the SDK catches it and returns a gRPC error. ManifestWorker marks the task as failed.Configuration
The driver stays small, but the SDK surface is flexible:Skills
The sidecar can only advertise what you describe to it. That is where skills come in.File-based (recommended)
Inline
Types
The SDK exports the key types your driver works with:Debugging
When something goes wrong, it usually helps to inspect each half of the sidecar separately.Check core logs
Test the agent manually
Port conflicts
Limits to Keep in Mind
This page focuses on implementation. For the full architectural limits, see the overview.gRPC Overview
Review the sidecar architecture and current limits
API Reference
Look up services, messages, ports, and config details