Skip to content

Commit f14fe28

Browse files
committed
pkg/aflow: add agentic workflows
1 parent 610dec9 commit f14fe28

File tree

17 files changed

+1965
-13
lines changed

17 files changed

+1965
-13
lines changed

go.mod

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ require (
1010
cloud.google.com/go/logging v1.13.1
1111
cloud.google.com/go/profiler v0.4.3
1212
cloud.google.com/go/secretmanager v1.16.0
13-
cloud.google.com/go/spanner v1.82.0
13+
cloud.google.com/go/spanner v1.86.0
1414
cloud.google.com/go/storage v1.57.1
1515
github.com/VividCortex/gohistogram v1.0.0
1616
github.com/argoproj/argo-workflows/v3 v3.7.3
1717
github.com/golang-migrate/migrate/v4 v4.19.0
1818
github.com/google/flatbuffers v25.9.23+incompatible
1919
github.com/google/generative-ai-go v0.20.1
2020
github.com/google/go-cmp v0.7.0
21+
github.com/google/jsonschema-go v0.3.0
2122
github.com/google/uuid v1.6.0
2223
github.com/gorilla/handlers v1.5.2
2324
github.com/ianlancetaylor/demangle v0.0.0-20250628045327-2d64ad6b7ec5
@@ -32,9 +33,11 @@ require (
3233
golang.org/x/sync v0.17.0
3334
golang.org/x/sys v0.37.0
3435
golang.org/x/tools v0.38.0
36+
google.golang.org/adk v0.1.1-0.20251114033342-7a27c1678e2c
3537
google.golang.org/api v0.252.0
3638
google.golang.org/appengine/v2 v2.0.6
37-
google.golang.org/genproto v0.0.0-20250603155806-513f23925822
39+
google.golang.org/genai v1.32.0
40+
google.golang.org/genproto v0.0.0-20251014184007-4626949a642f
3841
google.golang.org/grpc v1.76.0
3942
google.golang.org/protobuf v1.36.10
4043
gopkg.in/yaml.v3 v3.0.1
@@ -172,6 +175,7 @@ require (
172175
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
173176
github.com/googleapis/gax-go/v2 v2.15.0 // indirect
174177
github.com/gordonklaus/ineffassign v0.1.0 // indirect
178+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
175179
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
176180
github.com/gostaticanalysis/comment v1.5.0 // indirect
177181
github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
@@ -268,7 +272,7 @@ require (
268272
github.com/spf13/afero v1.14.0 // indirect
269273
github.com/spf13/cast v1.9.2 // indirect
270274
github.com/spf13/cobra v1.9.1 // indirect
271-
github.com/spf13/pflag v1.0.7 // indirect
275+
github.com/spf13/pflag v1.0.10 // indirect
272276
github.com/spf13/viper v1.20.1 // indirect
273277
github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect
274278
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
@@ -336,6 +340,8 @@ require (
336340
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect
337341
mvdan.cc/gofumpt v0.8.0 // indirect
338342
mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect
343+
rsc.io/omap v1.2.0 // indirect
344+
rsc.io/ordered v1.1.1 // indirect
339345
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
340346
sigs.k8s.io/randfill v1.0.0 // indirect
341347
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
@@ -349,3 +355,5 @@ tool (
349355
github.com/vektra/mockery/v3
350356
golang.org/x/tools/cmd/stringer
351357
)
358+
359+
// replace google.golang.org/adk => /home/dvyukov/src/adk-go

go.sum

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOX
216216
cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M=
217217
cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0=
218218
cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8=
219-
cloud.google.com/go/datacatalog v1.26.0 h1:eFgygb3DTufTWWUB8ARk+dSuXz+aefNJXTlkWlQcWwE=
220-
cloud.google.com/go/datacatalog v1.26.0/go.mod h1:bLN2HLBAwB3kLTFT5ZKLHVPj/weNz6bR0c7nYp0LE14=
219+
cloud.google.com/go/datacatalog v1.26.1 h1:bCRKA8uSQN8wGW3Tw0gwko4E9a64GRmbW1nCblhgC2k=
220+
cloud.google.com/go/datacatalog v1.26.1/go.mod h1:2Qcq8vsHNxMDgjgadRFmFG47Y+uuIVsyEGUrlrKEdrg=
221221
cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM=
222222
cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ=
223223
cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE=
@@ -544,8 +544,8 @@ cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+
544544
cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=
545545
cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk=
546546
cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M=
547-
cloud.google.com/go/spanner v1.82.0 h1:w9uO8RqEoBooBLX4nqV1RtgudyU2ZX780KTLRgeVg60=
548-
cloud.google.com/go/spanner v1.82.0/go.mod h1:BzybQHFQ/NqGxvE/M+/iU29xgutJf7Q85/4U9RWMto0=
547+
cloud.google.com/go/spanner v1.86.0 h1:jlNWusBol1Jxa9PmYGknUBzLwvD1cebuEenzqebZ9xs=
548+
cloud.google.com/go/spanner v1.86.0/go.mod h1:bbwCXbM+zljwSPLZ44wZOdzcdmy89hbUGmM/r9sD0ws=
549549
cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
550550
cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
551551
cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
@@ -584,8 +584,8 @@ cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg
584584
cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y=
585585
cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA=
586586
cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk=
587-
cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4=
588-
cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI=
587+
cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U=
588+
cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s=
589589
cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs=
590590
cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg=
591591
cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0=
@@ -1033,6 +1033,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
10331033
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
10341034
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
10351035
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
1036+
github.com/google/jsonschema-go v0.3.0 h1:6AH2TxVNtk3IlvkkhjrtbUc4S8AvO0Xii0DxIygDg+Q=
1037+
github.com/google/jsonschema-go v0.3.0/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE=
10361038
github.com/google/keep-sorted v0.6.1 h1:LNEdDKYxoXOrn4ZXC+FdUfJCVbUjhb2QPIBs5XISXCI=
10371039
github.com/google/keep-sorted v0.6.1/go.mod h1:JYy9vljs7P8b3QdPOQkywA+4u36FUHwsNITZIpJyPkE=
10381040
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
@@ -1095,6 +1097,8 @@ github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5
10951097
github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0=
10961098
github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE=
10971099
github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w=
1100+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
1101+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
10981102
github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk=
10991103
github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc=
11001104
github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado=
@@ -1396,8 +1400,8 @@ github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
13961400
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
13971401
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
13981402
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
1399-
github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
1400-
github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
1403+
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
1404+
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
14011405
github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4=
14021406
github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4=
14031407
github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo=
@@ -1966,6 +1970,8 @@ gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6d
19661970
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
19671971
gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=
19681972
gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=
1973+
google.golang.org/adk v0.1.1-0.20251114033342-7a27c1678e2c h1:49dl4LZTVJdMqz+uT2kukwIgjcUKvGY3NriQDKRgjcI=
1974+
google.golang.org/adk v0.1.1-0.20251114033342-7a27c1678e2c/go.mod h1:NvtSLoNx7UzZIiUAI1KoJQLMmt9sG3oCgiCx1TLqKFw=
19691975
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
19701976
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
19711977
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -2034,6 +2040,8 @@ google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID
20342040
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
20352041
google.golang.org/appengine/v2 v2.0.6 h1:LvPZLGuchSBslPBp+LAhihBeGSiRh1myRoYK4NtuBIw=
20362042
google.golang.org/appengine/v2 v2.0.6/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI=
2043+
google.golang.org/genai v1.32.0 h1:kku/m3kWOncjnw8EIa2sgmrPLhaxFHaP+uqOq5ZckvI=
2044+
google.golang.org/genai v1.32.0/go.mod h1:7pAilaICJlQBonjKKJNhftDFv3SREhZcTe9F6nRcjbg=
20372045
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
20382046
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
20392047
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -2166,8 +2174,8 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl
21662174
google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
21672175
google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
21682176
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
2169-
google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4=
2170-
google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s=
2177+
google.golang.org/genproto v0.0.0-20251014184007-4626949a642f h1:vLd1CJuJOUgV6qijD7KT5Y2ZtC97ll4dxjTUappMnbo=
2178+
google.golang.org/genproto v0.0.0-20251014184007-4626949a642f/go.mod h1:PI3KrSadr00yqfv6UDvgZGFsmLqeRIwt8x4p5Oo7CdM=
21712179
google.golang.org/genproto/googleapis/api v0.0.0-20251014184007-4626949a642f h1:OiFuztEyBivVKDvguQJYWq1yDcfAHIID/FVrPR4oiI0=
21722180
google.golang.org/genproto/googleapis/api v0.0.0-20251014184007-4626949a642f/go.mod h1:kprOiu9Tr0JYyD6DORrc4Hfyk3RFXqkQ3ctHEum3ZbM=
21732181
google.golang.org/genproto/googleapis/rpc v0.0.0-20251014184007-4626949a642f h1:1FTH6cpXFsENbPR5Bu8NQddPSaUUE6NA2XdZdDSAJK4=
@@ -2312,6 +2320,10 @@ mvdan.cc/gofumpt v0.8.0/go.mod h1:vEYnSzyGPmjvFkqJWtXkh79UwPWP9/HMxQdGEXZHjpg=
23122320
mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 h1:WjUu4yQoT5BHT1w8Zu56SP8367OuBV5jvo+4Ulppyf8=
23132321
mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4/go.mod h1:rthT7OuvRbaGcd5ginj6dA2oLE7YNlta9qhBNNdCaLE=
23142322
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
2323+
rsc.io/omap v1.2.0 h1:c1M8jchnHbzmJALzGLclfH3xDWXrPxSUHXzH5C+8Kdw=
2324+
rsc.io/omap v1.2.0/go.mod h1:C8pkI0AWexHopQtZX+qiUeJGzvc8HkdgnsWK4/mAa00=
2325+
rsc.io/ordered v1.1.1 h1:1kZM6RkTmceJgsFH/8DLQvkCVEYomVDJfBRLT595Uak=
2326+
rsc.io/ordered v1.1.1/go.mod h1:evAi8739bWVBRG9aaufsjVc202+6okf8u2QeVL84BCM=
23152327
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
23162328
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
23172329
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

pkg/aflow/action.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// Copyright 2025 syzkaller project authors. All rights reserved.
2+
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
3+
4+
package aflow
5+
6+
import (
7+
"fmt"
8+
"maps"
9+
"slices"
10+
11+
"google.golang.org/adk/agent"
12+
"google.golang.org/adk/agent/workflowagents/sequentialagent"
13+
"google.golang.org/adk/model"
14+
"google.golang.org/genai"
15+
)
16+
17+
type Action interface {
18+
create(*createContext) (agent.Agent, error)
19+
verify(*verifyContext)
20+
}
21+
22+
type Pipeline struct {
23+
// For logging/debugging.
24+
Name string
25+
// These actions are invoked sequentially,
26+
// but dataflow across actions is specified by their use
27+
// of variables in args/instructions/prompts.
28+
Actions []Action
29+
}
30+
31+
type createContext struct {
32+
actions map[string]int
33+
llm model.LLM
34+
contentConfig *genai.GenerateContentConfig
35+
}
36+
37+
type verifyContext struct {
38+
state map[string]bool
39+
err error
40+
}
41+
42+
func (cctx *createContext) actionName(name, def string) string {
43+
if name == "" {
44+
name = def
45+
}
46+
cctx.actions[name]++
47+
if n := cctx.actions[name]; n != 1 {
48+
name = fmt.Sprintf("%v-%v", name, n)
49+
}
50+
return name
51+
}
52+
53+
func (vctx *verifyContext) errorf(who, msg string, args ...any) {
54+
if vctx.err == nil {
55+
vctx.err = fmt.Errorf(fmt.Sprintf("action %v: %v", who, msg), args...)
56+
}
57+
}
58+
59+
func (vctx *verifyContext) requireNotEmpty(who, name, value string) {
60+
if value == "" {
61+
vctx.errorf(who, "%v must not be empty", name)
62+
}
63+
}
64+
65+
func (vctx *verifyContext) requireInput(who, name string) {
66+
if !vctx.state[name] {
67+
vctx.errorf(who, "no input %v, available inputs: %v",
68+
name, slices.Collect(maps.Keys(vctx.state)))
69+
}
70+
}
71+
72+
func (vctx *verifyContext) provideOutput(who, name string, unique bool) {
73+
if unique && vctx.state[name] {
74+
vctx.errorf(who, "output %v is already set", name)
75+
}
76+
vctx.state[name] = true
77+
}
78+
79+
func (p *Pipeline) create(cctx *createContext) (agent.Agent, error) {
80+
var agents []agent.Agent
81+
for _, sub := range p.Actions {
82+
subAgent, err := sub.create(cctx)
83+
if err != nil {
84+
return nil, err
85+
}
86+
agents = append(agents, subAgent)
87+
}
88+
return sequentialagent.New(sequentialagent.Config{
89+
AgentConfig: agent.Config{
90+
Name: cctx.actionName(p.Name, "pipeline"),
91+
SubAgents: agents,
92+
},
93+
})
94+
}
95+
96+
func (p *Pipeline) verify(vctx *verifyContext) {
97+
for _, a := range p.Actions {
98+
a.verify(vctx)
99+
}
100+
}

0 commit comments

Comments
 (0)