From 5ba0d5df7e96644e9a7da5a7f24328f15067d811 Mon Sep 17 00:00:00 2001 From: Steve Dudenhoeffer Date: Mon, 7 Apr 2025 01:57:02 -0400 Subject: [PATCH] instead of having an openai => google translation layer, just add sister functions to the types that construct the google request just like openai's --- function.go | 12 ----- go.mod | 57 ++++++++++----------- go.sum | 128 ++++++++++++++++++++++------------------------ google.go | 51 +----------------- openai.go | 2 +- schema/GetType.go | 18 +++---- schema/array.go | 25 ++++----- schema/basic.go | 55 ++++++++++++++------ schema/enum.go | 21 ++++---- schema/object.go | 27 +++++----- schema/type.go | 11 ++-- 11 files changed, 175 insertions(+), 232 deletions(-) diff --git a/function.go b/function.go index b5ac2b4..7ffe6b1 100644 --- a/function.go +++ b/function.go @@ -8,7 +8,6 @@ import ( "time" "github.com/sashabaranov/go-openai" - "github.com/sashabaranov/go-openai/jsonschema" "gitea.stevedudenhoeffer.com/steve/go-llm/schema" ) @@ -28,9 +27,6 @@ type Function struct { fn reflect.Value paramType reflect.Type - - // definition is a cache of the openaiImpl jsonschema definition - definition *jsonschema.Definition } func (f *Function) Execute(ctx *Context, input string) (any, error) { @@ -79,14 +75,6 @@ func (f *Function) toOpenAIFunction() *openai.FunctionDefinition { Parameters: f.Parameters, } } -func (f *Function) toOpenAIDefinition() jsonschema.Definition { - if f.definition == nil { - def := f.Parameters.Definition() - f.definition = &def - } - - return *f.definition -} type FunctionCall struct { Name string `json:"name,omitempty"` diff --git a/go.mod b/go.mod index 0ea5099..8454d65 100644 --- a/go.mod +++ b/go.mod @@ -4,46 +4,45 @@ go 1.23.1 require ( github.com/google/generative-ai-go v0.19.0 - github.com/liushuangls/go-anthropic/v2 v2.13.0 - github.com/sashabaranov/go-openai v1.36.1 - golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 - google.golang.org/api v0.214.0 + github.com/liushuangls/go-anthropic/v2 v2.15.0 + github.com/openai/openai-go v0.1.0-beta.6 + github.com/sashabaranov/go-openai v1.38.1 + google.golang.org/api v0.228.0 ) require ( - cloud.google.com/go v0.117.0 // indirect - cloud.google.com/go/ai v0.9.0 // indirect - cloud.google.com/go/auth v0.13.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect + cloud.google.com/go v0.120.0 // indirect + cloud.google.com/go/ai v0.10.1 // indirect + cloud.google.com/go/auth v0.15.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/longrunning v0.6.3 // indirect + cloud.google.com/go/longrunning v0.6.6 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/google/s2a-go v0.1.8 // indirect + github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.14.1 // indirect - github.com/openai/openai-go v0.1.0-beta.6 // indirect - github.com/tidwall/gjson v1.14.4 // 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 go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect - go.opentelemetry.io/otel v1.33.0 // indirect - go.opentelemetry.io/otel/metric v1.33.0 // indirect - go.opentelemetry.io/otel/trace v1.33.0 // indirect - golang.org/x/crypto v0.32.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/oauth2 v0.24.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.8.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241223144023-3abc09e42ca8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 // indirect - google.golang.org/grpc v1.69.2 // indirect - google.golang.org/protobuf v1.36.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect + go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/otel/metric v1.35.0 // indirect + go.opentelemetry.io/otel/trace v1.35.0 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/net v0.38.0 // indirect + golang.org/x/oauth2 v0.29.0 // indirect + golang.org/x/sync v0.13.0 // indirect + golang.org/x/sys v0.32.0 // indirect + golang.org/x/text v0.24.0 // indirect + golang.org/x/time v0.11.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250404141209-ee84b53bf3d0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250404141209-ee84b53bf3d0 // indirect + google.golang.org/grpc v1.71.1 // indirect + google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/go.sum b/go.sum index 9195c05..869d1a3 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,15 @@ -cloud.google.com/go v0.117.0 h1:Z5TNFfQxj7WG2FgOGX1ekC5RiXrYgms6QscOm32M/4s= -cloud.google.com/go v0.117.0/go.mod h1:ZbwhVTb1DBGt2Iwb3tNO6SEK4q+cplHZmLWH+DelYYc= -cloud.google.com/go/ai v0.9.0 h1:r1Ig8O8+Qr3Ia3WfoO+gokD0fxB2Rk4quppuKjmGMsY= -cloud.google.com/go/ai v0.9.0/go.mod h1:28bKM/oxmRgxmRgI1GLumFv+NSkt+DscAg/gF+54zzY= -cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs= -cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q= -cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU= -cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +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/ai v0.10.1 h1:EU93KqYmMeOKgaBXAz2DshH2C/BzAT1P+iJORksLIic= +cloud.google.com/go/ai v0.10.1/go.mod h1:sWWHZvmJ83BjuxAQtYEiA0SFTpijtbH+SXWFO14ri5A= +cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= +cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= +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/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= -cloud.google.com/go/longrunning v0.6.3 h1:A2q2vuyXysRcwzqDpMMLSI6mb6o39miS52UEG/Rd2ng= -cloud.google.com/go/longrunning v0.6.3/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/longrunning v0.6.6 h1:XJNDo5MUfMM05xK3ewpbSdmt7R2Zw+aQEMbdQR65Rbw= +cloud.google.com/go/longrunning v0.6.6/go.mod h1:hyeGJUrPHcx0u2Uu1UFSoYZLn4lkMrccJig0t4FI7yw= 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/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= @@ -23,29 +23,29 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/generative-ai-go v0.19.0 h1:R71szggh8wHMCUlEMsW2A/3T+5LdEIkiaHSYgSpUgdg= github.com/google/generative-ai-go v0.19.0/go.mod h1:JYolL13VG7j79kM5BtHz4qwONHkeJQzOCkKXnpqtS/E= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -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/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +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/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -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.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= -github.com/liushuangls/go-anthropic/v2 v2.13.0 h1:f7KJ54IHxIpHPPhrCzs3SrdP2PfErXiJcJn7DUVstSA= -github.com/liushuangls/go-anthropic/v2 v2.13.0/go.mod h1:5ZwRLF5TQ+y5s/MC9Z1IJYx9WUFgQCKfqFM2xreIQLk= +github.com/liushuangls/go-anthropic/v2 v2.15.0 h1:zpplg7BRV/9FlMmeMPI0eDwhViB0l9SkNrF8ErYlRoQ= +github.com/liushuangls/go-anthropic/v2 v2.15.0/go.mod h1:kq2yW3JVy1/rph8u5KzX7F3q95CEpCT2RXp/2nfCmb4= github.com/openai/openai-go v0.1.0-beta.6 h1:JquYDpprfrGnlKvQQg+apy9dQ8R9mIrm+wNvAPp6jCQ= github.com/openai/openai-go v0.1.0-beta.6/go.mod h1:g461MYGXEXBVdV5SaR/5tNzNbSfwTBBefwc+LlDCK0Y= 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/sashabaranov/go-openai v1.36.1 h1:EVfRXwIlW2rUzpx6vR+aeIKCK/xylSrVYAx1TMTSX3g= -github.com/sashabaranov/go-openai v1.36.1/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg= +github.com/sashabaranov/go-openai v1.38.1 h1:TtZabbFQZa1nEni/IhVtDF/WQjVqDgd+cWR5OeddzF8= +github.com/sashabaranov/go-openai v1.38.1/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= -github.com/tidwall/gjson v1.14.4/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.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= @@ -55,51 +55,43 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= 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/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= -go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= -go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= -go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= -go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= -go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= -golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= -golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= -golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= -golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -google.golang.org/api v0.214.0 h1:h2Gkq07OYi6kusGOaT/9rnNljuXmqPnaig7WGPmKbwA= -google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE= -google.golang.org/genproto/googleapis/api v0.0.0-20241223144023-3abc09e42ca8 h1:st3LcW/BPi75W4q1jJTEor/QWwbNlPlDG0JTn6XhZu0= -google.golang.org/genproto/googleapis/api v0.0.0-20241223144023-3abc09e42ca8/go.mod h1:klhJGKFyG8Tn50enBn7gizg4nXGXJ+jqEREdCWaPcV4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 h1:TqExAhdPaB60Ux47Cn0oLV07rGnxZzIsaRhQaqS666A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA= -google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= -google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= -google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= -google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= +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/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.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= +go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= +go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= +go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= +go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= +go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= +golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +google.golang.org/api v0.228.0 h1:X2DJ/uoWGnY5obVjewbp8icSL5U4FzuCfy9OjbLSnLs= +google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= +google.golang.org/genproto/googleapis/api v0.0.0-20250404141209-ee84b53bf3d0 h1:Qbb5RVn5xzI4naMJSpJ7lhvmos6UwZkbekd5Uz7rt9E= +google.golang.org/genproto/googleapis/api v0.0.0-20250404141209-ee84b53bf3d0/go.mod h1:6T35kB3IPpdw7Wul09by0G/JuOuIFkXV6OOvt8IZeT8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250404141209-ee84b53bf3d0 h1:0K7wTWyzxZ7J+L47+LbFogJW1nn/gnnMCN0vGXNYtTI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250404141209-ee84b53bf3d0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= +google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/google.go b/google.go index 5c9570f..8eea66f 100644 --- a/google.go +++ b/google.go @@ -4,10 +4,8 @@ import ( "context" "encoding/json" "fmt" - "log/slog" "github.com/google/generative-ai-go/genai" - "github.com/sashabaranov/go-openai/jsonschema" "google.golang.org/api/option" ) @@ -25,62 +23,15 @@ func (g google) ModelVersion(modelVersion string) (ChatCompletion, error) { func (g google) requestToChatHistory(in Request, model *genai.GenerativeModel) (*genai.GenerativeModel, *genai.ChatSession, []genai.Part) { res := *model - var openAiSchemaToGenAISchema func(in jsonschema.Definition) *genai.Schema - openAiSchemaToGenAISchema = func(in jsonschema.Definition) *genai.Schema { - res := genai.Schema{} - - switch in.Type { - case jsonschema.Object: - res.Type = genai.TypeObject - - case jsonschema.Array: - res.Type = genai.TypeArray - - case jsonschema.String: - res.Type = genai.TypeString - - case jsonschema.Integer: - res.Type = genai.TypeInteger - - case jsonschema.Number: - res.Type = genai.TypeNumber - - case jsonschema.Boolean: - res.Type = genai.TypeBoolean - - default: - res.Type = genai.TypeUnspecified - slog.Error("unknown type in go_llm/google.go!requestToChatHistory", "type", in.Type) - } - - if in.Items != nil { - res.Items = openAiSchemaToGenAISchema(*in.Items) - } - - res.Description = in.Description - res.Enum = in.Enum - - res.Required = in.Required - if in.Properties != nil { - res.Properties = map[string]*genai.Schema{} - - for k, v := range in.Properties { - res.Properties[k] = openAiSchemaToGenAISchema(v) - } - } - - return &res - } if in.Toolbox != nil { for _, tool := range in.Toolbox.funcs { - def := tool.Parameters.Definition() res.Tools = append(res.Tools, &genai.Tool{ FunctionDeclarations: []*genai.FunctionDeclaration{ { Name: tool.Name, Description: tool.Description, - Parameters: openAiSchemaToGenAISchema(def), + Parameters: tool.Parameters.GoogleParameters(), }, }, }) diff --git a/openai.go b/openai.go index 38f3748..80c6d40 100644 --- a/openai.go +++ b/openai.go @@ -39,7 +39,7 @@ func (o openaiImpl) newRequestToOpenAIRequest(request Request) openai.ChatComple Name: tool.Name, Description: openai.String(tool.Description), Strict: openai.Bool(tool.Strict), - Parameters: tool.Parameters.FunctionParameters(), + Parameters: tool.Parameters.OpenAIParameters(), }, }) } diff --git a/schema/GetType.go b/schema/GetType.go index c2e78d3..4aa365b 100644 --- a/schema/GetType.go +++ b/schema/GetType.go @@ -3,8 +3,6 @@ package schema import ( "reflect" "strings" - - "github.com/sashabaranov/go-openai/jsonschema" ) // GetType will, given an interface{} that is a struct (NOT a pointer to a struct), return the Type of the struct that @@ -27,27 +25,27 @@ func getFromType(t reflect.Type, b basic) Type { switch t.Kind() { case reflect.String: - b.DataType = jsonschema.String + b.DataType = String b.typeName = "string" return b case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - b.DataType = jsonschema.Integer + b.DataType = Integer b.typeName = "integer" return b case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - b.DataType = jsonschema.Integer + b.DataType = Integer b.typeName = "integer" return b case reflect.Float32, reflect.Float64: - b.DataType = jsonschema.Number + b.DataType = Number b.typeName = "number" return b case reflect.Bool: - b.DataType = jsonschema.Boolean + b.DataType = Boolean b.typeName = "boolean" return b @@ -94,7 +92,7 @@ func getField(f reflect.StructField, index int) Type { } } - b.DataType = jsonschema.String + b.DataType = String b.typeName = "string" return enum{ basic: b, @@ -114,7 +112,7 @@ func getObject(t reflect.Type) object { } return object{ - basic: basic{DataType: jsonschema.Object, typeName: "object"}, + basic: basic{DataType: Object, typeName: "object"}, fields: fields, } } @@ -122,7 +120,7 @@ func getObject(t reflect.Type) object { func getArray(t reflect.Type) array { res := array{ basic: basic{ - DataType: jsonschema.Array, + DataType: Array, typeName: "array", }, } diff --git a/schema/array.go b/schema/array.go index 6417e82..a2977bc 100644 --- a/schema/array.go +++ b/schema/array.go @@ -2,10 +2,10 @@ package schema import ( "errors" - "github.com/openai/openai-go" "reflect" - "github.com/sashabaranov/go-openai/jsonschema" + "github.com/google/generative-ai-go/genai" + "github.com/openai/openai-go" ) type array struct { @@ -15,25 +15,20 @@ type array struct { items Type } -func (a array) SchemaType() jsonschema.DataType { - return jsonschema.Array -} - -func (a array) FunctionParameters() openai.FunctionParameters { +func (a array) OpenAIParameters() openai.FunctionParameters { return openai.FunctionParameters{ "type": "array", "description": a.Description(), - "items": a.items.FunctionParameters(), + "items": a.items.OpenAIParameters(), } } -func (a array) Definition() jsonschema.Definition { - def := a.basic.Definition() - def.Type = jsonschema.Array - i := a.items.Definition() - def.Items = &i - def.AdditionalProperties = false - return def +func (a array) GoogleParameters() *genai.Schema { + return &genai.Schema{ + Type: genai.TypeArray, + Description: a.Description(), + Items: a.items.GoogleParameters(), + } } func (a array) FromAny(val any) (reflect.Value, error) { diff --git a/schema/basic.go b/schema/basic.go index b9a3d42..e7f824c 100644 --- a/schema/basic.go +++ b/schema/basic.go @@ -2,18 +2,29 @@ package schema import ( "errors" - "github.com/openai/openai-go" "reflect" "strconv" - "github.com/sashabaranov/go-openai/jsonschema" + "github.com/google/generative-ai-go/genai" + "github.com/openai/openai-go" ) // just enforcing that basic implements Type var _ Type = basic{} +type DataType string + +const ( + String DataType = "string" + Integer DataType = "integer" + Number DataType = "number" + Boolean DataType = "boolean" + Object DataType = "object" + Array DataType = "array" +) + type basic struct { - jsonschema.DataType + DataType typeName string // index is the position of the parameter in the StructField of the function's parameter struct @@ -27,20 +38,34 @@ type basic struct { description string } -func (b basic) SchemaType() jsonschema.DataType { - return b.DataType -} - -func (b basic) FunctionParameters() openai.FunctionParameters { +func (b basic) OpenAIParameters() openai.FunctionParameters { return openai.FunctionParameters{ "type": b.typeName, "description": b.description, } } -func (b basic) Definition() jsonschema.Definition { - return jsonschema.Definition{ - Type: b.DataType, +func (b basic) GoogleParameters() *genai.Schema { + var t = genai.TypeUnspecified + + switch b.DataType { + case String: + t = genai.TypeString + case Integer: + t = genai.TypeInteger + case Number: + t = genai.TypeNumber + case Boolean: + t = genai.TypeBoolean + case Object: + t = genai.TypeObject + case Array: + t = genai.TypeArray + default: + t = genai.TypeUnspecified + } + return &genai.Schema{ + Type: t, Description: b.description, } } @@ -57,12 +82,12 @@ func (b basic) FromAny(val any) (reflect.Value, error) { v := reflect.ValueOf(val) switch b.DataType { - case jsonschema.String: + case String: var val = v.String() return reflect.ValueOf(val), nil - case jsonschema.Integer: + case Integer: if v.Kind() == reflect.Float64 { return v.Convert(reflect.TypeOf(int(0))), nil } else if v.Kind() != reflect.Int { @@ -71,7 +96,7 @@ func (b basic) FromAny(val any) (reflect.Value, error) { return v, nil } - case jsonschema.Number: + case Number: if v.Kind() == reflect.Float64 { return v.Convert(reflect.TypeOf(float64(0))), nil } else if v.Kind() != reflect.Float64 { @@ -80,7 +105,7 @@ func (b basic) FromAny(val any) (reflect.Value, error) { return v, nil } - case jsonschema.Boolean: + case Boolean: if v.Kind() == reflect.Bool { return v, nil } else if v.Kind() == reflect.String { diff --git a/schema/enum.go b/schema/enum.go index 3ec6b00..02ae582 100644 --- a/schema/enum.go +++ b/schema/enum.go @@ -2,12 +2,11 @@ package schema import ( "errors" - "github.com/openai/openai-go" "reflect" + "slices" - "golang.org/x/exp/slices" - - "github.com/sashabaranov/go-openai/jsonschema" + "github.com/google/generative-ai-go/genai" + "github.com/openai/openai-go" ) type enum struct { @@ -16,10 +15,6 @@ type enum struct { values []string } -func (e enum) SchemaType() jsonschema.DataType { - return jsonschema.String -} - func (e enum) FunctionParameters() openai.FunctionParameters { return openai.FunctionParameters{ "type": "string", @@ -28,10 +23,12 @@ func (e enum) FunctionParameters() openai.FunctionParameters { } } -func (e enum) Definition() jsonschema.Definition { - def := e.basic.Definition() - def.Enum = e.values - return def +func (e enum) GoogleParameters() *genai.Schema { + return &genai.Schema{ + Type: genai.TypeString, + Description: e.Description(), + Enum: e.values, + } } func (e enum) FromAny(val any) (reflect.Value, error) { diff --git a/schema/object.go b/schema/object.go index 6930b4c..a5828e7 100644 --- a/schema/object.go +++ b/schema/object.go @@ -2,10 +2,10 @@ package schema import ( "errors" - "github.com/openai/openai-go" "reflect" - "github.com/sashabaranov/go-openai/jsonschema" + "github.com/google/generative-ai-go/genai" + "github.com/openai/openai-go" ) type object struct { @@ -16,14 +16,10 @@ type object struct { fields map[string]Type } -func (o object) SchemaType() jsonschema.DataType { - return jsonschema.Object -} - -func (o object) FunctionParameters() openai.FunctionParameters { +func (o object) OpenAIParameters() openai.FunctionParameters { var properties = map[string]openai.FunctionParameters{} for k, v := range o.fields { - properties[k] = v.FunctionParameters() + properties[k] = v.OpenAIParameters() } return openai.FunctionParameters{ @@ -33,16 +29,17 @@ func (o object) FunctionParameters() openai.FunctionParameters { } } -func (o object) Definition() jsonschema.Definition { - def := o.basic.Definition() - def.Type = jsonschema.Object - def.Properties = make(map[string]jsonschema.Definition) +func (o object) GoogleParameters() *genai.Schema { + var properties = map[string]*genai.Schema{} for k, v := range o.fields { - def.Properties[k] = v.Definition() + properties[k] = v.GoogleParameters() } - def.AdditionalProperties = false - return def + return &genai.Schema{ + Type: genai.TypeObject, + Description: o.Description(), + Properties: properties, + } } func (o object) FromAny(val any) (reflect.Value, error) { diff --git a/schema/type.go b/schema/type.go index 5260b99..935cbce 100644 --- a/schema/type.go +++ b/schema/type.go @@ -1,17 +1,18 @@ package schema import ( - "github.com/openai/openai-go" "reflect" - "github.com/sashabaranov/go-openai/jsonschema" + "github.com/google/generative-ai-go/genai" + "github.com/openai/openai-go" ) type Type interface { - FunctionParameters() openai.FunctionParameters + OpenAIParameters() openai.FunctionParameters + GoogleParameters() *genai.Schema - SchemaType() jsonschema.DataType - Definition() jsonschema.Definition + //SchemaType() jsonschema.DataType + //Definition() jsonschema.Definition Required() bool Description() string