From 9cec47f9a667d906c685277cfd8168851334668d Mon Sep 17 00:00:00 2001 From: Greg Furman Date: Fri, 19 Sep 2025 01:08:33 +0200 Subject: [PATCH 1/2] feat(processor/genkit): Add Genkit LLM processors --- go.mod | 118 ++++--- go.sum | 247 +++++++++------ internal/impl/genkit/anthropic_processor.go | 76 +++++ internal/impl/genkit/config.go | 189 +++++++++++ internal/impl/genkit/config_test.go | 77 +++++ internal/impl/genkit/convert.go | 171 ++++++++++ internal/impl/genkit/embed_processor.go | 113 +++++++ internal/impl/genkit/embed_processor_test.go | 29 ++ .../genkit/googlegenai_embed_processor.go | 87 +++++ internal/impl/genkit/googlegenai_processor.go | 111 +++++++ internal/impl/genkit/instance.go | 76 +++++ internal/impl/genkit/integration_test.go | 298 ++++++++++++++++++ .../impl/genkit/ollama_embed_processor.go | 93 ++++++ internal/impl/genkit/ollama_processor.go | 115 +++++++ .../impl/genkit/openai_embed_processor.go | 101 ++++++ internal/impl/genkit/openai_processor.go | 118 +++++++ internal/impl/genkit/processor.go | 180 +++++++++++ .../impl/genkit/vertexai_embed_processor.go | 99 ++++++ internal/impl/genkit/vertexai_processor.go | 122 +++++++ public/components/all/package.go | 1 + public/service/config_processor.go | 41 +++ public/service/resources.go | 4 + .../components/processors/genkit_anthropic.md | 218 +++++++++++++ .../processors/genkit_googlegenai.md | 212 +++++++++++++ .../processors/genkit_googlegenai_embed.md | 140 ++++++++ .../components/processors/genkit_ollama.md | 213 +++++++++++++ .../processors/genkit_ollama_embed.md | 130 ++++++++ .../components/processors/genkit_openai.md | 218 +++++++++++++ .../processors/genkit_openai_embed.md | 146 +++++++++ .../components/processors/genkit_vertexai.md | 210 ++++++++++++ .../processors/genkit_vertexai_embed.md | 138 ++++++++ .../components/processors/ollama_embed.md | 107 +++++++ 32 files changed, 4046 insertions(+), 152 deletions(-) create mode 100644 internal/impl/genkit/anthropic_processor.go create mode 100644 internal/impl/genkit/config.go create mode 100644 internal/impl/genkit/config_test.go create mode 100644 internal/impl/genkit/convert.go create mode 100644 internal/impl/genkit/embed_processor.go create mode 100644 internal/impl/genkit/embed_processor_test.go create mode 100644 internal/impl/genkit/googlegenai_embed_processor.go create mode 100644 internal/impl/genkit/googlegenai_processor.go create mode 100644 internal/impl/genkit/instance.go create mode 100644 internal/impl/genkit/integration_test.go create mode 100644 internal/impl/genkit/ollama_embed_processor.go create mode 100644 internal/impl/genkit/ollama_processor.go create mode 100644 internal/impl/genkit/openai_embed_processor.go create mode 100644 internal/impl/genkit/openai_processor.go create mode 100644 internal/impl/genkit/processor.go create mode 100644 internal/impl/genkit/vertexai_embed_processor.go create mode 100644 internal/impl/genkit/vertexai_processor.go create mode 100644 website/docs/components/processors/genkit_anthropic.md create mode 100644 website/docs/components/processors/genkit_googlegenai.md create mode 100644 website/docs/components/processors/genkit_googlegenai_embed.md create mode 100644 website/docs/components/processors/genkit_ollama.md create mode 100644 website/docs/components/processors/genkit_ollama_embed.md create mode 100644 website/docs/components/processors/genkit_openai.md create mode 100644 website/docs/components/processors/genkit_openai_embed.md create mode 100644 website/docs/components/processors/genkit_vertexai.md create mode 100644 website/docs/components/processors/genkit_vertexai_embed.md create mode 100644 website/docs/components/processors/ollama_embed.md diff --git a/go.mod b/go.mod index 997780254c..ed5695e842 100644 --- a/go.mod +++ b/go.mod @@ -5,20 +5,20 @@ replace github.com/99designs/keyring => github.com/Jeffail/keyring v1.2.3 require ( buf.build/gen/go/bufbuild/reflect/connectrpc/go v1.18.1-20240117202343-bf8f65e8876c.1 buf.build/gen/go/bufbuild/reflect/protocolbuffers/go v1.36.2-20240117202343-bf8f65e8876c.1 - cloud.google.com/go/bigquery v1.64.0 - cloud.google.com/go/pubsub v1.45.1 - cloud.google.com/go/storage v1.45.0 + cloud.google.com/go/bigquery v1.67.0 + cloud.google.com/go/pubsub v1.49.0 + cloud.google.com/go/storage v1.50.0 connectrpc.com/connect v1.18.1 cuelang.org/go v0.7.1 - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos v0.3.6 github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.1.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.1 github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue v1.0.0 github.com/Azure/go-amqp v1.0.5 github.com/ClickHouse/clickhouse-go/v2 v2.21.1 - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.21.0 + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.27.0 github.com/IBM/sarama v1.45.2 github.com/Jeffail/checkpoint v1.0.1 github.com/Jeffail/gabs/v2 v2.7.0 @@ -65,6 +65,7 @@ require ( github.com/eclipse/paho.mqtt.golang v1.4.3 github.com/elastic/go-elasticsearch/v9 v9.0.0 github.com/fatih/color v1.18.0 + github.com/firebase/genkit/go v1.0.3 github.com/fsnotify/fsnotify v1.9.0 github.com/generikvault/gvalstrings v0.0.0-20180926130504-471f38f0112a github.com/getsentry/sentry-go v0.27.0 @@ -74,6 +75,7 @@ require ( github.com/gocql/gocql v1.6.0 github.com/gofrs/uuid v4.4.0+incompatible github.com/golang-jwt/jwt/v5 v5.2.2 + github.com/google/dotprompt/go v0.0.0-20250915193815-dfe0abbaa54f github.com/google/go-cmp v0.7.0 github.com/googleapis/go-sql-spanner v1.7.4 github.com/gorilla/handlers v1.5.2 @@ -84,6 +86,7 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/influxdata/go-syslog/v3 v3.0.0 github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c + github.com/invopop/jsonschema v0.13.0 github.com/itchyny/gojq v0.12.16 github.com/itchyny/timefmt-go v0.1.6 github.com/jackc/pgconn v1.14.3 @@ -106,6 +109,8 @@ require ( github.com/nsqio/go-nsq v1.1.0 github.com/oklog/ulid v1.3.1 github.com/olivere/elastic/v7 v7.0.32 + github.com/ollama/ollama v0.11.11 + github.com/openai/openai-go v1.12.0 github.com/opensearch-project/opensearch-go/v4 v4.5.0 github.com/ory/dockertest/v3 v3.10.0 github.com/oschwald/geoip2-golang v1.9.0 @@ -146,23 +151,24 @@ require ( github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 go.etcd.io/etcd/api/v3 v3.5.16 go.etcd.io/etcd/client/v3 v3.5.16 - go.mongodb.org/mongo-driver v1.13.4 + go.mongodb.org/mongo-driver v1.14.0 go.nanomsg.org/mangos/v3 v3.4.2 - go.opentelemetry.io/otel v1.35.0 + go.opentelemetry.io/otel v1.36.0 go.opentelemetry.io/otel/exporters/jaeger v1.17.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.23.1 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1 - go.opentelemetry.io/otel/sdk v1.32.0 - go.opentelemetry.io/otel/trace v1.35.0 + go.opentelemetry.io/otel/sdk v1.36.0 + go.opentelemetry.io/otel/trace v1.36.0 go.uber.org/multierr v1.11.0 golang.org/x/crypto v0.40.0 golang.org/x/net v0.42.0 - golang.org/x/oauth2 v0.27.0 + golang.org/x/oauth2 v0.30.0 golang.org/x/sync v0.16.0 golang.org/x/text v0.27.0 - google.golang.org/api v0.203.0 - google.golang.org/grpc v1.70.0 + google.golang.org/api v0.236.0 + google.golang.org/genai v1.25.0 + google.golang.org/grpc v1.73.0 google.golang.org/protobuf v1.36.6 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v3 v3.0.1 @@ -171,13 +177,18 @@ require ( require ( github.com/BurntSushi/toml v1.5.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.3 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.52.0 // indirect github.com/apache/arrow-go/v18 v18.0.0 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/buger/jsonparser v1.1.1 // indirect github.com/daulet/tokenizers v1.22.1 // indirect github.com/elastic/elastic-transport-go/v8 v8.7.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect github.com/go-errors/errors v1.5.1 // indirect + github.com/go-jose/go-jose/v4 v4.1.0 // indirect github.com/go-zeromq/goczmq/v4 v4.2.2 // indirect + github.com/goccy/go-yaml v1.17.1 // indirect github.com/gofrs/flock v0.12.1 // indirect github.com/gomlx/exceptions v0.0.3 // indirect github.com/gomlx/go-huggingface v0.2.2 // indirect @@ -186,12 +197,21 @@ require ( github.com/gomlx/onnx-gomlx v0.2.4 // indirect github.com/hamba/avro/v2 v2.26.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/mbleigh/raymond v0.0.0-20250414171441-6b3a58ab9e0a // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tidwall/sjson v1.2.5 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/yalue/onnxruntime_go v1.21.0 // indirect + github.com/yosida95/uritemplate/v3 v3.0.2 // indirect + github.com/zeebo/errs v1.4.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect golang.org/x/exp v0.0.0-20250717185816-542afb5b7346 // indirect k8s.io/klog/v2 v2.130.1 // indirect @@ -206,29 +226,29 @@ require ( ) require ( - cel.dev/expr v0.19.0 // indirect - cloud.google.com/go v0.116.0 // indirect - cloud.google.com/go/auth v0.9.9 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect - cloud.google.com/go/compute/metadata v0.5.2 // indirect - cloud.google.com/go/iam v1.2.2 // indirect - cloud.google.com/go/longrunning v0.6.2 // indirect - cloud.google.com/go/monitoring v1.21.2 // indirect - cloud.google.com/go/spanner v1.71.0 // indirect - cloud.google.com/go/trace v1.11.2 // indirect + cel.dev/expr v0.23.0 // indirect + cloud.google.com/go v0.120.0 // indirect + cloud.google.com/go/auth v0.16.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/longrunning v0.6.7 // indirect + cloud.google.com/go/monitoring v1.24.2 // indirect + cloud.google.com/go/spanner v1.80.0 // indirect + cloud.google.com/go/trace v1.11.6 // indirect dario.cat/mergo v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect github.com/AthenZ/athenz v1.10.62 // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.3 // indirect github.com/ClickHouse/ch-go v0.61.5 // indirect github.com/DataDog/zstd v1.5.6 // indirect github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.3 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.52.0 // indirect github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect @@ -267,9 +287,8 @@ require ( github.com/btnguyen2k/consu/reddo v0.1.9 // indirect github.com/btnguyen2k/consu/semita v0.1.5 // indirect github.com/bufbuild/protocompile v0.8.0 // indirect - github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect + github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f // indirect github.com/cockroachdb/apd/v3 v3.2.1 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/coreos/go-semver v0.3.1 // indirect @@ -280,7 +299,7 @@ require ( github.com/couchbaselabs/gocbconnstr/v2 v2.0.0-20240607131231-fb385523de28 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/danieljoos/wincred v1.2.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dlclark/regexp2 v1.11.4 // indirect github.com/docker/cli v25.0.3+incompatible // indirect @@ -291,8 +310,7 @@ require ( github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/envoyproxy/go-control-plane v0.13.1 // indirect - github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/gabriel-vasile/mimetype v1.4.7 // indirect github.com/go-faster/city v1.0.1 // indirect @@ -304,17 +322,17 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect - github.com/golang/glog v1.2.3 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/glog v1.2.4 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/flatbuffers v24.12.23+incompatible // indirect github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 // indirect - github.com/google/s2a-go v0.1.8 // indirect + github.com/google/s2a-go v0.1.9 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.13.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect + github.com/googleapis/gax-go/v2 v2.14.2 // indirect github.com/gorilla/css v1.0.1 // indirect github.com/gosimple/unidecode v1.0.1 // indirect github.com/govalues/decimal v0.1.32 // indirect @@ -344,7 +362,7 @@ require ( github.com/kylelemons/godebug v1.1.0 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect @@ -366,7 +384,7 @@ require ( github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect @@ -392,23 +410,23 @@ require ( go.etcd.io/bbolt v1.3.10 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.32.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel/metric v1.36.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/mod v0.26.0 // indirect golang.org/x/sys v0.34.0 // indirect golang.org/x/term v0.33.0 // indirect - golang.org/x/time v0.9.0 // indirect + golang.org/x/time v0.12.0 // indirect golang.org/x/tools v0.35.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/genproto v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 // indirect + google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect gopkg.in/jcmturner/dnsutils.v1 v1.0.1 // indirect @@ -422,7 +440,9 @@ require ( modernc.org/token v1.1.0 // indirect ) -go 1.24 +go 1.24.1 + +toolchain go1.24.2 // This (indirect) dependency is needed for github.com/AthenZ/athenz but the domain no longer resolves. // Remove once upstream issue fixed. See: https://github.com/AthenZ/athenz/issues/2842 diff --git a/go.sum b/go.sum index 24564b4269..40606c1d7c 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ buf.build/gen/go/bufbuild/reflect/connectrpc/go v1.18.1-20240117202343-bf8f65e88 buf.build/gen/go/bufbuild/reflect/connectrpc/go v1.18.1-20240117202343-bf8f65e8876c.1/go.mod h1:tM/OH72d+hwRXLM6xJwGPhmStju+bA2dLNi19sVLed8= buf.build/gen/go/bufbuild/reflect/protocolbuffers/go v1.36.2-20240117202343-bf8f65e8876c.1 h1:JKrlFWFhpJDBl41n4ApGdHVVYHUxUL/KwWPxixTc6so= buf.build/gen/go/bufbuild/reflect/protocolbuffers/go v1.36.2-20240117202343-bf8f65e8876c.1/go.mod h1:6Papc3twYJvx/6kBz9THFiGCeW6lG/uP0awNqQsBHQc= -cel.dev/expr v0.19.0 h1:lXuo+nDhpyJSpWxpPVi5cPUwzKb+dsdOiw6IreM5yt0= -cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= +cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -44,8 +44,8 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= -cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= +cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= @@ -107,10 +107,10 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.9.9 h1:BmtbpNQozo8ZwW2t7QJjnrQtdganSdmqeIBxHxNkEZQ= -cloud.google.com/go/auth v0.9.9/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= -cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= -cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go/auth v0.16.2 h1:QvBAGFPLrDeoiNjyfVunhQ10HKNYuOwZ5noee0M5df4= +cloud.google.com/go/auth v0.16.2/go.mod h1:sRBas2Y1fB1vZTdurouM0AzuYQBMZinrUYL8EufhtEA= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= @@ -139,8 +139,8 @@ cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/Zur cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/bigquery v1.64.0 h1:vSSZisNyhr2ioJE1OuYBQrnrpB7pIhRQm4jfjc7E/js= -cloud.google.com/go/bigquery v1.64.0/go.mod h1:gy8Ooz6HF7QmA+TRtX8tZmXBKH5mCFBwUApGAb3zI7Y= +cloud.google.com/go/bigquery v1.67.0 h1:GXleMyn/cu5+DPLy9Rz5f5IULWTLrepwbQnP/5qrVbY= +cloud.google.com/go/bigquery v1.67.0/go.mod h1:HQeP1AHFuAz0Y55heDSb0cjZIhnEkuwFRBGo6EEKHug= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= @@ -193,8 +193,8 @@ cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZ cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= -cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= @@ -215,8 +215,8 @@ cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOX cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/datacatalog v1.22.2 h1:9Bi8YO+WBE0YSSQL1tX62Gy/KcdNGLufyVlEJ0eYMrc= -cloud.google.com/go/datacatalog v1.22.2/go.mod h1:9Wamq8TDfL2680Sav7q3zEhBJSPBrDxJU8WtPJ25dBM= +cloud.google.com/go/datacatalog v1.26.0 h1:eFgygb3DTufTWWUB8ARk+dSuXz+aefNJXTlkWlQcWwE= +cloud.google.com/go/datacatalog v1.26.0/go.mod h1:bLN2HLBAwB3kLTFT5ZKLHVPj/weNz6bR0c7nYp0LE14= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= @@ -332,8 +332,8 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= -cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= @@ -354,8 +354,8 @@ cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4 cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.20.1 h1:og29Wv59uf2FVaZlesaiDAqHFzHaoUyHI3HYp9VUHVg= -cloud.google.com/go/kms v1.20.1/go.mod h1:LywpNiVCvzYNJWS9JUcGJSVTNSwPwi0vBAotzDqn2nc= +cloud.google.com/go/kms v1.21.2 h1:c/PRUSMNQ8zXrc1sdAUnsenWWaNXN+PzTXfXOcSFdoE= +cloud.google.com/go/kms v1.21.2/go.mod h1:8wkMtHV/9Z8mLXEXr1GK7xPSBdi6knuLXIhqjuWcI6w= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= @@ -366,13 +366,13 @@ cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6 cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= -cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= +cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= +cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= -cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= @@ -398,8 +398,8 @@ cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhI cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= -cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= @@ -458,8 +458,8 @@ cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcd cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.45.1 h1:ZC/UzYcrmK12THWn1P72z+Pnp2vu/zCZRXyhAfP1hJY= -cloud.google.com/go/pubsub v1.45.1/go.mod h1:3bn7fTmzZFwaUjllitv1WlsNMkqBgGUb3UdMhI54eCc= +cloud.google.com/go/pubsub v1.49.0 h1:5054IkbslnrMCgA2MAEPcsN3Ky+AyMpEZcii/DoySPo= +cloud.google.com/go/pubsub v1.49.0/go.mod h1:K1FswTWP+C1tI/nfi3HQecoVeFvL4HUOB1tdaNXKhUY= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= @@ -550,8 +550,8 @@ cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+ cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.71.0 h1:Gl4eX16JEvqlm3yvZ2lKENaQ6FvCkM3YZfO/Hq8OqZU= -cloud.google.com/go/spanner v1.71.0/go.mod h1:mw98ua5ggQXVWwp83yjwggqEmW9t8rjs9Po1ohcUGW4= +cloud.google.com/go/spanner v1.80.0 h1:4B2hoN1TF0qghiK7CYjYzjRt0/EEacIlS/UJl0k2hKA= +cloud.google.com/go/spanner v1.80.0/go.mod h1:XQWUqx9r8Giw6gNh0Gu8xYfz7O+dAKouAkFCxG/mZC8= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= @@ -571,8 +571,8 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.45.0 h1:5av0QcIVj77t+44mV4gffFC/LscFRUhto6UBMB5SimM= -cloud.google.com/go/storage v1.45.0/go.mod h1:wpPblkIuMP5jCB/E48Pz9zIo2S/zD8g+ITmxKkPCITE= +cloud.google.com/go/storage v1.50.0 h1:3TbVkzTooBvnZsk7WaAQfOsNrdoM8QHusXA1cpk6QJs= +cloud.google.com/go/storage v1.50.0/go.mod h1:l7XeiD//vx5lfqE3RavfmU9yvk5Pp0Zhcv482poyafY= cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= @@ -594,8 +594,8 @@ cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= -cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= @@ -670,13 +670,13 @@ github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9mo github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos v0.3.6 h1:oBqQLSI1pZwGOdXJAoJJSzmff9tlfD4KroVfjQQmd0g= github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos v0.3.6/go.mod h1:Beh5cHIXJ0oWEDWk9lNFtuklCojLLQ5hl+LqSNTTs0I= github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.1.0 h1:ONYihl/vbwtVAmEmqoVDCGyhad2CIMN2kg3BO8Y5cFk= @@ -684,8 +684,8 @@ github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.1.0/go.mod h1:PMB5kQ1apg/ github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= @@ -739,16 +739,16 @@ github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwS github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2 h1:DBjmt6/otSdULyJdVg2BlG0qGZO5tKL4VzOs0jpvw5Q= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.3 h1:xir5X8TS8UBVPWg2jHL+cSTf0jZgqYQSA54TscSt1/0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.3/go.mod h1:SsdWig2J5PMnfMvfJuEb1uZa8Y+kvNyvrULFo69gTFk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.21.0 h1:OEgjQy1rH4Fbn5IpuI9d0uhLl+j6DkDvh9Q2Ucd6GK8= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.21.0/go.mod h1:EUfJ8lb3pjD8VasPPwqIvG2XVCE6DOT8tY5tcwbWA+A= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.3 h1:Nl7phYyHjnqofWDpD+6FYdiwtNIxebn0AHLry7Sxb0M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.3/go.mod h1:pNP/L2wDlaQnQlFvkDKGSruDoYRpmAxB6drgsskfYwg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.3 h1:2vcVkrNdSMJpoOVAWi9ApsQR5iqNeFGt5Qx8Xlt3IoI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.3/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.52.0 h1:QFgWzcdmJlgEAwJz/zePYVJQxfoJGRtgIqZfIUFg5oQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.52.0/go.mod h1:ayYHuYU7iNcNtEs1K9k6D/Bju7u1VEHMQm5qQ1n3GtM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.27.0 h1:Jtr816GUk6+I2ox9L/v+VcOwN6IyGOEDTSNHfD6m9sY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.27.0/go.mod h1:E05RN++yLx9W4fXPtX978OLo9P0+fBacauUdET1BckA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.52.0 h1:0l8ynskVvq1dvIn5vJbFMf/a/3TqFpRmCMrruFbzlvk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.52.0/go.mod h1:f/ad5NuHnYz8AOZGuR0cY+l36oSCstdxD73YlIchr6I= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.52.0 h1:wbMd4eG/fOhsCa6+IP8uEDvWF5vl7rNoUWmP5f72Tbs= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.52.0/go.mod h1:gdIm9TxRk5soClCwuB0FtdXsbqtw0aqPwBEurK9tPkw= github.com/IBM/sarama v1.45.2 h1:8m8LcMCu3REcwpa7fCP6v2fuPuzVwXDAM2DOv3CBrKw= github.com/IBM/sarama v1.45.2/go.mod h1:ppaoTcVdGv186/z6MEKsMm70A5fwJfRTpstI37kVn3Y= github.com/Jeffail/checkpoint v1.0.1 h1:kE7cXqRxpYJrGjVR4Sg9gLm9XmhEqX5hLK9hCVRoKpI= @@ -944,6 +944,8 @@ github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiE github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beanstalkd/go-beanstalk v0.2.0 h1:6UOJugnu47uNB2jJO/lxyDgeD1Yds7owYi1USELqexA= github.com/beanstalkd/go-beanstalk v0.2.0/go.mod h1:/G8YTyChOtpOArwLTQPY1CHB+i212+av35bkPXXj56Y= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -988,6 +990,8 @@ github.com/bufbuild/protocompile v0.8.0 h1:9Kp1q6OkS9L4nM3FYbr8vlJnEwtbpDPQlQOVX github.com/bufbuild/protocompile v0.8.0/go.mod h1:+Etjg4guZoAqzVk2czwEQP12yaxLJ8DxuqCJ9qHdH94= github.com/bufbuild/prototransform v0.4.0 h1:XqKyJiughXy7PKSHgaLI8O7xQLkhNL+gnyke4wr/daI= github.com/bufbuild/prototransform v0.4.0/go.mod h1:M8jLwHlEZCGTLBWu4YxwkOjAUQSOjk0RtkbF0EWRZ2w= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY= github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= @@ -996,7 +1000,6 @@ github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqy github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -1035,8 +1038,8 @@ github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= +github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= @@ -1083,8 +1086,9 @@ github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7 github.com/daulet/tokenizers v1.22.1 h1:3wzAFIxfgRuqGKka8xdkeTbctDmmqOOs12GofqdorpM= github.com/daulet/tokenizers v1.22.1/go.mod h1:tGnMdZthXdcWY6DGD07IygpwJqiPvG85FQUnhs/wSCs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= github.com/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw= github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo= @@ -1153,20 +1157,26 @@ github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPO github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= -github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE= -github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= +github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= -github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/firebase/genkit/go v1.0.3 h1:pvngXYcjVXoTulZpKqW+IASS376rAhFIgnTX2bzCHcw= +github.com/firebase/genkit/go v1.0.3/go.mod h1:GabAxvHNs9ZSvmaK5bfZe2NkTsGP544/baVFegXq4aU= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -1207,6 +1217,8 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY= +github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -1255,6 +1267,8 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-yaml v1.17.1 h1:LI34wktB2xEE3ONG/2Ar54+/HJVBriAGJ55PHls4YuY= +github.com/goccy/go-yaml v1.17.1/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -1285,13 +1299,14 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= -github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= +github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -1300,8 +1315,9 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -1341,6 +1357,8 @@ github.com/gomlx/onnx-gomlx v0.2.4/go.mod h1:mBFZF1OT5hW/jsc0ae58VKoB9BaGYpEaZ36 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/dotprompt/go v0.0.0-20250915193815-dfe0abbaa54f h1:OI9f1H2YiXHDjfD5izBEfekbCZyO1fRfQDwe7AyAxaQ= +github.com/google/dotprompt/go v0.0.0-20250915193815-dfe0abbaa54f/go.mod h1:k8cjJAQWc//ac/bMnzItyOFbfT01tgRTZGgxELCuxEQ= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= @@ -1396,8 +1414,8 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs= github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= -github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= @@ -1413,8 +1431,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -1426,8 +1444,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= +github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/googleapis/go-sql-spanner v1.7.4 h1:pwndJlqgIMOewkORveYQQocaSyOGqaQg8e2Os8hYh00= @@ -1509,6 +1527,8 @@ github.com/influxdata/go-syslog/v3 v3.0.0 h1:jichmjSZlYK0VMmlz+k4WeOQd7z745YLsvG github.com/influxdata/go-syslog/v3 v3.0.0/go.mod h1:tulsOp+CecTAYC27u9miMgq21GqXRW6VdKbOG+QSP4Q= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/itchyny/gojq v0.12.16 h1:yLfgLxhIr/6sJNVmYfQjTIv0jGctu6/DgDoivmxTr7g= github.com/itchyny/gojq v0.12.16/go.mod h1:6abHbdC2uB9ogMS38XsErnfqJ94UlngIJGlRAIj4jTM= github.com/itchyny/timefmt-go v0.1.6 h1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q= @@ -1677,8 +1697,8 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= github.com/matoous/go-nanoid/v2 v2.0.0 h1:d19kur2QuLeHmJBkvYkFdhFBzLoo1XVm2GgTpL+9Tj0= github.com/matoous/go-nanoid/v2 v2.0.0/go.mod h1:FtS4aGPVfEkxKxhdWPAspZpZSh1cOjtM7Ej/So3hR0g= @@ -1703,6 +1723,8 @@ github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4 github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mbleigh/raymond v0.0.0-20250414171441-6b3a58ab9e0a h1:v2cBA3xWKv2cIOVhnzX/gNgkNXqiHfUgJtA3r61Hf7A= +github.com/mbleigh/raymond v0.0.0-20250414171441-6b3a58ab9e0a/go.mod h1:Y6ghKH+ZijXn5d9E7qGGZBmjitx7iitZdQiIW97EpTU= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/microsoft/gocosmos v1.1.1 h1:zJUelhWCm9yvHxiHRuPSY+9loQcGi+tYS7gcOIt8yGw= @@ -1804,6 +1826,8 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E= github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k= +github.com/ollama/ollama v0.11.11 h1:mErMiUGclp47rCDbSUmBiY2L76EpT0uIYRZVBO6qg/k= +github.com/ollama/ollama v0.11.11/go.mod h1:9+1//yWPsDE2u+l1a5mpaKrYw4VdnSsRU3ioq5BvMms= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= @@ -1815,6 +1839,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.35.0 h1:xuM1M/UvMp9BCdS4hojhS9/4jEuVqS9Er3bqupeaoPM= github.com/onsi/gomega v1.35.0/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/openai/openai-go v1.12.0 h1:NBQCnXzqOTv5wsgNC36PrFEiskGfO5wccfCWDo9S1U0= +github.com/openai/openai-go v1.12.0/go.mod h1:g461MYGXEXBVdV5SaR/5tNzNbSfwTBBefwc+LlDCK0Y= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -1867,8 +1893,9 @@ github.com/pkg/sftp v1.13.7 h1:uv+I3nNJvlKZIQGSr8JVQLNHFU9YhhNpvC14Y6KgmSM= github.com/pkg/sftp v1.13.7/go.mod h1:KMKI0t3T6hfA+lTR/ssZdunHo+uwq7ghoN09/FSu3DY= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -1983,6 +2010,8 @@ github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY52 github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= +github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/quantile v0.0.0-20220407130108-4246515d968d h1:X4+kt6zM/OVO6gbJdAfJR60MGPsqCzbtXNnjoGqdfAs= github.com/streadway/quantile v0.0.0-20220407130108-4246515d968d/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= @@ -2019,11 +2048,13 @@ github.com/tetratelabs/wazero v1.6.0 h1:z0H1iikCdP8t+q341xqepY4EWvHEw8Es7tlqiVzl github.com/tetratelabs/wazero v1.6.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= @@ -2060,6 +2091,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/wI2L/jsondiff v0.7.0 h1:1lH1G37GhBPqCfp/lrs91rf/2j3DktX6qYAKZkLuCQQ= github.com/wI2L/jsondiff v0.7.0/go.mod h1:KAEIojdQq66oJiHhDyQez2x+sRit0vIzC9KeK0yizxM= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -2092,6 +2125,8 @@ github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZ github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yalue/onnxruntime_go v1.21.0 h1:DdtvfY7OP5gR8mwPDqAOAQckf+KcI30hPNJL8hQaYWI= github.com/yalue/onnxruntime_go v1.21.0/go.mod h1:b4X26A8pekNb1ACJ58wAXgNKeUCGEAQ9dmACut9Sm/4= +github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= +github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= @@ -2106,11 +2141,13 @@ github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFi github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= +github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.einride.tech/aip v0.68.0 h1:4seM66oLzTpz50u4K1zlJyOXQ3tCzcJN7I22tKkjipw= -go.einride.tech/aip v0.68.0/go.mod h1:7y9FF8VtPWqpxuAxl0KQWqaULxW4zFIesD6zF5RIHHg= +go.einride.tech/aip v0.68.1 h1:16/AfSxcQISGN5z9C5lM+0mLYXihrHbQ1onvYTr93aQ= +go.einride.tech/aip v0.68.1/go.mod h1:XaFtaj4HuA3Zwk9xoBtTWgNubZ0ZZXv9BZJCkuKuWbg= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= @@ -2121,8 +2158,8 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiD go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE= go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.mongodb.org/mongo-driver v1.13.4 h1:2jXEpF+3m4QyAtm2DuzfTXg8ivGfSJUsxblmwz/8Mr0= -go.mongodb.org/mongo-driver v1.13.4/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= +go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= +go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= go.nanomsg.org/mangos/v3 v3.4.2 h1:gHlopxjWvJcVCcUilQIsRQk9jdj6/HB7wrTiUN8Ki7Q= go.nanomsg.org/mangos/v3 v3.4.2/go.mod h1:8+hjBMQub6HvXmuGvIq6hf19uxGQIjCofmc62lbedLA= go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= @@ -2137,14 +2174,14 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/detectors/gcp v1.32.0 h1:P78qWqkLSShicHmAzfECaTgvslqHxblNE9j62Ws1NK8= -go.opentelemetry.io/contrib/detectors/gcp v1.32.0/go.mod h1:TVqo0Sda4Cv8gCIixd7LuLwW4EylumVWfhjZJjDD4DU= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1 h1:o8iWeVFa1BcLtVEV0LzrCxV2/55tB3xLxADr6Kyoey4= @@ -2153,14 +2190,16 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.23.1 h1:p3A5+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.23.1/go.mod h1:OClrnXUjBqQbInvjJFjYSnMxBSCXBF8r3b34WqjiIrQ= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1 h1:cfuy3bXmLJS7M1RZmAL6SuhGtKUp2KEsrm00OlAXkq4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1/go.mod h1:22jr92C6KwlwItJmQzfixzQM3oyyuYLCfHiMY+rpsPU= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= -go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= -go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= -go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -2401,8 +2440,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2579,8 +2618,8 @@ golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= -golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2746,8 +2785,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.203.0 h1:SrEeuwU3S11Wlscsn+LA1kb/Y5xT8uggJSkIhD08NAU= -google.golang.org/api v0.203.0/go.mod h1:BuOVyCSYEPwJb3npWvDnNmFI92f3GeRnHNkETneT3SI= +google.golang.org/api v0.236.0 h1:CAiEiDVtO4D/Qja2IA9VzlFrgPnK3XVMmRoJZlSWbc0= +google.golang.org/api v0.236.0/go.mod h1:X1WF9CU2oTc+Jml1tiIxGmWFK/UZezdqEu09gcxZAj4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2755,6 +2794,8 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genai v1.25.0 h1:Cpyh2nmEoOS1eM3mT9XKuA/qWTEDoktfP2gsN3EduPE= +google.golang.org/genai v1.25.0/go.mod h1:OClfdf+r5aaD+sCd4aUSkPzJItmg2wD/WON9lQnRPaY= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2908,12 +2949,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20241104194629-dd2ea8efbc28 h1:KJjNNclfpIkVqrZlTWcgOOaVQ00LdBnoEaRfkUx760s= -google.golang.org/genproto v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:mt9/MofW7AWQ+Gy179ChOnvmJatV8YHUmrcedo9CIFI= -google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a h1:OAiGFfOiA0v9MRYsSidp3ubZaBnteRUyn3xB2ZQ5G/E= -google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 h1:J1H9f+LEdWAfHcez/4cvaVBox7cOYT+IU6rgqj5x++8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 h1:1tXaIXCracvtsRxSBsYDiSBN0cuJvM7QYW+MrpIRY78= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk= +google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a h1:SGktgSolFCo75dnHJF2yMvnns6jCmHFJ0vE4Vn2JKvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -2957,8 +2998,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= -google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= +google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/internal/impl/genkit/anthropic_processor.go b/internal/impl/genkit/anthropic_processor.go new file mode 100644 index 0000000000..70615fb38e --- /dev/null +++ b/internal/impl/genkit/anthropic_processor.go @@ -0,0 +1,76 @@ +package genkit + +import ( + oai "github.com/firebase/genkit/go/plugins/compat_oai/anthropic" + "github.com/openai/openai-go/option" + "github.com/warpstreamlabs/bento/public/service" +) + +func anthropicCompatibleSpec() *service.ConfigSpec { + return service.NewConfigSpec(). + Beta(). + Categories("AI", "Genkit"). + Summary("Generates content using Anthropic models."). + Description("Generates text content using Anthropic models through the Genkit framework. Supports Claude models with advanced reasoning capabilities. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit."). + Fields( + service.NewURLField(addressField).Description("Server address of Anthropic API.").Optional(), + service.NewStringField(apiKeyField).Description("Anthropic API key.").Secret().Examples("${ANTHROPIC_API_KEY}"), + ).Fields( + commonGenerateFields()..., + ). + Example("Chat Completion with Anthropic", ` +Generate text using Anthropic's Claude models: + +`+"```yaml"+` +pipeline: + processors: + - genkit_anthropic: + api_key: "${ANTHROPIC_API_KEY}" + model: "claude-3-5-haiku-20241022" + config: + temperature: 0.7 + max_output_tokens: 256 + prompt: | + {{role "system"}} + You are a helpful assistant. + {{role "user"}} + ${! content() } +`+"```"+``, "") +} + +func init() { + err := service.RegisterProcessor( + "genkit_anthropic", anthropicCompatibleSpec(), + func(conf *service.ParsedConfig, res *service.Resources) (service.Processor, error) { + plugin, err := newAnthropicPlugin(conf) + if err != nil { + return nil, err + } + + return newOpenAIProcessor(conf, res, plugin) + }) + if err != nil { + panic(err) + } +} + +func newAnthropicPlugin(pconf *service.ParsedConfig) (*oai.Anthropic, error) { + var opts []option.RequestOption + if pconf.Contains(addressField) { + addr, err := pconf.FieldURL(addressField) + if err != nil { + return nil, err + } + opts = append(opts, option.WithBaseURL(addr.Host)) + } + + apiKey, err := pconf.FieldString(apiKeyField) + if err != nil { + return nil, err + } + opts = append(opts, option.WithAPIKey(apiKey)) + + return &oai.Anthropic{ + Opts: opts, + }, nil +} diff --git a/internal/impl/genkit/config.go b/internal/impl/genkit/config.go new file mode 100644 index 0000000000..77773a06d7 --- /dev/null +++ b/internal/impl/genkit/config.go @@ -0,0 +1,189 @@ +package genkit + +import ( + "encoding/json" + + "github.com/firebase/genkit/go/ai" + "github.com/google/dotprompt/go/dotprompt" + "github.com/invopop/jsonschema" + "github.com/warpstreamlabs/bento/public/service" +) + +const ( + modelField = "model" + configField = "config" + promptField = "prompt" + addressField = "address" + + // Config section fields (genkit/dotprompt naming is pascal-case) + maxOutputTokensField = "max_output_tokens" + stopSequencesField = "stop_sequences" + temperatureField = "temperature" + topKField = "top_k" + topPField = "top_p" + + toolsField = "tools" + + outputField = "output" + outputSchemaField = "schema" + outputFormatField = "format" + outputInstructionField = "instructions" + + apiKeyField = "api_key" +) + +func commonEmbedFields() []*service.ConfigField { + return []*service.ConfigField{ + service.NewStringField(modelField).Description("Model identifier."), + service.NewObjectField(configField, + service.NewIntField(maxOutputTokensField). + Description("Maximum tokens the model can output."). + Optional(), + service.NewStringListField(stopSequencesField). + Description("List of stop sequences."). + Optional(), + service.NewFloatField(temperatureField). + Description("Controls randomness (0.0 to 1.0)."). + Optional(), + service.NewIntField(topKField). + Description("Top-K sampling parameter."). + Optional(), + service.NewFloatField(topPField). + Description("Top-P sampling parameter."). + Optional(), + ).Description("Model configuration matching common Genkit parameters.").Optional(), + service.NewInterpolatedStringField(promptField). + Description("Prompt template. use bento bloblang interpolation for injecting in custom data."). + Optional(), + } +} + +func commonGenerateFields() []*service.ConfigField { + return []*service.ConfigField{ + service.NewStringField(modelField).Description("Model identifier."), + service.NewObjectField(configField, + service.NewIntField(maxOutputTokensField). + Description("Maximum tokens the model can output."). + Optional(), + service.NewStringListField(stopSequencesField). + Description("List of stop sequences."). + Optional(), + service.NewFloatField(temperatureField). + Description("Controls randomness (0.0 to 1.0)."). + Optional(), + service.NewIntField(topKField). + Description("Top-K sampling parameter."). + Optional(), + service.NewFloatField(topPField). + Description("Top-P sampling parameter."). + Optional(), + ).Description("Model configuration matching common Genkit parameters.").Optional(), + service.NewInterpolatedStringField(promptField). + Description("Prompt template. use bento bloblang interpolation for injecting in custom data."), + service.NewObjectListField(toolsField, + service.NewProcessorField("processor"), + service.NewStringField("name"), + service.NewStringField("description")). + Description("A map of processors that the model can utilise as tools."). + Optional(), + service.NewObjectField(outputField, + service.NewAnyField(outputSchemaField).Description("Output schema in Picoschema format.").Optional(), + service.NewStringEnumField(outputFormatField, + ai.OutputFormatJSON, + ai.OutputFormatJSONL, + ai.OutputFormatText, + ai.OutputFormatArray, + ai.OutputFormatEnum, + // ai.OutputFormatMedia, + ).Description("The format of the response.").Default(ai.OutputFormatText).Optional(), + service.NewInterpolatedStringField(outputInstructionField).Description("Instructions for the model output.").Optional(), + ).Description("Determines the schema/format of the output.").Optional(), + } +} + +func parseModelConfig(pconf *service.ParsedConfig) (*ai.GenerationCommonConfig, error) { + conf := pconf.Namespace(configField) + if conf == nil { + return nil, nil + } + + var err error + genConf := &ai.GenerationCommonConfig{} + + if conf.Contains(maxOutputTokensField) { + if genConf.MaxOutputTokens, err = conf.FieldInt(maxOutputTokensField); err != nil { + return nil, err + } + } + + if conf.Contains(stopSequencesField) { + if genConf.StopSequences, err = conf.FieldStringList(stopSequencesField); err != nil { + return nil, err + } + } + + if conf.Contains(temperatureField) { + if genConf.Temperature, err = conf.FieldFloat(temperatureField); err != nil { + return nil, err + } + } + + if conf.Contains(topKField) { + if genConf.TopK, err = conf.FieldInt(topKField); err != nil { + return nil, err + } + } + + if conf.Contains(topPField) { + if genConf.TopP, err = conf.FieldFloat(topPField); err != nil { + return nil, err + } + } + + return genConf, nil +} + +func extractSchema(pconf *service.ParsedConfig) (map[string]any, error) { + var schema map[string]any + + if pconf.Contains(outputField, outputSchemaField) { + schemaAny, err := pconf.FieldAny(outputField, outputSchemaField) + if err != nil { + return nil, err + } + + schemaDef, err := dotprompt.Picoschema(schemaAny, &dotprompt.PicoschemaOptions{}) + if err != nil { + return nil, err + } + + schema, err = schemaAsMap(schemaDef) + if err != nil { + return nil, err + } + } + + return schema, nil +} + +// schemaAsMap converts json schema struct to a map (JSON representation). +// Adapted from github.com/firebase/genkit/go/internal/base since the functionality we need +// is unfortunately private. +func schemaAsMap(s *jsonschema.Schema) (map[string]any, error) { + jsb, err := s.MarshalJSON() + if err != nil { + return nil, err + } + + // Check if the marshaled JSON is "true" (indicates an empty schema) + if string(jsb) == "true" { + return make(map[string]any), nil + } + + var m map[string]any + err = json.Unmarshal(jsb, &m) + if err != nil { + return nil, err + } + return m, nil +} diff --git a/internal/impl/genkit/config_test.go b/internal/impl/genkit/config_test.go new file mode 100644 index 0000000000..0d591bf4bf --- /dev/null +++ b/internal/impl/genkit/config_test.go @@ -0,0 +1,77 @@ +package genkit + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/warpstreamlabs/bento/public/service" +) + +func TestConfigParsing(t *testing.T) { + tests := []struct { + name string + yamlConf string + expectModel string + expectTemplate string + expectTemp float64 + expectTokens int + }{ + { + name: "basic_config", + yamlConf: ` +address: "http://localhost:11434" +model: "llama3.2" +type: "chat" +config: + temperature: 0.7 + maxOutputTokens: 100 +prompt: "Hello {{name}}, you are in {{location}}" +`, + expectModel: "llama3.2", + expectTemplate: "Hello {{name}}, you are in {{location}}", + expectTemp: 0.7, + expectTokens: 100, + }, + { + name: "minimal", + yamlConf: ` +address: "http://localhost:11434" +model: "llama3.2" +type: "chat" +prompt: "Simple template" +`, + expectModel: "llama3.2", + expectTemplate: "Simple template", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + spec := ollamaProcessorConfigSpec() + conf, err := spec.ParseYAML(tt.yamlConf, service.NewEnvironment()) + require.NoError(t, err) + + // Test model parsing + model, err := conf.FieldString(modelField) + require.NoError(t, err) + assert.Equal(t, tt.expectModel, model) + + // Test template parsing + template, err := conf.FieldInterpolatedString(promptField) + require.NoError(t, err) + templateStr, ok := template.Static() + require.True(t, ok) + assert.Equal(t, tt.expectTemplate, templateStr) + + // Test config parsing + config, err := parseModelConfig(conf) + require.NoError(t, err) + if tt.expectTemp > 0 { + require.NotNil(t, config) + assert.Equal(t, tt.expectTemp, config.Temperature) + assert.Equal(t, tt.expectTokens, config.MaxOutputTokens) + } + }) + } +} diff --git a/internal/impl/genkit/convert.go b/internal/impl/genkit/convert.go new file mode 100644 index 0000000000..9cbcabee8a --- /dev/null +++ b/internal/impl/genkit/convert.go @@ -0,0 +1,171 @@ +package genkit + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "net/http" + "strings" + + "github.com/firebase/genkit/go/ai" + "github.com/firebase/genkit/go/genkit" + "github.com/google/dotprompt/go/dotprompt" + "github.com/warpstreamlabs/bento/public/bloblang" + "github.com/warpstreamlabs/bento/public/service" +) + +func convertToGenkit(msg *service.Message) (*ai.Message, error) { + part, err := toGenkitPart(msg) + if err != nil { + return nil, err + } + + meta := make(map[string]any) + msg.MetaWalk(func(key, value string) error { + meta[key] = value + return nil + }) + + return ai.NewMessage(ai.RoleUser, meta, part), nil +} + +func convertToBento(resp *ai.Message) ([]*service.Message, error) { + var messages []*service.Message + + for _, p := range resp.Content { + msg := service.NewMessage(nil) + if p.IsCustom() && p.Custom != nil { + msg.SetStructuredMut(p.Custom) + } else if p.Text != "" { + msg.SetBytes([]byte(p.Text)) + } else { + continue + } + + if p.Metadata != nil { + for k, v := range p.Metadata { + msg.MetaSetMut(k, v) + } + } + + messages = append(messages, msg) + } + + return messages, nil +} +func toGenkitPart(msg *service.Message) (*ai.Part, error) { + res, err := msg.AsBytes() + if err != nil { + return nil, err + } + + if json.Valid(res) { + return ai.NewJSONPart(string(res)), nil + } + + contentType := http.DetectContentType(res) + + if strings.HasPrefix(contentType, "image/") || + strings.HasPrefix(contentType, "audio/") || + strings.HasPrefix(contentType, "video/") { + base64Data := base64.StdEncoding.EncodeToString(res) + dataURL := fmt.Sprintf("data:%s;base64,%s", contentType, base64Data) + return ai.NewMediaPart(contentType, dataURL), nil + } + + if strings.HasPrefix(contentType, "text/") { + return ai.NewTextPart(string(res)), nil + } + + // Fallback to raw bytes for other binary data + base64Data := base64.StdEncoding.EncodeToString(res) + return ai.NewDataPart(base64Data), nil +} + +func convertToPartPointers(parts []dotprompt.Part) ([]*ai.Part, error) { + result := make([]*ai.Part, len(parts)) + for i, part := range parts { + switch p := part.(type) { + case *dotprompt.TextPart: + if p.Text != "" { + result[i] = ai.NewTextPart(p.Text) + } + case *dotprompt.MediaPart: + result[i] = ai.NewMediaPart(p.Media.ContentType, p.Media.URL) + } + } + return result, nil +} + +func convertDotpromptToGenkit(msg dotprompt.Message) (*ai.Message, error) { + parts, err := convertToPartPointers(msg.Content) + if err != nil { + return nil, err + } + var role ai.Role + switch msg.Role { + case dotprompt.RoleSystem: + role = ai.RoleSystem + case dotprompt.RoleUser: + role = ai.RoleUser + case dotprompt.RoleModel: + role = ai.RoleModel + case dotprompt.RoleTool: + role = ai.RoleTool + default: + return nil, fmt.Errorf("invalid role %s", msg.Role) + } + return ai.NewMessage(role, nil, parts...), nil + +} + +func convertProcessorToTool(g *genkit.Genkit, name, desc string, proc *service.OwnedProcessor) ai.Tool { + return genkit.DefineTool(g, name, desc, + func(ctx *ai.ToolContext, input any) (any, error) { + msg := service.NewMessage(nil) + switch t := input.(type) { + case []byte: + msg.SetBytes(t) + case string: + msg.SetBytes([]byte(t)) + default: + msg.SetStructured(input) + } + + batch, err := proc.Process(ctx, msg) + if err != nil { + return nil, err + } + + resp := make([]any, 0, len(batch)) + batchErr := batch.WalkWithBatchedErrors(func(i int, m *service.Message) error { + if err := m.GetError(); err != nil { + return err + } + + out, err := m.AsStructuredMut() + if err != nil { + return err + } + + resp = append(resp, out) + return nil + }) + + if len(resp) == 1 { + return resp[0], batchErr + } + + return resp, batchErr + + }, + ) +} + +func convertBloblangFunctionToTool(name string, exec *bloblang.Executor) ai.Tool { + return genkit.DefineTool(nil, "weather", "Get current weather for a location", + func(ctx *ai.ToolContext, input any) (any, error) { + return exec.Query(input) + }, + ) +} diff --git a/internal/impl/genkit/embed_processor.go b/internal/impl/genkit/embed_processor.go new file mode 100644 index 0000000000..ac636ea665 --- /dev/null +++ b/internal/impl/genkit/embed_processor.go @@ -0,0 +1,113 @@ +package genkit + +import ( + "context" + "fmt" + + "github.com/firebase/genkit/go/ai" + "github.com/google/dotprompt/go/dotprompt" + "github.com/warpstreamlabs/bento/public/service" +) + +type embedderProcessor struct { + prompt *service.InterpolatedString + embedder ai.Embedder + config any +} + +func newEmbedderProcessor(pconf *service.ParsedConfig, config any, embedder ai.Embedder) (*embedderProcessor, error) { + var prompt *service.InterpolatedString + if pconf.Contains(promptField) { + p, err := pconf.FieldInterpolatedString(promptField) + if err != nil { + return nil, err + } + prompt = p + } + + return &embedderProcessor{ + embedder: embedder, + config: config, + prompt: prompt, + }, nil +} + +func (p *embedderProcessor) Process(ctx context.Context, msg *service.Message) (service.MessageBatch, error) { + var docs []*ai.Document + + if p.prompt != nil { + prompt, err := p.prompt.TryString(msg) + if err != nil { + return nil, err + } + + dataArg := &dotprompt.DataArgument{} + out, _ := msg.AsStructuredMut() + if data, ok := out.(map[string]any); ok { + dataArg.Input = data + } + + dp := dotprompt.NewDotprompt(nil) + rendered, err := dp.Render(prompt, dataArg, nil) + if err != nil { + return nil, err + } + + for _, m := range rendered.Messages { + parts, err := convertToPartPointers(m.Content) + if err != nil { + return nil, err + } + docs = append(docs, &ai.Document{ + Content: parts, + Metadata: m.Metadata, + }) + } + } else { + content, err := msg.AsBytes() + if err != nil { + return nil, err + } + + if len(content) == 0 { + // Return empty result for empty content + outMsg := msg.Copy() + outMsg.SetStructuredMut([][]float32{}) + return service.MessageBatch{outMsg}, nil + } + + parts := []*ai.Part{{Text: string(content)}} + docs = append(docs, &ai.Document{ + Content: parts, + }) + } + + metadata := make(map[string]any) + msg.MetaWalk(func(key, value string) error { + metadata[key] = value + return nil + }) + + req := &ai.EmbedRequest{ + Input: docs, + } + + resp, err := p.embedder.Embed(ctx, req) + if err != nil { + return nil, fmt.Errorf("failed to generate embedding: %w", err) + } + + var embeddings [][]float32 + for _, embedding := range resp.Embeddings { + embeddings = append(embeddings, embedding.Embedding) + } + + outMsg := msg.Copy() + outMsg.SetStructuredMut(embeddings) + + return service.MessageBatch{outMsg}, nil +} + +func (p *embedderProcessor) Close(ctx context.Context) error { + return nil +} diff --git a/internal/impl/genkit/embed_processor_test.go b/internal/impl/genkit/embed_processor_test.go new file mode 100644 index 0000000000..e72ccfca41 --- /dev/null +++ b/internal/impl/genkit/embed_processor_test.go @@ -0,0 +1,29 @@ +package genkit + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/warpstreamlabs/bento/public/service" +) + +func TestOllamaEmbedProcessorConfigSpec(t *testing.T) { + spec := ollamaEmbedProcessorConfigSpec() + require.NotNil(t, spec) + + validConfig := ` +address: "http://localhost:11434" +model: "all-minilm" +` + conf, err := spec.ParseYAML(validConfig, service.NewEnvironment()) + require.NoError(t, err) + + address, err := conf.FieldURL("address") + require.NoError(t, err) + assert.Equal(t, "http://localhost:11434", address.String()) + + model, err := conf.FieldString("model") + require.NoError(t, err) + assert.Equal(t, "all-minilm", model) +} diff --git a/internal/impl/genkit/googlegenai_embed_processor.go b/internal/impl/genkit/googlegenai_embed_processor.go new file mode 100644 index 0000000000..645ac1c342 --- /dev/null +++ b/internal/impl/genkit/googlegenai_embed_processor.go @@ -0,0 +1,87 @@ +package genkit + +import ( + "fmt" + + "github.com/firebase/genkit/go/ai" + "github.com/firebase/genkit/go/plugins/googlegenai" + "github.com/warpstreamlabs/bento/public/service" +) + +func googleGenAIEmbedProcessorConfigSpec() *service.ConfigSpec { + return service.NewConfigSpec(). + Beta(). + Categories("AI", "Genkit"). + Summary("Generates embeddings using Google AI models."). + Description("Generates text embeddings using Google AI's embedding models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit."). + Fields(commonEmbedFields()...). + Field(service.NewStringField(apiKeyField). + Description("Google AI API key."). + Secret(). + Examples("${GOOGLE_API_KEY}", "${GEMINI_API_KEY}")). + Example("Text Embedding with Google AI", ` +Generate embeddings using Google AI embedding models: + +`+"```yaml"+` +pipeline: + processors: + - genkit_googlegenai_embed: + api_key: "${GOOGLE_AI_API_KEY}" + model: "text-embedding-004" +`+"```"+``, "") +} + +func init() { + err := service.RegisterProcessor( + "genkit_googlegenai_embed", googleGenAIEmbedProcessorConfigSpec(), + func(conf *service.ParsedConfig, mgr *service.Resources) (service.Processor, error) { + return newGoogleGenAIEmbedder(conf, mgr) + }) + if err != nil { + panic(err) + } +} + +func newGoogleGenAIEmbedder(pconf *service.ParsedConfig, res *service.Resources) (service.Processor, error) { + apiKey, err := pconf.FieldString(apiKeyField) + if err != nil { + return nil, err + } + + if apiKey == "" { + return nil, fmt.Errorf("field '%s' cannot be empty", apiKeyField) + } + + googleAIPlugin := &googlegenai.GoogleAI{ + APIKey: apiKey, + } + + plugin, err := InitPlugin(res, googleAIPlugin) + if err != nil { + return nil, err + } + + modelName, err := pconf.FieldString(modelField) + if err != nil { + return nil, err + } + + g, err := LoadInstance(res) + if err != nil { + return nil, err + } + + embedder := googlegenai.GoogleAIEmbedder(g, modelName) + if embedder == nil { + embedder, err = plugin.DefineEmbedder(g, modelName, &ai.EmbedderOptions{}) + if err != nil { + return nil, fmt.Errorf("failed to define embedder for model %s: %w", modelName, err) + } + } + + if embedder == nil { + return nil, fmt.Errorf("embedder not found for plugin %s with model %s - ensure the model is available", plugin.Name(), modelName) + } + + return newEmbedderProcessor(pconf, nil, embedder) +} diff --git a/internal/impl/genkit/googlegenai_processor.go b/internal/impl/genkit/googlegenai_processor.go new file mode 100644 index 0000000000..9e840b1c85 --- /dev/null +++ b/internal/impl/genkit/googlegenai_processor.go @@ -0,0 +1,111 @@ +package genkit + +import ( + "fmt" + + "github.com/firebase/genkit/go/plugins/googlegenai" + "github.com/warpstreamlabs/bento/public/service" + "google.golang.org/genai" +) + +func init() { + err := service.RegisterProcessor( + "genkit_googlegenai", googlegenaiCompatibleSpec(), + func(conf *service.ParsedConfig, res *service.Resources) (service.Processor, error) { + plugin, err := newGoogleGenAIPlugin(conf) + if err != nil { + return nil, err + } + + return newGoogleGenAIProcessor(conf, res, plugin) + }) + if err != nil { + panic(err) + } +} + +func googlegenaiCompatibleSpec() *service.ConfigSpec { + return service.NewConfigSpec(). + Beta(). + Categories("AI", "Genkit"). + Summary("Generates content using Google AI models."). + Description("Generates text content using Google AI models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit."). + Fields( + service.NewStringField(apiKeyField). + Description("Google AI API key."). + Secret(). + Examples("${GOOGLE_API_KEY}", "${GEMINI_API_KEY}"), + ).Fields( + commonGenerateFields()..., + ). + Example("Chat Completion with Google AI", ` +Generate text using Google AI models: + +`+"```yaml"+` +pipeline: + processors: + - genkit_googlegenai: + api_key: "${GOOGLE_AI_API_KEY}" + model: "gemini-1.5-flash" + config: + temperature: 0.7 + max_output_tokens: 256 + prompt: | + {{role "system"}} + You are a helpful assistant. + {{role "user"}} + ${! content() } +`+"```"+``, "") +} + +//------------------------------------------------------------------------------ + +func newGoogleGenAIPlugin(pconf *service.ParsedConfig) (*googlegenai.GoogleAI, error) { + apiKey, err := pconf.FieldString(apiKeyField) + if err != nil { + return nil, err + } + if apiKey == "" { + return nil, fmt.Errorf("field '%s' cannot be empty", apiKeyField) + } + + return &googlegenai.GoogleAI{ + APIKey: apiKey, + }, nil +} + +func newGoogleGenAIProcessor(pconf *service.ParsedConfig, res *service.Resources, plugin *googlegenai.GoogleAI) (service.Processor, error) { + modelName, err := pconf.FieldString(modelField) + if err != nil { + return nil, err + } + + genkitConf, err := parseModelConfig(pconf) + if err != nil { + return nil, err + } + + config := &genai.GenerateContentConfig{ + Temperature: genai.Ptr(float32(genkitConf.Temperature)), + TopP: genai.Ptr(float32(genkitConf.TopP)), + TopK: genai.Ptr(float32(genkitConf.TopK)), + MaxOutputTokens: int32(genkitConf.MaxOutputTokens), + StopSequences: genkitConf.StopSequences, + } + + if _, err = InitPlugin(res, plugin); err != nil { + return nil, err + } + + g, err := LoadInstance(res) + if err != nil { + return nil, err + } + + model := googlegenai.GoogleAIModel(g, modelName) + if model == nil { + return nil, fmt.Errorf("could not find model %s", modelName) + } + + return newGenkitProcessor(pconf, res, config, model) +} diff --git a/internal/impl/genkit/instance.go b/internal/impl/genkit/instance.go new file mode 100644 index 0000000000..326f45c997 --- /dev/null +++ b/internal/impl/genkit/instance.go @@ -0,0 +1,76 @@ +package genkit + +import ( + "context" + "errors" + "fmt" + "sync" + + "github.com/firebase/genkit/go/core/api" + "github.com/firebase/genkit/go/genkit" + "github.com/warpstreamlabs/bento/public/service" +) + +var errModelNotDefined = errors.New("model not found") + +func safeExec(fn func() error) (err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("panic: %v", r) + } + }() + + return fn() +} + +type genkitInstanceKey struct{} + +type genkitWrapper struct { + once sync.Once + instance *genkit.Genkit + err error +} + +func (g *genkitWrapper) get() (*genkit.Genkit, error) { + g.once.Do(func() { + g.instance = genkit.Init(context.Background()) + }) + return g.instance, g.err +} + +func LoadInstance(res *service.Resources) (*genkit.Genkit, error) { + actual, _ := res.GetOrSetGeneric(genkitInstanceKey{}, &genkitWrapper{}) + wrapper := actual.(*genkitWrapper) + instance, err := wrapper.get() + if err != nil { + return nil, err + } + return instance, nil +} + +type Plugin interface { + Init(ctx context.Context) []api.Action + Name() string +} + +func InitPlugin[P Plugin](res *service.Resources, plugin P) (P, error) { + g, err := LoadInstance(res) + if err != nil { + var zero P + return zero, err + } + + if p := genkit.LookupPlugin(g, plugin.Name()); p != nil { + return p.(P), nil + } + + if err := safeExec(func() error { + _ = plugin.Init(context.Background()) + return nil + }); err != nil { + var zero P + return zero, err + } + + return plugin, nil +} diff --git a/internal/impl/genkit/integration_test.go b/internal/impl/genkit/integration_test.go new file mode 100644 index 0000000000..72298abeeb --- /dev/null +++ b/internal/impl/genkit/integration_test.go @@ -0,0 +1,298 @@ +package genkit + +import ( + "context" + "encoding/json" + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/warpstreamlabs/bento/public/service" + "github.com/warpstreamlabs/bento/public/service/integration" +) + +const ( + testTimeout = 30 * time.Second +) + +func TestOllamaEmbedIntegration(t *testing.T) { + integration.CheckSkip(t) + t.Parallel() + + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + yamlConf := ` +address: "http://localhost:11434" +model: "all-minilm" +` + + tests := []struct { + name string + input string + validate func(t *testing.T, result [][]float32) + }{ + { + name: "single_text_embedding", + input: "Hello world", + validate: func(t *testing.T, result [][]float32) { + require.Len(t, result, 1) + require.Greater(t, len(result[0]), 0) + assert.Greater(t, len(result[0]), 300) + }, + }, + { + name: "json_text_embedding", + input: `This is a JSON-like text: {"type": "text", "content": "This is a test document"}`, + validate: func(t *testing.T, result [][]float32) { + require.Len(t, result, 1) + require.Greater(t, len(result[0]), 0) + }, + }, + { + name: "structured_content_as_text", + input: `{"message": "test json content", "type": "example"}`, + validate: func(t *testing.T, result [][]float32) { + require.Len(t, result, 1) + require.Greater(t, len(result[0]), 0) + }, + }, + { + name: "binary_data_embedding", + input: string([]byte{0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}), // PNG header + validate: func(t *testing.T, result [][]float32) { + require.Len(t, result, 1) + require.Greater(t, len(result[0]), 0) + }, + }, + { + name: "mixed_text_content", + input: `Document with mixed content: text, data: YmluYXJ5ZGF0YQ==, and metadata: {"version": 1}`, + validate: func(t *testing.T, result [][]float32) { + require.Len(t, result, 1) + require.Greater(t, len(result[0]), 0) + }, + }, + { + name: "empty_string", + input: "", + validate: func(t *testing.T, result [][]float32) { + require.Len(t, result, 0) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + spec := ollamaEmbedProcessorConfigSpec() + conf, err := spec.ParseYAML(yamlConf, service.NewEnvironment()) + require.NoError(t, err) + + processor, err := newOllamaEmbedder(conf, service.MockResources()) + if err != nil { + t.Fatalf("Skipping test due to setup error (likely missing Ollama server or model): %v", err) + } + + msg := service.NewMessage([]byte(tt.input)) + + ctx, cancel := context.WithTimeout(context.Background(), testTimeout) + defer cancel() + + result, err := processor.Process(ctx, msg) + require.NoError(t, err) + require.Len(t, result, 1) + + var embeddings [][]float32 + structured, err := result[0].AsStructuredMut() + require.NoError(t, err) + err = json.Unmarshal([]byte(fmt.Sprintf("%v", structured)), &embeddings) + if err != nil { + embeddings = structured.([][]float32) + } + + tt.validate(t, embeddings) + }) + } +} + +func TestOllamaGenerationIntegration(t *testing.T) { + integration.CheckSkip(t) + t.Parallel() + + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + tests := []struct { + name string + yamlConf string + input string + validate func(t *testing.T, output string) + }{ + { + name: "simple_generation", + yamlConf: ` +address: "http://localhost:11434" +model: "tinyllama" +type: "generate" +config: + temperature: 1.0 + maxOutputTokens: 50 +prompt: "Complete this sentence: The sky is" +`, + input: "", + validate: func(t *testing.T, output string) { + assert.NotEmpty(t, output) + assert.Greater(t, len(output), 5) + }, + }, + { + name: "templated_generation", + yamlConf: ` +address: "http://localhost:11434" +model: "tinyllama" +type: "generate" +config: + temperature: 1.0 + maxOutputTokens: 30 +prompt: "Answer this question: ${! content() }" +`, + input: "What is 2+2?", + validate: func(t *testing.T, output string) { + assert.NotEmpty(t, output) + }, + }, + { + name: "chat_mode", + yamlConf: ` +address: "http://localhost:11434" +model: "tinyllama" +type: "chat" +config: + temperature: 1.0 + maxOutputTokens: 20 +prompt: "You are a helpful assistant. Answer: ${! content() }" +`, + input: "Hello", + validate: func(t *testing.T, output string) { + assert.NotEmpty(t, output) + }, + }, + { + name: "bloblang_json_mapping", + yamlConf: `address: "http://localhost:11434" +model: "tinyllama" +type: "generate" +config: + temperature: 1.0 + maxOutputTokens: 30 +prompt: 'Describe: ${! json("name") } is ${! json("age") } years old'`, + input: `{"name": "Alice", "age": 25}`, + validate: func(t *testing.T, output string) { + assert.NotEmpty(t, output) + }, + }, + { + name: "bloblang_content_transformation", + yamlConf: ` +address: "http://localhost:11434" +model: "tinyllama" +type: "generate" +config: + temperature: 1.0 + maxOutputTokens: 40 +prompt: "Transform this: ${! content().uppercase() }" +`, + input: "hello world", + validate: func(t *testing.T, output string) { + assert.NotEmpty(t, output) + }, + }, + { + name: "bloblang_array_access", + yamlConf: `address: "http://localhost:11434" +model: "tinyllama" +type: "generate" +config: + temperature: 1.0 + maxOutputTokens: 25 +prompt: 'First item: ${! json("items").index(0) }'`, + input: `{"items": ["apple", "banana", "cherry"]}`, + validate: func(t *testing.T, output string) { + assert.NotEmpty(t, output) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + spec := ollamaProcessorConfigSpec() + + conf, err := spec.ParseYAML(tt.yamlConf, service.NewEnvironment()) + require.NoError(t, err) + + processor, err := newOllamaProcessor(conf, service.MockResources()) + if err != nil { + t.Skipf("Skipping test due to setup error (likely missing Ollama server or model): %v", err) + } + + msg := service.NewMessage([]byte(tt.input)) + + ctx, cancel := context.WithTimeout(context.Background(), testTimeout) + defer cancel() + + result, err := processor.Process(ctx, msg) + require.NoError(t, err) + require.Len(t, result, 1) + + output, err := result[0].AsBytes() + require.NoError(t, err) + + tt.validate(t, string(output)) + }) + } +} + +func TestMultiPartDocumentEmbedding(t *testing.T) { + integration.CheckSkip(t) + t.Parallel() + + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + input := `This is a multipart document with: +- Main text content: This is the main text content +- JSON metadata: {"metadata": {"source": "test", "importance": "high"}} +- Additional context: Additional context information +- Raw data: raw_data_content` + + yamlConf := ` +address: "http://localhost:11434" +model: "all-minilm" +` + spec := ollamaEmbedProcessorConfigSpec() + config, err := spec.ParseYAML(yamlConf, service.NewEnvironment()) + require.NoError(t, err) + + processor, err := newOllamaEmbedder(config, service.MockResources()) + if err != nil { + t.Fatalf("Skipping test due to setup error (likely missing Ollama server or model): %v", err) + } + + msg := service.NewMessage([]byte(input)) + ctx, cancel := context.WithTimeout(context.Background(), testTimeout) + defer cancel() + + result, err := processor.Process(ctx, msg) + require.NoError(t, err) + + structured, err := result[0].AsStructuredMut() + require.NoError(t, err) + embeddings := structured.([][]float32) + require.Len(t, embeddings, 1) + require.Greater(t, len(embeddings[0]), 0) +} diff --git a/internal/impl/genkit/ollama_embed_processor.go b/internal/impl/genkit/ollama_embed_processor.go new file mode 100644 index 0000000000..af6c1e3903 --- /dev/null +++ b/internal/impl/genkit/ollama_embed_processor.go @@ -0,0 +1,93 @@ +package genkit + +import ( + "fmt" + + "github.com/firebase/genkit/go/ai" + "github.com/firebase/genkit/go/plugins/ollama" + "github.com/ollama/ollama/api" + "github.com/warpstreamlabs/bento/public/service" +) + +func ollamaEmbedProcessorConfigSpec() *service.ConfigSpec { + return service.NewConfigSpec(). + Beta(). + Categories("AI", "Genkit"). + Summary("Generates embeddings using Ollama models."). + Description("Generates text embeddings using Ollama models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit."). + Fields(commonEmbedFields()...). + Field(service.NewURLField(addressField). + Description("Server address of Ollama instance."). + Default("http://localhost:11434")). + Field(service.NewStringField(modelField). + Description("Ollama embedding model to use (e.g., 'nomic-embed-text', 'all-minilm').")). + Example("Basic Text Embedding", ` +Generate embeddings for text content using a local Ollama instance: + +`+"```yaml"+` +pipeline: + processors: + - genkit_ollama_embed: + address: "http://localhost:11434" + model: "nomic-embed-text" +`+"```"+``, "") +} + +func init() { + err := service.RegisterProcessor( + "genkit_ollama_embed", ollamaEmbedProcessorConfigSpec(), + func(conf *service.ParsedConfig, mgr *service.Resources) (service.Processor, error) { + return newOllamaEmbedder(conf, mgr) + }) + if err != nil { + panic(err) + } +} + +func newOllamaEmbedder(pconf *service.ParsedConfig, res *service.Resources) (service.Processor, error) { + ollamaPlugin, err := newOllamaPlugin(pconf) + if err != nil { + return nil, err + } + + plugin, err := InitPlugin(res, ollamaPlugin) + if err != nil { + return nil, err + } + + modelName, err := pconf.FieldString(modelField) + if err != nil { + return nil, err + } + + g, err := LoadInstance(res) + if err != nil { + return nil, err + } + + genkitConf, err := parseModelConfig(pconf) + if err != nil { + return nil, err + } + + // TODO(gregfurman: Implement the remaining options in github.com/ollama/ollama/api + // TODO(gregfurma): Should we be using api.DefaultOptions()? + config := api.Options{ + NumPredict: genkitConf.MaxOutputTokens, + TopK: genkitConf.TopK, + TopP: float32(genkitConf.TopP), + Stop: genkitConf.StopSequences, + Temperature: float32(genkitConf.Temperature), + } + + embedder := ollama.Embedder(g, ollamaPlugin.ServerAddress) + if embedder == nil { + embedder = plugin.DefineEmbedder(g, ollamaPlugin.ServerAddress, modelName, &ai.EmbedderOptions{}) + } + + if embedder == nil { + return nil, fmt.Errorf("embedder not found for plugin %s with model %s - ensure Ollama is running and the model is available", plugin.Name(), modelName) + } + + return newEmbedderProcessor(pconf, config, embedder) +} diff --git a/internal/impl/genkit/ollama_processor.go b/internal/impl/genkit/ollama_processor.go new file mode 100644 index 0000000000..067c175d78 --- /dev/null +++ b/internal/impl/genkit/ollama_processor.go @@ -0,0 +1,115 @@ +package genkit + +import ( + "github.com/firebase/genkit/go/plugins/ollama" + "github.com/ollama/ollama/api" + "github.com/warpstreamlabs/bento/public/service" +) + +const ( + ollamaTypeField = "type" +) + +func init() { + err := service.RegisterProcessor( + "genkit_ollama", ollamaProcessorConfigSpec(), + func(conf *service.ParsedConfig, mgr *service.Resources) (service.Processor, error) { + return newOllamaProcessor(conf, mgr) + }) + if err != nil { + panic(err) + } +} + +func ollamaProcessorConfigSpec() *service.ConfigSpec { + return service.NewConfigSpec(). + Beta(). + Categories("AI", "Genkit"). + Summary("Generates content using Ollama models."). + Description("Generates text content using Ollama models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit."). + Fields( + service.NewURLField(addressField).Description("Server address of Ollama instance.").Default("http://localhost:11434"), + service.NewStringEnumField(ollamaTypeField, "chat", "generate").Description("The type of task the model should perform.").Default("generate"), + ).Fields(commonGenerateFields()...). + Example("Chat Completion with Ollama", ` +Generate text using Ollama models in chat mode: + +`+"```yaml"+` +pipeline: + processors: + - genkit_ollama: + address: "http://localhost:11434" + model: "llama3.2" + type: "chat" + config: + temperature: 0.7 + max_output_tokens: 256 + prompt: | + {{role "system"}} + You are a helpful assistant. + {{role "user"}} + ${! content() } +`+"```"+``, "") +} + +func newOllamaPlugin(pconf *service.ParsedConfig) (*ollama.Ollama, error) { + addr, err := pconf.FieldURL(addressField) + if err != nil { + return nil, err + } + + return &ollama.Ollama{ + ServerAddress: addr.String(), + }, nil + +} + +func newOllamaProcessor(pconf *service.ParsedConfig, res *service.Resources) (service.Processor, error) { + modelType, err := pconf.FieldString(ollamaTypeField) + if err != nil { + return nil, err + } + + modelName, err := pconf.FieldString(modelField) + if err != nil { + return nil, err + } + + plugin, err := newOllamaPlugin(pconf) + if err != nil { + return nil, err + } + + p, err := InitPlugin(res, plugin) + if err != nil { + return nil, err + } + + g, err := LoadInstance(res) + if err != nil { + return nil, err + } + + model := p.DefineModel(g, ollama.ModelDefinition{ + Name: modelName, + Type: modelType, + }, nil) + + genkitConf, err := parseModelConfig(pconf) + if err != nil { + return nil, err + } + + // TODO(gregfurman: Implement the remaining options in github.com/ollama/ollama/api + // TODO(gregfurma): Should we be using api.DefaultOptions()? + config := api.Options{ + NumPredict: genkitConf.MaxOutputTokens, + TopK: genkitConf.TopK, + TopP: float32(genkitConf.TopP), + Stop: genkitConf.StopSequences, + Temperature: float32(genkitConf.Temperature), + } + + return newGenkitProcessor(pconf, res, config, model) + +} diff --git a/internal/impl/genkit/openai_embed_processor.go b/internal/impl/genkit/openai_embed_processor.go new file mode 100644 index 0000000000..0974460028 --- /dev/null +++ b/internal/impl/genkit/openai_embed_processor.go @@ -0,0 +1,101 @@ +package genkit + +import ( + "fmt" + + oai "github.com/firebase/genkit/go/plugins/compat_oai/openai" + "github.com/openai/openai-go/option" + "github.com/warpstreamlabs/bento/public/service" +) + +func openAIEmbedProcessorConfigSpec() *service.ConfigSpec { + return service.NewConfigSpec(). + Beta(). + Categories("AI", "Genkit"). + Summary("Generates embeddings using OpenAI models."). + Description("Generates text embeddings using OpenAI's embedding models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit."). + Fields(commonEmbedFields()...). + Field(service.NewURLField(addressField). + Description("Server address of OpenAI API."). + Optional()). + Field(service.NewStringField(apiKeyField). + Description("OpenAI API key."). + Secret(). + Examples("${OPENAI_API_KEY}")). + Example("Text Embedding with OpenAI", ` +Generate embeddings using OpenAI's embedding models: + +`+"```yaml"+` +pipeline: + processors: + - genkit_openai_embed: + api_key: "${OPENAI_API_KEY}" + model: "text-embedding-3-small" +`+"```"+``, "") +} + +func init() { + err := service.RegisterProcessor( + "genkit_openai_embed", openAIEmbedProcessorConfigSpec(), + func(conf *service.ParsedConfig, mgr *service.Resources) (service.Processor, error) { + plugin, err := newOpenAIEmbedPlugin(conf) + if err != nil { + return nil, err + } + + return newOpenAIEmbedder(conf, mgr, plugin) + }) + if err != nil { + panic(err) + } +} + +func newOpenAIEmbedPlugin(pconf *service.ParsedConfig) (*oai.OpenAI, error) { + var opts []option.RequestOption + + if pconf.Contains(addressField) { + addr, err := pconf.FieldURL(addressField) + if err != nil { + return nil, err + } + opts = append(opts, option.WithBaseURL(addr.String())) + } + + apiKey, err := pconf.FieldString(apiKeyField) + if err != nil { + return nil, err + } + + if apiKey == "" { + return nil, fmt.Errorf("field '%s' cannot be empty", apiKeyField) + } + + return &oai.OpenAI{ + APIKey: apiKey, + Opts: opts, + }, nil +} + +func newOpenAIEmbedder(pconf *service.ParsedConfig, res *service.Resources, plugin *oai.OpenAI) (service.Processor, error) { + _, err := InitPlugin(res, plugin) + if err != nil { + return nil, err + } + + modelName, err := pconf.FieldString(modelField) + if err != nil { + return nil, err + } + + g, err := LoadInstance(res) + if err != nil { + return nil, err + } + + embedder := plugin.Embedder(g, modelName) + if embedder == nil { + return nil, fmt.Errorf("embedder not found for plugin %s with model %s - ensure the model is available", plugin.Name(), modelName) + } + + return newEmbedderProcessor(pconf, nil, embedder) +} \ No newline at end of file diff --git a/internal/impl/genkit/openai_processor.go b/internal/impl/genkit/openai_processor.go new file mode 100644 index 0000000000..ceee319f1b --- /dev/null +++ b/internal/impl/genkit/openai_processor.go @@ -0,0 +1,118 @@ +package genkit + +import ( + "github.com/firebase/genkit/go/ai" + "github.com/firebase/genkit/go/genkit" + oai "github.com/firebase/genkit/go/plugins/compat_oai/openai" + + "github.com/openai/openai-go" + "github.com/openai/openai-go/option" + + "github.com/warpstreamlabs/bento/public/service" +) + +func init() { + err := service.RegisterProcessor( + "genkit_openai", openaiCompatibleSpec(), + func(conf *service.ParsedConfig, res *service.Resources) (service.Processor, error) { + plugin, err := newOpenAIPlugin(conf) + if err != nil { + return nil, err + } + + return newOpenAIProcessor(conf, res, plugin) + }) + if err != nil { + panic(err) + } +} + +func openaiCompatibleSpec() *service.ConfigSpec { + return service.NewConfigSpec(). + Beta(). + Categories("AI", "Genkit"). + Summary("Generates content using OpenAI models."). + Description("Generates text content using OpenAI models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit."). + Fields( + service.NewURLField(addressField).Description("Server address of OpenAI API.").Optional(), + service.NewStringField(apiKeyField).Description("OpenAI API key.").Secret().Examples("${OPENAI_API_KEY}"), + ).Fields( + commonGenerateFields()..., + ). + Example("Chat Completion with OpenAI", ` +Generate text using OpenAI models: + +`+"```yaml"+` +pipeline: + processors: + - genkit_openai: + api_key: "${OPENAI_API_KEY}" + model: "gpt-4o-mini" + config: + temperature: 0.7 + max_output_tokens: 256 + prompt: | + {{role "system"}} + You are a helpful assistant. + {{role "user"}} + ${! content() } +`+"```"+``, "") +} + +//------------------------------------------------------------------------------ + +func newOpenAIPlugin(pconf *service.ParsedConfig) (*oai.OpenAI, error) { + addr, err := pconf.FieldURL(addressField) + if err != nil { + return nil, err + } + + apiKey, err := pconf.FieldString(apiKeyField) + if err != nil { + return nil, err + } + + return &oai.OpenAI{ + APIKey: apiKey, + Opts: []option.RequestOption{ + option.WithBaseURL(addr.Host), + }, + }, nil +} + +type ModelPlugin interface { + Plugin + Model(g *genkit.Genkit, name string) ai.Model +} + +func newOpenAIProcessor(pconf *service.ParsedConfig, res *service.Resources, plugin ModelPlugin) (service.Processor, error) { + model, err := pconf.FieldString(modelField) + if err != nil { + return nil, err + } + + genkitConf, err := parseModelConfig(pconf) + if err != nil { + return nil, err + } + + config := openai.ChatCompletionNewParams{ + MaxCompletionTokens: openai.Int(int64(genkitConf.MaxOutputTokens)), + Temperature: openai.Float(genkitConf.Temperature), + TopP: openai.Float(genkitConf.TopP), + // TODO(gregfurman): Add validations (i.e can be up to 4 tokens) + Stop: openai.ChatCompletionNewParamsStopUnion{OfStringArray: genkitConf.StopSequences}, + } + + p, err := InitPlugin(res, plugin) + if err != nil { + return nil, err + } + + g, err := LoadInstance(res) + if err != nil { + return nil, err + } + + return newGenkitProcessor(pconf, res, config, p.Model(g, model)) +} diff --git a/internal/impl/genkit/processor.go b/internal/impl/genkit/processor.go new file mode 100644 index 0000000000..f36cdca421 --- /dev/null +++ b/internal/impl/genkit/processor.go @@ -0,0 +1,180 @@ +package genkit + +import ( + "context" + "fmt" + "strings" + + "github.com/firebase/genkit/go/ai" + "github.com/firebase/genkit/go/core" + "github.com/firebase/genkit/go/genkit" + "github.com/google/dotprompt/go/dotprompt" + "github.com/warpstreamlabs/bento/public/service" +) + +type genkitPromptProcessor struct { + instance *genkit.Genkit + model ai.Model + + config any + prompt *service.InterpolatedString + + outputSchema map[string]any + outputFormat string + + tools []ai.ToolRef + + outputInstructions *service.InterpolatedString + + flow *core.Flow[*service.Message, service.MessageBatch, struct{}] +} + +func newGenkitProcessor(pconf *service.ParsedConfig, res *service.Resources, config any, model ai.Model) (*genkitPromptProcessor, error) { + g, err := LoadInstance(res) + if err != nil { + return nil, fmt.Errorf("failed to retrieve shared genkit instance: %w", err) + } + + proc := &genkitPromptProcessor{ + instance: g, + model: model, + config: config, + } + + proc.prompt, err = pconf.FieldInterpolatedString(promptField) + if err != nil { + return nil, err + } + + proc.outputFormat, err = pconf.FieldString(outputField, outputFormatField) + if err != nil { + return nil, err + } + + if pconf.Contains(outputField, outputInstructionField) { + proc.outputInstructions, err = pconf.FieldInterpolatedString(outputField, outputInstructionField) + if err != nil { + return nil, err + } + } + + if pconf.Contains(outputField, outputInstructionField) { + proc.outputSchema, err = extractSchema(pconf) + if err != nil { + return nil, err + } + } + + if pconf.Contains(toolsField) { + + toolDefinitions, err := pconf.FieldObjectList(toolsField) + if err != nil { + return nil, err + } + + for _, toolDef := range toolDefinitions { + ownedProc, err := toolDef.FieldProcessor("processor") + if err != nil { + return nil, err + } + + toolName, err := toolDef.FieldString("name") + if err != nil { + return nil, err + } + + toolDesc, err := toolDef.FieldString("description") + if err != nil { + return nil, err + } + + proc.tools = append(proc.tools, convertProcessorToTool(g, toolName, toolDesc, ownedProc)) + } + } + + p := res.Path() + flowName := strings.Join(append([]string{"bento", model.Name()}, p...), ".") + proc.flow = genkit.DefineFlow(g, flowName, proc.process) + return proc, nil +} + +func (p *genkitPromptProcessor) Process(ctx context.Context, msg *service.Message) (service.MessageBatch, error) { + return p.flow.Run(ctx, msg) +} + +func (p *genkitPromptProcessor) opts() ([]ai.GenerateOption, error) { + var modelOpts []ai.GenerateOption + if len(p.tools) > 0 { + modelOpts = append(modelOpts, ai.WithToolChoice(ai.ToolChoiceAuto), ai.WithTools(p.tools...)) + } + + if p.model == nil { + return nil, fmt.Errorf("could not retrieve model") + } + modelOpts = append(modelOpts, ai.WithModel(p.model)) + + if p.config != nil { + modelOpts = append(modelOpts, ai.WithConfig(p.config)) + } + + if p.outputSchema != nil { + modelOpts = append(modelOpts, ai.WithOutputType(p.outputSchema)) + } + + modelOpts = append(modelOpts, ai.WithOutputFormat(p.outputFormat)) + + return modelOpts, nil +} + +func (p *genkitPromptProcessor) process(ctx context.Context, msg *service.Message) (service.MessageBatch, error) { + prompt, err := p.prompt.TryString(msg) + if err != nil { + return nil, err + } + + dataArg := &dotprompt.DataArgument{} + out, _ := msg.AsStructuredMut() + if data, ok := out.(map[string]any); ok { + dataArg.Input = data + } + + dp := dotprompt.NewDotprompt(nil) + doc, err := dp.Render(prompt, dataArg, nil) + if err != nil { + return nil, err + } + + modelOpts, err := p.opts() + if err != nil { + return nil, err + } + + var messages []*ai.Message + for _, m := range doc.Messages { + genkitMsg, err := convertDotpromptToGenkit(m) + if err != nil { + return nil, err + } + messages = append(messages, genkitMsg) + } + modelOpts = append(modelOpts, ai.WithMessages(messages...)) + + if p.outputInstructions != nil { + instructions, err := p.outputInstructions.TryString(msg) + if err != nil { + return nil, err + } + modelOpts = append(modelOpts, ai.WithOutputInstructions(instructions)) + } + + resp, err := genkit.Generate(ctx, p.instance, modelOpts...) + if err != nil { + return nil, err + } + + return convertToBento(resp.Message) +} + +func (p *genkitPromptProcessor) Close(ctx context.Context) error { + return nil +} diff --git a/internal/impl/genkit/vertexai_embed_processor.go b/internal/impl/genkit/vertexai_embed_processor.go new file mode 100644 index 0000000000..d5aa46ce06 --- /dev/null +++ b/internal/impl/genkit/vertexai_embed_processor.go @@ -0,0 +1,99 @@ +package genkit + +import ( + "fmt" + + "github.com/firebase/genkit/go/ai" + "github.com/firebase/genkit/go/plugins/googlegenai" + "github.com/warpstreamlabs/bento/public/service" +) + +func vertexAIEmbedProcessorConfigSpec() *service.ConfigSpec { + return service.NewConfigSpec(). + Beta(). + Categories("AI", "Genkit"). + Summary("Generates embeddings using Vertex AI models."). + Description("Generates text embeddings using Google Cloud Vertex AI embedding models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit."). + Fields(commonEmbedFields()...). + Field(service.NewStringField("project_id"). + Description("Google Cloud project ID. If not provided, will use GOOGLE_CLOUD_PROJECT environment variable."). + Optional()). + Field(service.NewStringField("location"). + Description("Google Cloud location/region. If not provided, will use GOOGLE_CLOUD_LOCATION or GOOGLE_CLOUD_REGION environment variables."). + Optional()). + Example("Text Embedding with Vertex AI", ` +Generate embeddings using Google Cloud Vertex AI models: + +`+"```yaml"+` +pipeline: + processors: + - genkit_vertexai_embed: + project_id: "my-gcp-project" + location: "us-central1" + model: "text-embedding-004" +`+"```"+``, "") +} + +func init() { + err := service.RegisterProcessor( + "genkit_vertexai_embed", vertexAIEmbedProcessorConfigSpec(), + func(conf *service.ParsedConfig, mgr *service.Resources) (service.Processor, error) { + return newVertexAIEmbedder(conf, mgr) + }) + if err != nil { + panic(err) + } +} + +func newVertexAIEmbedder(pconf *service.ParsedConfig, res *service.Resources) (service.Processor, error) { + var projectID, location string + var err error + + if pconf.Contains("project_id") { + projectID, err = pconf.FieldString("project_id") + if err != nil { + return nil, err + } + } + + if pconf.Contains("location") { + location, err = pconf.FieldString("location") + if err != nil { + return nil, err + } + } + + vertexAIPlugin := &googlegenai.VertexAI{ + ProjectID: projectID, + Location: location, + } + + plugin, err := InitPlugin(res, vertexAIPlugin) + if err != nil { + return nil, err + } + + modelName, err := pconf.FieldString(modelField) + if err != nil { + return nil, err + } + + g, err := LoadInstance(res) + if err != nil { + return nil, err + } + + embedder := googlegenai.VertexAIEmbedder(g, modelName) + if embedder == nil { + embedder, err = plugin.DefineEmbedder(g, modelName, &ai.EmbedderOptions{}) + if err != nil { + return nil, fmt.Errorf("failed to define embedder for model %s: %w", modelName, err) + } + } + + if embedder == nil { + return nil, fmt.Errorf("embedder not found for plugin %s with model %s - ensure the model is available", plugin.Name(), modelName) + } + + return newEmbedderProcessor(pconf, nil, embedder) +} diff --git a/internal/impl/genkit/vertexai_processor.go b/internal/impl/genkit/vertexai_processor.go new file mode 100644 index 0000000000..a9a46c310b --- /dev/null +++ b/internal/impl/genkit/vertexai_processor.go @@ -0,0 +1,122 @@ +package genkit + +import ( + "fmt" + + "github.com/firebase/genkit/go/plugins/googlegenai" + "github.com/warpstreamlabs/bento/public/service" + "google.golang.org/genai" +) + +func vertexAICompatibleSpec() *service.ConfigSpec { + return service.NewConfigSpec(). + Beta(). + Categories("AI", "Genkit"). + Summary("Generates content using Vertex AI models."). + Description("Generates text content using Google Cloud Vertex AI models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit."). + Fields( + service.NewStringField("project_id"). + Description("Google Cloud project ID. If not provided, will use GOOGLE_CLOUD_PROJECT environment variable."). + Optional(), + service.NewStringField("location"). + Description("Google Cloud location/region. If not provided, will use GOOGLE_CLOUD_LOCATION or GOOGLE_CLOUD_REGION environment variables."). + Optional(), + ).Fields( + commonGenerateFields()..., + ). + Example("Chat Completion with Vertex AI", ` +Generate text using Google Cloud Vertex AI models: + +`+"```yaml"+` +pipeline: + processors: + - genkit_vertexai: + project_id: "my-gcp-project" + location: "us-central1" + model: "gemini-1.5-flash" + config: + temperature: 0.7 + max_output_tokens: 256 + prompt: | + {{role "system"}} + You are a helpful assistant. + {{role "user"}} + ${! content() } +`+"```"+``, "") +} + +func init() { + err := service.RegisterProcessor( + "genkit_vertexai", vertexAICompatibleSpec(), + func(conf *service.ParsedConfig, res *service.Resources) (service.Processor, error) { + plugin, err := newVertexAIPlugin(conf) + if err != nil { + return nil, err + } + + return newVertexAIProcessor(conf, res, plugin) + }) + if err != nil { + panic(err) + } +} + +func newVertexAIPlugin(pconf *service.ParsedConfig) (*googlegenai.VertexAI, error) { + var projectID, location string + var err error + + if pconf.Contains("project_id") { + projectID, err = pconf.FieldString("project_id") + if err != nil { + return nil, err + } + } + + if pconf.Contains("location") { + location, err = pconf.FieldString("location") + if err != nil { + return nil, err + } + } + + return &googlegenai.VertexAI{ + ProjectID: projectID, + Location: location, + }, nil +} + +func newVertexAIProcessor(pconf *service.ParsedConfig, res *service.Resources, plugin *googlegenai.VertexAI) (service.Processor, error) { + modelName, err := pconf.FieldString(modelField) + if err != nil { + return nil, err + } + + genkitConf, err := parseModelConfig(pconf) + if err != nil { + return nil, err + } + + config := &genai.GenerateContentConfig{ + Temperature: genai.Ptr(float32(genkitConf.Temperature)), + TopP: genai.Ptr(float32(genkitConf.TopP)), + TopK: genai.Ptr(float32(genkitConf.TopK)), + MaxOutputTokens: int32(genkitConf.MaxOutputTokens), + StopSequences: genkitConf.StopSequences, + } + + if _, err = InitPlugin(res, plugin); err != nil { + return nil, err + } + + g, err := LoadInstance(res) + if err != nil { + return nil, err + } + + model := googlegenai.VertexAIModel(g, modelName) + if model == nil { + return nil, fmt.Errorf("could not find model %s", modelName) + } + + return newGenkitProcessor(pconf, res, config, model) +} diff --git a/public/components/all/package.go b/public/components/all/package.go index 04e0b823ef..fa11ee5ee8 100644 --- a/public/components/all/package.go +++ b/public/components/all/package.go @@ -23,6 +23,7 @@ import ( _ "github.com/warpstreamlabs/bento/public/components/elasticsearch" _ "github.com/warpstreamlabs/bento/public/components/etcd" _ "github.com/warpstreamlabs/bento/public/components/gcp" + _ "github.com/warpstreamlabs/bento/public/components/genkit" _ "github.com/warpstreamlabs/bento/public/components/hdfs" _ "github.com/warpstreamlabs/bento/public/components/huggingface" _ "github.com/warpstreamlabs/bento/public/components/influxdb" diff --git a/public/service/config_processor.go b/public/service/config_processor.go index 6278ff75b7..0170a319a1 100644 --- a/public/service/config_processor.go +++ b/public/service/config_processor.go @@ -91,3 +91,44 @@ func (p *ParsedConfig) FieldProcessorList(path ...string) ([]*OwnedProcessor, er return procs, nil } + +// NewProcessorMapField defines a new processor map field, it is then possible to +// extract a map of OwnedProcessor from the resulting parsed config with the +// method FieldProcessorMap. +func NewProcessorMapField(name string) *ConfigField { + return &ConfigField{ + field: docs.FieldProcessor(name, "").Map(), + } +} + +// FieldProcessorMap accesses a field from a parsed config that was defined +// with NewProcessorMapField and returns a map of OwnedProcessor, or an error if the +// configuration was invalid. +func (p *ParsedConfig) FieldProcessorMap(path ...string) (map[string]*OwnedProcessor, error) { + field, exists := p.i.Field(path...) + if !exists { + return nil, fmt.Errorf("field '%v' was not found in the config", strings.Join(path, ".")) + } + + fieldMap, ok := field.(map[string]any) + if !ok { + return nil, fmt.Errorf("unexpected value, expected object, got %T", field) + } + + tmpMgr := p.mgr.IntoPath(path...) + procs := make(map[string]*OwnedProcessor, len(fieldMap)) + for k, v := range fieldMap { + conf, err := processor.FromAny(p.mgr.Environment(), v) + if err != nil { + return nil, fmt.Errorf("value %v: %w", k, err) + } + + iproc, err := tmpMgr.IntoPath(k).NewProcessor(conf) + if err != nil { + return nil, fmt.Errorf("processor %v: %w", k, err) + } + procs[k] = &OwnedProcessor{iproc} + } + + return procs, nil +} diff --git a/public/service/resources.go b/public/service/resources.go index 3e6539e193..cbfc87eef3 100644 --- a/public/service/resources.go +++ b/public/service/resources.go @@ -93,6 +93,10 @@ func (r *Resources) Label() string { return r.mgr.Label() } +func (r *Resources) Path() []string { + return r.mgr.Path() +} + // Logger returns a logger preset with context about the component the resources // were provided to. func (r *Resources) Logger() *Logger { diff --git a/website/docs/components/processors/genkit_anthropic.md b/website/docs/components/processors/genkit_anthropic.md new file mode 100644 index 0000000000..970e03dbbf --- /dev/null +++ b/website/docs/components/processors/genkit_anthropic.md @@ -0,0 +1,218 @@ +--- +title: genkit_anthropic +slug: genkit_anthropic +type: processor +status: beta +categories: ["AI","Genkit"] +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::caution BETA +This component is mostly stable but breaking changes could still be made outside of major version releases if a fundamental problem with the component is found. +::: +Generates content using Anthropic models. + +```yml +# Config fields, showing default values +label: "" +genkit_anthropic: + address: "" # No default (optional) + api_key: ${ANTHROPIC_API_KEY} # No default (required) + model: "" # No default (required) + config: + max_output_tokens: 0 # No default (optional) + stop_sequences: [] # No default (optional) + temperature: 0 # No default (optional) + top_k: 0 # No default (optional) + top_p: 0 # No default (optional) + prompt: "" # No default (required) + tools: [] # No default (optional) + output: + schema: null # No default (optional) + format: text + instructions: "" # No default (optional) +``` + +Generates text content using Anthropic models through the Genkit framework. Supports Claude models with advanced reasoning capabilities. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit. + +## Examples + + + + + + +Generate text using Anthropic's Claude models: + +```yaml +pipeline: + processors: + - genkit_anthropic: + api_key: "${ANTHROPIC_API_KEY}" + model: "claude-3-5-haiku-20241022" + config: + temperature: 0.7 + max_output_tokens: 256 + prompt: | + {{role "system"}} + You are a helpful assistant. + {{role "user"}} + ${! content() } +``` + + + + + +## Fields + +### `address` + +Server address of Anthropic API. + + +Type: `string` + +### `api_key` + +Anthropic API key. +:::warning Secret +This field contains sensitive information that usually shouldn't be added to a config directly, read our [secrets page for more info](/docs/configuration/secrets). +::: + + +Type: `string` + +```yml +# Examples + +api_key: ${ANTHROPIC_API_KEY} +``` + +### `model` + +Model identifier. + + +Type: `string` + +### `config` + +Model configuration matching common Genkit parameters. + + +Type: `object` + +### `config.max_output_tokens` + +Maximum tokens the model can output. + + +Type: `int` + +### `config.stop_sequences` + +List of stop sequences. + + +Type: `array` + +### `config.temperature` + +Controls randomness (0.0 to 1.0). + + +Type: `float` + +### `config.top_k` + +Top-K sampling parameter. + + +Type: `int` + +### `config.top_p` + +Top-P sampling parameter. + + +Type: `float` + +### `prompt` + +Prompt template. use bento bloblang interpolation for injecting in custom data. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + +### `tools` + +A map of processors that the model can utilise as tools. + + +Type: `array` + +### `tools[].processor` + +Sorry! This field is missing documentation. + + +Type: `processor` + +### `tools[].name` + +Sorry! This field is missing documentation. + + +Type: `string` + +### `tools[].description` + +Sorry! This field is missing documentation. + + +Type: `string` + +### `output` + +Determines the schema/format of the output. + + +Type: `object` + +### `output.schema` + +Output schema in Picoschema format. + + +Type: `unknown` + +### `output.format` + +The format of the response. + + +Type: `string` +Default: `"text"` +Options: `json`, `jsonl`, `text`, `array`, `enum`. + +### `output.instructions` + +Instructions for the model output. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + + diff --git a/website/docs/components/processors/genkit_googlegenai.md b/website/docs/components/processors/genkit_googlegenai.md new file mode 100644 index 0000000000..9292acf5b5 --- /dev/null +++ b/website/docs/components/processors/genkit_googlegenai.md @@ -0,0 +1,212 @@ +--- +title: genkit_googlegenai +slug: genkit_googlegenai +type: processor +status: beta +categories: ["AI","Genkit"] +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::caution BETA +This component is mostly stable but breaking changes could still be made outside of major version releases if a fundamental problem with the component is found. +::: +Generates content using Google AI models. + +```yml +# Config fields, showing default values +label: "" +genkit_googlegenai: + api_key: ${GOOGLE_API_KEY} # No default (required) + model: "" # No default (required) + config: + max_output_tokens: 0 # No default (optional) + stop_sequences: [] # No default (optional) + temperature: 0 # No default (optional) + top_k: 0 # No default (optional) + top_p: 0 # No default (optional) + prompt: "" # No default (required) + tools: [] # No default (optional) + output: + schema: null # No default (optional) + format: text + instructions: "" # No default (optional) +``` + +Generates text content using Google AI models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit. + +## Examples + + + + + + +Generate text using Google AI models: + +```yaml +pipeline: + processors: + - genkit_googlegenai: + api_key: "${GOOGLE_AI_API_KEY}" + model: "gemini-1.5-flash" + config: + temperature: 0.7 + max_output_tokens: 256 + prompt: | + {{role "system"}} + You are a helpful assistant. + {{role "user"}} + ${! content() } +``` + + + + + +## Fields + +### `api_key` + +Google AI API key. +:::warning Secret +This field contains sensitive information that usually shouldn't be added to a config directly, read our [secrets page for more info](/docs/configuration/secrets). +::: + + +Type: `string` + +```yml +# Examples + +api_key: ${GOOGLE_API_KEY} + +api_key: ${GEMINI_API_KEY} +``` + +### `model` + +Model identifier. + + +Type: `string` + +### `config` + +Model configuration matching common Genkit parameters. + + +Type: `object` + +### `config.max_output_tokens` + +Maximum tokens the model can output. + + +Type: `int` + +### `config.stop_sequences` + +List of stop sequences. + + +Type: `array` + +### `config.temperature` + +Controls randomness (0.0 to 1.0). + + +Type: `float` + +### `config.top_k` + +Top-K sampling parameter. + + +Type: `int` + +### `config.top_p` + +Top-P sampling parameter. + + +Type: `float` + +### `prompt` + +Prompt template. use bento bloblang interpolation for injecting in custom data. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + +### `tools` + +A map of processors that the model can utilise as tools. + + +Type: `array` + +### `tools[].processor` + +Sorry! This field is missing documentation. + + +Type: `processor` + +### `tools[].name` + +Sorry! This field is missing documentation. + + +Type: `string` + +### `tools[].description` + +Sorry! This field is missing documentation. + + +Type: `string` + +### `output` + +Determines the schema/format of the output. + + +Type: `object` + +### `output.schema` + +Output schema in Picoschema format. + + +Type: `unknown` + +### `output.format` + +The format of the response. + + +Type: `string` +Default: `"text"` +Options: `json`, `jsonl`, `text`, `array`, `enum`. + +### `output.instructions` + +Instructions for the model output. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + + diff --git a/website/docs/components/processors/genkit_googlegenai_embed.md b/website/docs/components/processors/genkit_googlegenai_embed.md new file mode 100644 index 0000000000..642da2511e --- /dev/null +++ b/website/docs/components/processors/genkit_googlegenai_embed.md @@ -0,0 +1,140 @@ +--- +title: genkit_googlegenai_embed +slug: genkit_googlegenai_embed +type: processor +status: beta +categories: ["AI","Genkit"] +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::caution BETA +This component is mostly stable but breaking changes could still be made outside of major version releases if a fundamental problem with the component is found. +::: +Generates embeddings using Google AI models. + +```yml +# Config fields, showing default values +label: "" +genkit_googlegenai_embed: + model: "" # No default (required) + config: + max_output_tokens: 0 # No default (optional) + stop_sequences: [] # No default (optional) + temperature: 0 # No default (optional) + top_k: 0 # No default (optional) + top_p: 0 # No default (optional) + prompt: "" # No default (optional) + api_key: ${GOOGLE_API_KEY} # No default (required) +``` + +Generates text embeddings using Google AI's embedding models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit. + +## Examples + + + + + + +Generate embeddings using Google AI embedding models: + +```yaml +pipeline: + processors: + - genkit_googlegenai_embed: + api_key: "${GOOGLE_AI_API_KEY}" + model: "text-embedding-004" +``` + + + + + +## Fields + +### `model` + +Model identifier. + + +Type: `string` + +### `config` + +Model configuration matching common Genkit parameters. + + +Type: `object` + +### `config.max_output_tokens` + +Maximum tokens the model can output. + + +Type: `int` + +### `config.stop_sequences` + +List of stop sequences. + + +Type: `array` + +### `config.temperature` + +Controls randomness (0.0 to 1.0). + + +Type: `float` + +### `config.top_k` + +Top-K sampling parameter. + + +Type: `int` + +### `config.top_p` + +Top-P sampling parameter. + + +Type: `float` + +### `prompt` + +Prompt template. use bento bloblang interpolation for injecting in custom data. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + +### `api_key` + +Google AI API key. +:::warning Secret +This field contains sensitive information that usually shouldn't be added to a config directly, read our [secrets page for more info](/docs/configuration/secrets). +::: + + +Type: `string` + +```yml +# Examples + +api_key: ${GOOGLE_API_KEY} + +api_key: ${GEMINI_API_KEY} +``` + + diff --git a/website/docs/components/processors/genkit_ollama.md b/website/docs/components/processors/genkit_ollama.md new file mode 100644 index 0000000000..448544f75e --- /dev/null +++ b/website/docs/components/processors/genkit_ollama.md @@ -0,0 +1,213 @@ +--- +title: genkit_ollama +slug: genkit_ollama +type: processor +status: beta +categories: ["AI","Genkit"] +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::caution BETA +This component is mostly stable but breaking changes could still be made outside of major version releases if a fundamental problem with the component is found. +::: +Generates content using Ollama models. + +```yml +# Config fields, showing default values +label: "" +genkit_ollama: + address: http://localhost:11434 + type: generate + model: "" # No default (required) + config: + max_output_tokens: 0 # No default (optional) + stop_sequences: [] # No default (optional) + temperature: 0 # No default (optional) + top_k: 0 # No default (optional) + top_p: 0 # No default (optional) + prompt: "" # No default (required) + tools: [] # No default (optional) + output: + schema: null # No default (optional) + format: text + instructions: "" # No default (optional) +``` + +Generates text content using Ollama models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit. + +## Examples + + + + + + +Generate text using Ollama models in chat mode: + +```yaml +pipeline: + processors: + - genkit_ollama: + address: "http://localhost:11434" + model: "llama3.2" + type: "chat" + config: + temperature: 0.7 + max_output_tokens: 256 + prompt: | + {{role "system"}} + You are a helpful assistant. + {{role "user"}} + ${! content() } +``` + + + + + +## Fields + +### `address` + +Server address of Ollama instance. + + +Type: `string` +Default: `"http://localhost:11434"` + +### `type` + +The type of task the model should perform. + + +Type: `string` +Default: `"generate"` +Options: `chat`, `generate`. + +### `model` + +Model identifier. + + +Type: `string` + +### `config` + +Model configuration matching common Genkit parameters. + + +Type: `object` + +### `config.max_output_tokens` + +Maximum tokens the model can output. + + +Type: `int` + +### `config.stop_sequences` + +List of stop sequences. + + +Type: `array` + +### `config.temperature` + +Controls randomness (0.0 to 1.0). + + +Type: `float` + +### `config.top_k` + +Top-K sampling parameter. + + +Type: `int` + +### `config.top_p` + +Top-P sampling parameter. + + +Type: `float` + +### `prompt` + +Prompt template. use bento bloblang interpolation for injecting in custom data. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + +### `tools` + +A map of processors that the model can utilise as tools. + + +Type: `array` + +### `tools[].processor` + +Sorry! This field is missing documentation. + + +Type: `processor` + +### `tools[].name` + +Sorry! This field is missing documentation. + + +Type: `string` + +### `tools[].description` + +Sorry! This field is missing documentation. + + +Type: `string` + +### `output` + +Determines the schema/format of the output. + + +Type: `object` + +### `output.schema` + +Output schema in Picoschema format. + + +Type: `unknown` + +### `output.format` + +The format of the response. + + +Type: `string` +Default: `"text"` +Options: `json`, `jsonl`, `text`, `array`, `enum`. + +### `output.instructions` + +Instructions for the model output. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + + diff --git a/website/docs/components/processors/genkit_ollama_embed.md b/website/docs/components/processors/genkit_ollama_embed.md new file mode 100644 index 0000000000..e69148bc06 --- /dev/null +++ b/website/docs/components/processors/genkit_ollama_embed.md @@ -0,0 +1,130 @@ +--- +title: genkit_ollama_embed +slug: genkit_ollama_embed +type: processor +status: beta +categories: ["AI","Genkit"] +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::caution BETA +This component is mostly stable but breaking changes could still be made outside of major version releases if a fundamental problem with the component is found. +::: +Generates embeddings using Ollama models. + +```yml +# Config fields, showing default values +label: "" +genkit_ollama_embed: + model: "" # No default (required) + config: + max_output_tokens: 0 # No default (optional) + stop_sequences: [] # No default (optional) + temperature: 0 # No default (optional) + top_k: 0 # No default (optional) + top_p: 0 # No default (optional) + prompt: "" # No default (optional) + address: http://localhost:11434 +``` + +Generates text embeddings using Ollama models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit. + +## Examples + + + + + + +Generate embeddings for text content using a local Ollama instance: + +```yaml +pipeline: + processors: + - genkit_ollama_embed: + address: "http://localhost:11434" + model: "nomic-embed-text" +``` + + + + + +## Fields + +### `model` + +Ollama embedding model to use (e.g., 'nomic-embed-text', 'all-minilm'). + + +Type: `string` + +### `config` + +Model configuration matching common Genkit parameters. + + +Type: `object` + +### `config.max_output_tokens` + +Maximum tokens the model can output. + + +Type: `int` + +### `config.stop_sequences` + +List of stop sequences. + + +Type: `array` + +### `config.temperature` + +Controls randomness (0.0 to 1.0). + + +Type: `float` + +### `config.top_k` + +Top-K sampling parameter. + + +Type: `int` + +### `config.top_p` + +Top-P sampling parameter. + + +Type: `float` + +### `prompt` + +Prompt template. use bento bloblang interpolation for injecting in custom data. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + +### `address` + +Server address of Ollama instance. + + +Type: `string` +Default: `"http://localhost:11434"` + + diff --git a/website/docs/components/processors/genkit_openai.md b/website/docs/components/processors/genkit_openai.md new file mode 100644 index 0000000000..5260e958a7 --- /dev/null +++ b/website/docs/components/processors/genkit_openai.md @@ -0,0 +1,218 @@ +--- +title: genkit_openai +slug: genkit_openai +type: processor +status: beta +categories: ["AI","Genkit"] +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::caution BETA +This component is mostly stable but breaking changes could still be made outside of major version releases if a fundamental problem with the component is found. +::: +Generates content using OpenAI models. + +```yml +# Config fields, showing default values +label: "" +genkit_openai: + address: "" # No default (optional) + api_key: ${OPENAI_API_KEY} # No default (required) + model: "" # No default (required) + config: + max_output_tokens: 0 # No default (optional) + stop_sequences: [] # No default (optional) + temperature: 0 # No default (optional) + top_k: 0 # No default (optional) + top_p: 0 # No default (optional) + prompt: "" # No default (required) + tools: [] # No default (optional) + output: + schema: null # No default (optional) + format: text + instructions: "" # No default (optional) +``` + +Generates text content using OpenAI models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit. + +## Examples + + + + + + +Generate text using OpenAI models: + +```yaml +pipeline: + processors: + - genkit_openai: + api_key: "${OPENAI_API_KEY}" + model: "gpt-4o-mini" + config: + temperature: 0.7 + max_output_tokens: 256 + prompt: | + {{role "system"}} + You are a helpful assistant. + {{role "user"}} + ${! content() } +``` + + + + + +## Fields + +### `address` + +Server address of OpenAI API. + + +Type: `string` + +### `api_key` + +OpenAI API key. +:::warning Secret +This field contains sensitive information that usually shouldn't be added to a config directly, read our [secrets page for more info](/docs/configuration/secrets). +::: + + +Type: `string` + +```yml +# Examples + +api_key: ${OPENAI_API_KEY} +``` + +### `model` + +Model identifier. + + +Type: `string` + +### `config` + +Model configuration matching common Genkit parameters. + + +Type: `object` + +### `config.max_output_tokens` + +Maximum tokens the model can output. + + +Type: `int` + +### `config.stop_sequences` + +List of stop sequences. + + +Type: `array` + +### `config.temperature` + +Controls randomness (0.0 to 1.0). + + +Type: `float` + +### `config.top_k` + +Top-K sampling parameter. + + +Type: `int` + +### `config.top_p` + +Top-P sampling parameter. + + +Type: `float` + +### `prompt` + +Prompt template. use bento bloblang interpolation for injecting in custom data. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + +### `tools` + +A map of processors that the model can utilise as tools. + + +Type: `array` + +### `tools[].processor` + +Sorry! This field is missing documentation. + + +Type: `processor` + +### `tools[].name` + +Sorry! This field is missing documentation. + + +Type: `string` + +### `tools[].description` + +Sorry! This field is missing documentation. + + +Type: `string` + +### `output` + +Determines the schema/format of the output. + + +Type: `object` + +### `output.schema` + +Output schema in Picoschema format. + + +Type: `unknown` + +### `output.format` + +The format of the response. + + +Type: `string` +Default: `"text"` +Options: `json`, `jsonl`, `text`, `array`, `enum`. + +### `output.instructions` + +Instructions for the model output. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + + diff --git a/website/docs/components/processors/genkit_openai_embed.md b/website/docs/components/processors/genkit_openai_embed.md new file mode 100644 index 0000000000..e640f9f9f4 --- /dev/null +++ b/website/docs/components/processors/genkit_openai_embed.md @@ -0,0 +1,146 @@ +--- +title: genkit_openai_embed +slug: genkit_openai_embed +type: processor +status: beta +categories: ["AI","Genkit"] +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::caution BETA +This component is mostly stable but breaking changes could still be made outside of major version releases if a fundamental problem with the component is found. +::: +Generates embeddings using OpenAI models. + +```yml +# Config fields, showing default values +label: "" +genkit_openai_embed: + model: "" # No default (required) + config: + max_output_tokens: 0 # No default (optional) + stop_sequences: [] # No default (optional) + temperature: 0 # No default (optional) + top_k: 0 # No default (optional) + top_p: 0 # No default (optional) + prompt: "" # No default (optional) + address: "" # No default (optional) + api_key: ${OPENAI_API_KEY} # No default (required) +``` + +Generates text embeddings using OpenAI's embedding models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit. + +## Examples + + + + + + +Generate embeddings using OpenAI's embedding models: + +```yaml +pipeline: + processors: + - genkit_openai_embed: + api_key: "${OPENAI_API_KEY}" + model: "text-embedding-3-small" +``` + + + + + +## Fields + +### `model` + +Model identifier. + + +Type: `string` + +### `config` + +Model configuration matching common Genkit parameters. + + +Type: `object` + +### `config.max_output_tokens` + +Maximum tokens the model can output. + + +Type: `int` + +### `config.stop_sequences` + +List of stop sequences. + + +Type: `array` + +### `config.temperature` + +Controls randomness (0.0 to 1.0). + + +Type: `float` + +### `config.top_k` + +Top-K sampling parameter. + + +Type: `int` + +### `config.top_p` + +Top-P sampling parameter. + + +Type: `float` + +### `prompt` + +Prompt template. use bento bloblang interpolation for injecting in custom data. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + +### `address` + +Server address of OpenAI API. + + +Type: `string` + +### `api_key` + +OpenAI API key. +:::warning Secret +This field contains sensitive information that usually shouldn't be added to a config directly, read our [secrets page for more info](/docs/configuration/secrets). +::: + + +Type: `string` + +```yml +# Examples + +api_key: ${OPENAI_API_KEY} +``` + + diff --git a/website/docs/components/processors/genkit_vertexai.md b/website/docs/components/processors/genkit_vertexai.md new file mode 100644 index 0000000000..09a2a7d5d3 --- /dev/null +++ b/website/docs/components/processors/genkit_vertexai.md @@ -0,0 +1,210 @@ +--- +title: genkit_vertexai +slug: genkit_vertexai +type: processor +status: beta +categories: ["AI","Genkit"] +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::caution BETA +This component is mostly stable but breaking changes could still be made outside of major version releases if a fundamental problem with the component is found. +::: +Generates content using Vertex AI models. + +```yml +# Config fields, showing default values +label: "" +genkit_vertexai: + project_id: "" # No default (optional) + location: "" # No default (optional) + model: "" # No default (required) + config: + max_output_tokens: 0 # No default (optional) + stop_sequences: [] # No default (optional) + temperature: 0 # No default (optional) + top_k: 0 # No default (optional) + top_p: 0 # No default (optional) + prompt: "" # No default (required) + tools: [] # No default (optional) + output: + schema: null # No default (optional) + format: text + instructions: "" # No default (optional) +``` + +Generates text content using Google Cloud Vertex AI models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit. + +## Examples + + + + + + +Generate text using Google Cloud Vertex AI models: + +```yaml +pipeline: + processors: + - genkit_vertexai: + project_id: "my-gcp-project" + location: "us-central1" + model: "gemini-1.5-flash" + config: + temperature: 0.7 + max_output_tokens: 256 + prompt: | + {{role "system"}} + You are a helpful assistant. + {{role "user"}} + ${! content() } +``` + + + + + +## Fields + +### `project_id` + +Google Cloud project ID. If not provided, will use GOOGLE_CLOUD_PROJECT environment variable. + + +Type: `string` + +### `location` + +Google Cloud location/region. If not provided, will use GOOGLE_CLOUD_LOCATION or GOOGLE_CLOUD_REGION environment variables. + + +Type: `string` + +### `model` + +Model identifier. + + +Type: `string` + +### `config` + +Model configuration matching common Genkit parameters. + + +Type: `object` + +### `config.max_output_tokens` + +Maximum tokens the model can output. + + +Type: `int` + +### `config.stop_sequences` + +List of stop sequences. + + +Type: `array` + +### `config.temperature` + +Controls randomness (0.0 to 1.0). + + +Type: `float` + +### `config.top_k` + +Top-K sampling parameter. + + +Type: `int` + +### `config.top_p` + +Top-P sampling parameter. + + +Type: `float` + +### `prompt` + +Prompt template. use bento bloblang interpolation for injecting in custom data. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + +### `tools` + +A map of processors that the model can utilise as tools. + + +Type: `array` + +### `tools[].processor` + +Sorry! This field is missing documentation. + + +Type: `processor` + +### `tools[].name` + +Sorry! This field is missing documentation. + + +Type: `string` + +### `tools[].description` + +Sorry! This field is missing documentation. + + +Type: `string` + +### `output` + +Determines the schema/format of the output. + + +Type: `object` + +### `output.schema` + +Output schema in Picoschema format. + + +Type: `unknown` + +### `output.format` + +The format of the response. + + +Type: `string` +Default: `"text"` +Options: `json`, `jsonl`, `text`, `array`, `enum`. + +### `output.instructions` + +Instructions for the model output. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + + diff --git a/website/docs/components/processors/genkit_vertexai_embed.md b/website/docs/components/processors/genkit_vertexai_embed.md new file mode 100644 index 0000000000..b3a84c9938 --- /dev/null +++ b/website/docs/components/processors/genkit_vertexai_embed.md @@ -0,0 +1,138 @@ +--- +title: genkit_vertexai_embed +slug: genkit_vertexai_embed +type: processor +status: beta +categories: ["AI","Genkit"] +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::caution BETA +This component is mostly stable but breaking changes could still be made outside of major version releases if a fundamental problem with the component is found. +::: +Generates embeddings using Vertex AI models. + +```yml +# Config fields, showing default values +label: "" +genkit_vertexai_embed: + model: "" # No default (required) + config: + max_output_tokens: 0 # No default (optional) + stop_sequences: [] # No default (optional) + temperature: 0 # No default (optional) + top_k: 0 # No default (optional) + top_p: 0 # No default (optional) + prompt: "" # No default (optional) + project_id: "" # No default (optional) + location: "" # No default (optional) +``` + +Generates text embeddings using Google Cloud Vertex AI embedding models through the Genkit framework. For more information about Genkit, see https://genkit.dev and https://github.com/firebase/genkit. + +## Examples + + + + + + +Generate embeddings using Google Cloud Vertex AI models: + +```yaml +pipeline: + processors: + - genkit_vertexai_embed: + project_id: "my-gcp-project" + location: "us-central1" + model: "text-embedding-004" +``` + + + + + +## Fields + +### `model` + +Model identifier. + + +Type: `string` + +### `config` + +Model configuration matching common Genkit parameters. + + +Type: `object` + +### `config.max_output_tokens` + +Maximum tokens the model can output. + + +Type: `int` + +### `config.stop_sequences` + +List of stop sequences. + + +Type: `array` + +### `config.temperature` + +Controls randomness (0.0 to 1.0). + + +Type: `float` + +### `config.top_k` + +Top-K sampling parameter. + + +Type: `int` + +### `config.top_p` + +Top-P sampling parameter. + + +Type: `float` + +### `prompt` + +Prompt template. use bento bloblang interpolation for injecting in custom data. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + +### `project_id` + +Google Cloud project ID. If not provided, will use GOOGLE_CLOUD_PROJECT environment variable. + + +Type: `string` + +### `location` + +Google Cloud location/region. If not provided, will use GOOGLE_CLOUD_LOCATION or GOOGLE_CLOUD_REGION environment variables. + + +Type: `string` + + diff --git a/website/docs/components/processors/ollama_embed.md b/website/docs/components/processors/ollama_embed.md new file mode 100644 index 0000000000..41d8583b02 --- /dev/null +++ b/website/docs/components/processors/ollama_embed.md @@ -0,0 +1,107 @@ +--- +title: ollama_embed +slug: ollama_embed +type: processor +status: beta +categories: ["AI","Genkit"] +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::caution BETA +This component is mostly stable but breaking changes could still be made outside of major version releases if a fundamental problem with the component is found. +::: +Generates embeddings using Ollama models. + +```yml +# Config fields, showing default values +label: "" +ollama_embed: + model: "" # No default (required) + config: + maxOutputTokens: 0 # No default (optional) + stopSequences: [] # No default (optional) + temperature: 0 # No default (optional) + topK: 0 # No default (optional) + topP: 0 # No default (optional) + prompt: "" # No default (required) + address: http://localhost:11434 +``` + +foo + +## Fields + +### `model` + +Ollama embedding model to use (e.g., 'nomic-embed-text', 'all-minilm'). + + +Type: `string` + +### `config` + +Model configuration matching common Genkit parameters. + + +Type: `object` + +### `config.maxOutputTokens` + +Maximum tokens the model can output. + + +Type: `int` + +### `config.stopSequences` + +List of stop sequences. + + +Type: `array` + +### `config.temperature` + +Controls randomness (0.0 to 1.0). + + +Type: `float` + +### `config.topK` + +Top-K sampling parameter. + + +Type: `int` + +### `config.topP` + +Top-P sampling parameter. + + +Type: `float` + +### `prompt` + +Prompt template. use bento bloblang interpolation for injecting in custom data. +This field supports [interpolation functions](/docs/configuration/interpolation#bloblang-queries). + + +Type: `string` + +### `address` + +Server address of Ollama instance. + + +Type: `string` +Default: `"http://localhost:11434"` + + From 1bfea35cb69199729c149f303bb2b2363312be7a Mon Sep 17 00:00:00 2001 From: Greg Furman Date: Sat, 27 Sep 2025 12:46:32 +0200 Subject: [PATCH 2/2] fix: Include public component package --- public/components/genkit/package.go | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 public/components/genkit/package.go diff --git a/public/components/genkit/package.go b/public/components/genkit/package.go new file mode 100644 index 0000000000..40ca32b67e --- /dev/null +++ b/public/components/genkit/package.go @@ -0,0 +1,6 @@ +package genkit + +import ( + // Bring in the internal plugin definitions. + _ "github.com/warpstreamlabs/bento/internal/impl/genkit" +)