Skip to content

Commit e45e3b8

Browse files
authored
Merge branch 'google:main' into skills-core
2 parents 332e5e2 + a386bed commit e45e3b8

File tree

58 files changed

+845
-3069
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+845
-3069
lines changed

server/adka2a/parts.go

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package adka2a
1616

1717
import (
18+
"bytes"
1819
"context"
1920
"encoding/base64"
2021
"encoding/json"
@@ -60,6 +61,18 @@ func IsPartialFlagSet(meta map[string]any) bool {
6061
return isSet
6162
}
6263

64+
func validateDataPartJSON(d *genai.Part) ([]byte, bool) {
65+
if d.InlineData == nil || d.InlineData.MIMEType != "text/plain" {
66+
return nil, false
67+
}
68+
if noPrefix, ok := bytes.CutPrefix(d.InlineData.Data, []byte("<json>")); ok {
69+
if result, ok := bytes.CutSuffix(noPrefix, []byte("</json>")); ok {
70+
return result, true
71+
}
72+
}
73+
return nil, false
74+
}
75+
6376
// ToA2APart converts the provided genai part to A2A equivalent. Long running tool IDs are used for attaching metadata to
6477
// the relevant data parts.
6578
func ToA2APart(part *genai.Part, longRunningToolIDs []string) (a2a.Part, error) {
@@ -81,6 +94,12 @@ func ToA2AParts(parts []*genai.Part, longRunningToolIDs []string) ([]a2a.Part, e
8194
r.Metadata = map[string]any{ToA2AMetaKey("thought"): true}
8295
}
8396
result[i] = r
97+
} else if jsonBytes, ok := validateDataPartJSON(part); ok {
98+
var data map[string]any
99+
if err := json.Unmarshal(jsonBytes, &data); err != nil {
100+
return nil, err
101+
}
102+
result[i] = a2a.DataPart{Data: data}
84103
} else if part.InlineData != nil || part.FileData != nil {
85104
r, err := toA2AFilePart(part)
86105
if err != nil {
@@ -308,13 +327,7 @@ func toGenAIFilePart(part a2a.FilePart) (*genai.Part, error) {
308327
}
309328

310329
func toGenAIDataPart(part a2a.DataPart) (*genai.Part, error) {
311-
if part.Metadata == nil {
312-
return toGenAITextPart(part)
313-
}
314-
adkMetaType, ok := part.Metadata[a2aDataPartMetaTypeKey]
315-
if !ok {
316-
return toGenAITextPart(part)
317-
}
330+
adkMetaType := part.Metadata[a2aDataPartMetaTypeKey]
318331

319332
bytes, err := json.Marshal(part.Data)
320333
if err != nil {
@@ -351,14 +364,13 @@ func toGenAIDataPart(part a2a.DataPart) (*genai.Part, error) {
351364
return &genai.Part{FunctionResponse: &val}, nil
352365

353366
default:
354-
return &genai.Part{Text: string(bytes)}, nil
355-
}
356-
}
357-
358-
func toGenAITextPart(part a2a.DataPart) (*genai.Part, error) {
359-
bytes, err := json.Marshal(part.Data)
360-
if err != nil {
361-
return nil, err
367+
var jsonData []byte
368+
prefix, suffix := []byte("<json>"), []byte("</json>")
369+
jsonData = make([]byte, 0, len(prefix)+len(bytes)+len(suffix))
370+
jsonData = append(jsonData, prefix...)
371+
jsonData = append(jsonData, bytes...)
372+
jsonData = append(jsonData, suffix...)
373+
374+
return &genai.Part{InlineData: &genai.Blob{Data: jsonData, MIMEType: "text/plain"}}, nil
362375
}
363-
return &genai.Part{Text: string(bytes)}, nil
364376
}

server/adka2a/parts_test.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -169,24 +169,23 @@ func TestPartsTwoWayConversion(t *testing.T) {
169169
}
170170
}
171171

172-
func TestPartsOneWayConversion(t *testing.T) {
173-
part := a2a.DataPart{Data: map[string]any{"arbitrary": "data"}}
174-
wantGenAI := &genai.Part{Text: `{"arbitrary":"data"}`}
172+
func TestPartsDataPartConversionRoundTrip(t *testing.T) {
173+
a2aPart := a2a.DataPart{Data: map[string]any{"arbitrary": "data"}}
174+
wantGenAI := &genai.Part{InlineData: &genai.Blob{Data: []byte("<json>{\"arbitrary\":\"data\"}</json>"), MIMEType: "text/plain"}}
175175

176-
gotGenAI, err := ToGenAIParts([]a2a.Part{part})
176+
gotGenAI, err := ToGenAIParts([]a2a.Part{a2aPart})
177177
if err != nil {
178178
t.Fatalf("toGenAI() error = %v, want nil", err)
179179
}
180180
if diff := cmp.Diff([]*genai.Part{wantGenAI}, gotGenAI); diff != "" {
181-
t.Fatalf("toGenAI() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", gotGenAI, part, diff)
181+
t.Fatalf("toGenAI() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", gotGenAI, a2aPart, diff)
182182
}
183183

184-
wantA2A := a2a.TextPart{Text: `{"arbitrary":"data"}`}
185-
gotA2A, err := ToA2AParts(gotGenAI, nil)
184+
gotbackA2A, err := ToA2AParts(gotGenAI, nil)
186185
if err != nil {
187186
t.Fatalf("toA2AParts() error = %v, want nil", err)
188187
}
189-
if diff := cmp.Diff([]a2a.Part{wantA2A}, gotA2A); diff != "" {
190-
t.Fatalf("toA2AParts() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", gotA2A, wantA2A, diff)
188+
if diff := cmp.Diff([]a2a.Part{a2aPart}, gotbackA2A); diff != "" {
189+
t.Fatalf("toA2AParts() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", gotbackA2A, a2aPart, diff)
191190
}
192191
}

0 commit comments

Comments
 (0)