Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
16d5480
feat(workflow): initial naive agent implementation
wolo-lab Apr 26, 2026
5982098
Adjust api of basic componentes after review (#769)
wolo-lab Apr 29, 2026
ed9b938
feat: implement workflow routing support with tagged events and condi…
hanorik Apr 30, 2026
21084fb
feat: add MultiRoute generic type to support matching multiple route …
hanorik May 4, 2026
1edeb31
feat: add tool node to workflow agents (#776)
anFatum May 5, 2026
a5f3769
feat: implement explicit Default route support in workflow graph trav…
hanorik May 6, 2026
9fc0aff
feat: add EdgeBuilder to simplify workflow graph construction (#795)
hanorik May 7, 2026
98464e6
feat: add NodeConfig to the workflow nodes (#796)
anFatum May 7, 2026
85d1737
feat: implement node name validation and update workflow construction…
hanorik May 7, 2026
846ee9a
feat: add start node validation (#807)
hanorik May 12, 2026
6898cc4
feat: introduce scheduler-based engine with goroutine-per-node execut…
wolo-lab May 13, 2026
47aa415
Init function node in agent workflows (#810)
anFatum May 14, 2026
923ae76
feat: implement default route validation to prevent multiple default …
hanorik May 15, 2026
85fb61d
refactor: implement unconditional cycle detection in workflow validat…
hanorik May 15, 2026
b7db540
feat: implement workflow validation to reject duplicate edges and rem…
hanorik May 15, 2026
a69d788
feat: implement workflow connectivity validation to ensure all nodes …
hanorik May 15, 2026
712afc9
workflow: add HITL pause primitives (RequestInput, waiting node) (#829)
wolo-lab May 15, 2026
7a35c04
workflow: add HITL resume API with handoff mode and session-state per…
wolo-lab May 18, 2026
e7b048e
feat: add HITL re-entry resume mode for workflow agents (#832)
wolo-lab May 20, 2026
a99e7e6
feat: remove unused TriggeredBy() interface method (#841)
wolo-lab May 20, 2026
fc92547
fix: persist resume inputs across re-entry cycles (#844)
wolo-lab May 20, 2026
7af46cd
feat: add retry config implementation (#853)
anFatum May 21, 2026
305a73c
feat: add generic Output field to session events and persist via stor…
hanorik May 22, 2026
b24f7b6
feat: workflow - add JoinNode fan-in barrier (#856)
wolo-lab May 24, 2026
d70be36
feat: implement AgentNode (#840)
hanorik May 25, 2026
71076a1
fix: align WorkflowInputFunctionCallName with adk-python (#875)
wolo-lab May 25, 2026
035b4de
refactor: replace StateDelta output tracking with direct Event.Output…
hanorik May 26, 2026
f66fe42
feat: add HITL console launcher support for workflow input prompts + …
wolo-lab May 27, 2026
3f7e25d
feat: add llmagent mode api (#900)
dpasiukevich May 27, 2026
fcc6ec9
feat: add new parallel worker node type to the adk workflows so it co…
anFatum May 27, 2026
108d608
feat(telemetry): add functional test infrastructure and agent telemet…
RKest May 27, 2026
39d0531
feat: add FinishTaskTool (#901)
dpasiukevich May 28, 2026
e50f576
feat(workflow): publish NodeContext + add error sentinels and sub-sch…
wolo-lab May 28, 2026
2c08701
feat(workflow): add dynamic-node orchestration (#896)
wolo-lab May 28, 2026
44a0097
examples: minimal dynamic-workflow sample (#897)
wolo-lab May 28, 2026
fb82b8e
feat: extend Node interface with JSON schema support and input valida…
hanorik May 28, 2026
e1d70b6
workflow: experimental NodeContext bridge for runnable tools (#907)
wolo-lab May 28, 2026
bd4b8ae
feat(workflow): branch isolation across static, parallel, and dynamic…
wolo-lab May 28, 2026
a2283a8
fix(examples): remove unused telemetry import in multipletools (#909)
wolo-lab May 29, 2026
68a032b
feat: add SingleTurnTool (#914)
dpasiukevich May 29, 2026
45d05df
feat: add TaskAgentTool (#915)
dpasiukevich May 29, 2026
d0a180b
feat: add the workflow node to allow the nested workflows (#910)
anFatum May 29, 2026
f41544d
feat(telemetry): Instrument nodes and workflows (#891)
RKest May 29, 2026
ed1af3c
feat(workflow): add WithMaxConcurrency option to cap graph-scheduled …
wolo-lab May 29, 2026
fd92e75
feat: add JSON schema validation support to BaseNode and update const…
hanorik May 31, 2026
9d5920c
feat(workflow): AgentNode synthesizes Event.Output from LLM text (#925)
wolo-lab Jun 1, 2026
0a4642b
feat(workflow): idempotent RunNode dispatch via WithRunID cache (#921)
wolo-lab Jun 1, 2026
c964961
fix(typeutil): decode validation input into `any` to accept non-objec…
wolo-lab Jun 1, 2026
b99b49d
docs: add single_turn and task sub agent examples (#934)
dpasiukevich Jun 1, 2026
54cf7d9
fix(workflow): repair v2 build after rebase onto main (#942)
wolo-lab Jun 2, 2026
e3adfdf
refactor: create runner.getOrCreateSession method (#944)
dpasiukevich Jun 2, 2026
d266f51
Context unification: merge interfaces ToolContext and CallbackContext…
kdroste-google Jun 3, 2026
27abf86
Replaced deprecated tool.Context with agent.ToolContext (#951)
kdroste-google Jun 3, 2026
aece749
feat(workflow): add ValidateOutput method to Node interface (#929)
wolo-lab Jun 4, 2026
dc1dcb2
feat(console): add HITL support for tool confirmation prompts (#852)
wolo-lab Jun 4, 2026
9a413a2
feat(runner): HITL via long-running interrupts with history rehydra… …
wolo-lab Jun 8, 2026
6a44927
feat(runner): drive LlmAgent through the ADK 2.0 node runtime with HI…
wolo-lab Jun 8, 2026
ebd9ef1
fix(console): dedup pending HITL interrupts across SSE partial events…
wolo-lab Jun 8, 2026
f8bf35e
feat(workflow): RunNode WithUseAsOutput for child -> parent output de…
wolo-lab Jun 8, 2026
583f97d
samples(workflow): routing samples (#979)
wolo-lab Jun 8, 2026
9fe08b5
feat: introduce robust JSON-aware input validation in base node for s…
hanorik Jun 8, 2026
83d06ea
feat: setup LLMAgent mode in the runner before run (#983)
dpasiukevich Jun 8, 2026
f90120b
feat: implement input validation in scheduler and exclude ErrInputVal…
hanorik Jun 8, 2026
4ba8888
feat(llm): isolation_scope to filter agent prompt history by scope (#…
wolo-lab Jun 9, 2026
92cdfe2
feat(workflow): derive node output from message via NodeInfo.MessageA…
wolo-lab Jun 9, 2026
1bf3884
feat(workflow): NodeInfo.OutputFor for delegation-chain output attrib…
wolo-lab Jun 9, 2026
2c5ca40
feat(workflow): stamp isolation_scope on delegated node events (#988)
wolo-lab Jun 9, 2026
189b2f4
feat: add ValidateInput override to JoinNode to validate individual p…
hanorik Jun 9, 2026
4ca7d8a
refactor: Migrate existing nodes (Function/Tool/start + test nodes) t…
hanorik Jun 9, 2026
2b22abd
feat: add singleTurnNudge in contents processor (#989)
dpasiukevich Jun 9, 2026
88b0338
feat: reject task mode llmagents as static graph nodes (#995)
dpasiukevich Jun 10, 2026
e58319e
feat: add NewFunctionNodeFromState to support binding node inputs and…
hanorik Jun 10, 2026
5220408
feat: exclude task&single_turn from direct transfer (#998)
dpasiukevich Jun 10, 2026
c05d67a
feat: add tool deferred response (#997)
dpasiukevich Jun 10, 2026
9b46584
feat(workflow): Node-to-Node Data Flows (#943)
baptmont Jun 11, 2026
14b8b3c
feat(workflow): Support configurable workflows (#936)
baptmont Jun 11, 2026
1084281
feat: introduce WorkflowConfig to support state schema validation dur…
hanorik Jun 11, 2026
3e15365
fix(webui): rebuild embedded bundle from adk-web HEAD to fix HITL ren…
wolo-lab Jun 11, 2026
51fabf5
feat(workflow): validate node output with passthrough and model-text …
wolo-lab Jun 11, 2026
b39a737
feat: add utility to generate canonical, key-sorted JSON for schemas …
hanorik Jun 11, 2026
d594560
feat: add static schema validation to workflow graph construction (#993)
hanorik Jun 11, 2026
bf99839
fix(workflow): make RunNode work from tools inside a static dynamic n…
wolo-lab Jun 12, 2026
ca7f256
refactor(workflow) Context unification NodeContext with InvocationCon…
kdroste-google Jun 12, 2026
233b8df
feat(agent): add StrictContextMock test double for unified Context
wolo-lab Jun 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions README-v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Agent Development Kit (ADK) for Go v 2.0

[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)


## Breaking changes

### Mocks update required for unified contexts
PR https://github.com/google/adk-go/pull/945 merges ToolContext and CallbackContext into single Context.
ToolContext and CallbackContext became aliases to Context.

This introduces a problem for mock contexts - new functions (ToolContext-related) are missing if the mock was created for the previous version of CallbackContext.
Solution:
Add those functions to your mock:
```go
func (m *MockCallbackContext) Actions() *session.EventActions { return nil }
func (m *MockCallbackContext) FunctionCallID() string { return "" }
func (m *MockCallbackContext) ToolConfirmation() *toolconfirmation.ToolConfirmation { return nil }
func (m *MockCallbackContext) RequestConfirmation(hint string, payload any) error {
return fmt.Errorf("RequestConfirmation() is not supported for MockCallbackContext")
}
func (m *MockCallbackContext) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) {
return nil, fmt.Errorf("SearchMemory() is not supported for MockCallbackContext")
}

var _ agent.CallbackContext = (*MockCallbackContext)(nil)
```
50 changes: 32 additions & 18 deletions agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ func (a *agent) SubAgents() []Agent {

func (a *agent) Run(ctx InvocationContext) iter.Seq2[*session.Event, error] {
return func(yield func(*session.Event, error) bool) {
spanCtx, span := telemetry.StartInvokeAgentSpan(ctx, a, ctx.Session().ID(), ctx.InvocationID())
spanCtx, span := telemetry.StartNodeSpan(ctx, ctx, telemetry.OperationAgent{Agent: a})
yield, endSpan := telemetry.WrapYield(span, yield, func(span trace.Span, event *session.Event, err error) {
telemetry.TraceAgentResult(span, telemetry.TraceAgentResultParams{
ResponseEvent: event,
Expand All @@ -170,44 +170,48 @@ func (a *agent) Run(ctx InvocationContext) iter.Seq2[*session.Event, error] {
})
defer endSpan()
// TODO: verify&update the setup here. Should we branch etc.
ctx := &invocationContext{

ic := &invocationContext{
Context: ctx.WithContext(spanCtx),
agent: a,
artifacts: ctx.Artifacts(),
memory: ctx.Memory(),
session: ctx.Session(),

invocationID: ctx.InvocationID(),
branch: ctx.Branch(),
userContent: ctx.UserContent(),
runConfig: ctx.RunConfig(),
endInvocation: ctx.Ended(),
invocationID: ctx.InvocationID(),
branch: ctx.Branch(),
isolationScope: ctx.IsolationScope(),
userContent: ctx.UserContent(),
runConfig: ctx.RunConfig(),
endInvocation: ctx.Ended(),
}
event, err := runBeforeAgentCallbacks(ctx)
nodeCtx := NewNodeContext(ic, nil)

event, err := runBeforeAgentCallbacks(nodeCtx)
if event != nil || err != nil {
if !yield(event, err) {
return
}
}

if ctx.Ended() {
if ic.Ended() {
return
}

for event, err := range a.run(ctx) {
for event, err := range a.run(nodeCtx) {
if event != nil && event.Author == "" {
event.Author = getAuthorForEvent(ctx, event)
event.Author = getAuthorForEvent(ic, event)
}
if !yield(event, err) {
return
}
}

if ctx.Ended() {
if ic.Ended() {
return
}

event, err = runAfterAgentCallbacks(ctx)
event, err = runAfterAgentCallbacks(ic)
if event != nil || err != nil {
yield(event, err)
}
Expand Down Expand Up @@ -367,11 +371,12 @@ type invocationContext struct {
memory Memory
session session.Session

invocationID string
branch string
userContent *genai.Content
runConfig *RunConfig
endInvocation bool
invocationID string
branch string
isolationScope string
userContent *genai.Content
runConfig *RunConfig
endInvocation bool
}

func (c *invocationContext) Agent() Agent {
Expand All @@ -398,6 +403,10 @@ func (c *invocationContext) Branch() string {
return c.branch
}

func (c *invocationContext) IsolationScope() string {
return c.isolationScope
}

func (c *invocationContext) UserContent() *genai.Content {
return c.userContent
}
Expand All @@ -420,6 +429,11 @@ func (c *invocationContext) WithContext(ctx context.Context) InvocationContext {
return &newCtx
}

// ResumedInput always returns (nil, false) for the base
// invocation context. Implementations that carry a resume payload
// override this method.
func (c *invocationContext) ResumedInput(string) (any, bool) { return nil, false }

func pluginManagerFromContext(ctx context.Context) pluginManager {
a := ctx.Value(plugincontext.PluginManagerCtxKey)
m, ok := a.(pluginManager)
Expand Down
Loading
Loading