Agent development kit for Go and Temporal.
Vihren ADK is being built for durable agents whose loops, tools, memory, human review, sandboxed execution, testing, and observability are expressed as Temporal workflow primitives. Its shipped foundations provide typed workflow boundaries, large-value storage, and embedded Temporal without hiding the Temporal SDK.
go install vihren.dev/vihren/cmd/vihren-gen@latest
Typed Temporal codegen
Raw Temporal calls can cross workflow and activity boundaries through names, payloads, registration calls, and result plumbing the Go compiler cannot fully check. Vihren generates typed activity proxies, workflow clients, and worker registration while leaving workflow code close to the native Temporal SDK.
var out GreetingOutput
err := workflow.ExecuteActivity(
ctx,
"ComposeGreeting",
in,
).Get(ctx, &out)
return out, errreturn Activity.ComposeGreeting(ctx, in)The generated surface removes repetitive plumbing without replacing Temporal's workflow model.
Large values without large workflow histories
Documents, tool results, model context, and conversation history can overwhelm Temporal payload limits or be written repeatedly as a durable workflow runs. Vihren v0.3 stores large bytes once and keeps small, typed claims in workflow history.
- workflow reads
- Temporal
ExternalStoragetransparently stores a large payload and materializes it when workflow code needs the value. - workflow routes
blob.Value[T]lets activities exchange a typed inline value or storage handle without fetching large bytes into the workflow.
embeddedtemporal.WithLocalStorage wires both paths to one DataConverter-aware local filesystem and SQLite backend. The released foundation is local-only and does not yet include garbage collection or ownership transfer.
Temporal for local examples, in process.
embeddedtemporal starts a Temporal server inside the current process, so examples, demos, and single-binary local development do not require Docker, a daemon, or temporal server start-dev. It is not intended for production deployment.
Smallest useful example
Direct Vihren with ordinary Go functions and workflow and activity annotations.
// GreetingInput is the typed input for both the workflow and the activity.
type GreetingInput struct {
Name string
}
// GreetingOutput is the typed result returned to the caller.
type GreetingOutput struct {
Message string
}
// ComposeGreeting builds a greeting. The marker tells vihren-gen to register it
// as a Temporal activity and to expose a type-checked proxy method.
//
//vihren:activity
func (activities *GreetingActivities) ComposeGreeting(ctx context.Context, in GreetingInput) (GreetingOutput, error) {
_ = ctx
return GreetingOutput{Message: fmt.Sprintf("%s, %s", activities.Prefix, in.Name)}, nil
}
// HelloWorkflow schedules the activity through the generated Activity proxy, so
// the activity name and argument types are checked at compile time.
//
//vihren:workflow
func HelloWorkflow(ctx workflow.Context, in GreetingInput) (GreetingOutput, error) {
ctx = workflow.WithActivityOptions(ctx, workflow.ActivityOptions{StartToCloseTimeout: time.Second})
return Activity.ComposeGreeting(ctx, in)
}go generate ./examples/codegenhelloCurrent status
- available now
- Typed activity proxies, workflow clients, worker registration, local large-value storage, and embedded Temporal.
- good fit
- Go teams that want less hand-written Temporal plumbing, typed claim-check values for large data, or self-contained examples and local development.
- not yet
- The planned agent-loop, tool, memory, human-review, sandbox, testing, and observability layers; a production storage backend; garbage collection; ownership transfer; or production embedded Temporal deployment.
- project status
- Early open-source releases. APIs and operational boundaries may change as the ADK is used in real workflows.
Use it, inspect it, or help shape it.
Start with the repository and package documentation. If you are building long-running, tool-using, or LLM-assisted workflows on Temporal, I am looking for real constraints that can shape the next open-source foundations.