Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion server/adka2a/v2/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,8 @@ func (e *Executor) writeFinalTaskStatus(
return
}
}
if partialReset != nil {
// Do not send artifacts for input-required tasks to maintain compatibility with adk-python/adk-web
if partialReset != nil && status.Status.State != a2a.TaskStateInputRequired {
if !yield(partialReset, nil) {
return
}
Expand Down
20 changes: 20 additions & 0 deletions server/adka2a/v2/input_required.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,26 @@ func (p *inputRequiredProcessor) process(ctx context.Context, event *session.Eve
ev := a2a.NewStatusUpdateEvent(p.reqCtx, a2a.TaskStateInputRequired, msg)
p.event = ev
}

// For input-required tasks, include remaining parts (like text messages) in the status message
// instead of sending them as artifacts, to maintain compatibility with adk-python/adk-web
if len(remainingParts) > 0 {
remainingA2AParts, err := p.convertParts(ctx, event, remainingParts, nil)
if err != nil {
return nil, fmt.Errorf("failed to convert remaining parts to A2A parts: %w", err)
}
p.event.Status.Message.Parts = append(p.event.Status.Message.Parts, remainingA2AParts...)
remainingParts = nil
}
} else if p.event != nil && len(remainingParts) > 0 {
// If we've already created an input-required event, add all subsequent parts to it
// instead of sending them as artifacts, to maintain compatibility with adk-python/adk-web
remainingA2AParts, err := p.convertParts(ctx, event, remainingParts, nil)
if err != nil {
return nil, fmt.Errorf("failed to convert parts to A2A parts: %w", err)
}
p.event.Status.Message.Parts = append(p.event.Status.Message.Parts, remainingA2AParts...)
remainingParts = nil
}

if len(remainingParts) == len(resp.Content.Parts) {
Expand Down
5 changes: 2 additions & 3 deletions server/adka2a/v2/processor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,9 +235,7 @@ func TestEventProcessor_Process(t *testing.T) {
LLMResponse: modelResponseFromParts(genai.NewPartFromText("This will take a while")),
},
},
processed: []*a2a.TaskArtifactUpdateEvent{
newNonPartialArtifactEvent(task, a2a.NewTextPart("This will take a while")),
},
processed: nil,

terminal: []a2a.Event{
newFinalStatusUpdate(task, a2a.TaskStateInputRequired, &a2a.Message{
Expand All @@ -249,6 +247,7 @@ func TestEventProcessor_Process(t *testing.T) {
p.SetMeta(a2aDataPartMetaLongRunningKey, true)
return p
}(),
a2a.NewTextPart("This will take a while"),
},
}),
},
Expand Down
Loading