Skip to content

Commit 70c9972

Browse files
ManuInNZJoshVanLyaron2cicoyle
authored
Adding GoogleAI models too (#3689)
Signed-off-by: Emmanuel Auffray <[email protected]> Co-authored-by: Josh van Leeuwen <[email protected]> Co-authored-by: Yaron Schneider <[email protected]> Co-authored-by: Cassie Coyle <[email protected]>
1 parent 1bf9852 commit 70c9972

File tree

4 files changed

+182
-0
lines changed

4 files changed

+182
-0
lines changed

conversation/googleai/googleai.go

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
/*
2+
Copyright 2024 The Dapr Authors
3+
Licensed under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License.
5+
You may obtain a copy of the License at
6+
7+
http://www.apache.org/licenses/LICENSE-2.0
8+
9+
Unless required by applicable law or agreed to in writing, software
10+
distributed under the License is distributed on an "AS IS" BASIS,
11+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
See the License for the specific language governing permissions and
13+
limitations under the License.
14+
*/
15+
package googleai
16+
17+
import (
18+
"context"
19+
"reflect"
20+
21+
"github.com/dapr/components-contrib/conversation"
22+
"github.com/dapr/components-contrib/metadata"
23+
"github.com/dapr/kit/logger"
24+
kmeta "github.com/dapr/kit/metadata"
25+
26+
"github.com/tmc/langchaingo/llms"
27+
"github.com/tmc/langchaingo/llms/googleai"
28+
)
29+
30+
type GoogleAI struct {
31+
llm llms.Model
32+
33+
logger logger.Logger
34+
}
35+
36+
func NewGoogleAI(logger logger.Logger) conversation.Conversation {
37+
g := &GoogleAI{
38+
logger: logger,
39+
}
40+
41+
return g
42+
}
43+
44+
const defaultModel = "gemini-1.5-flash"
45+
46+
func (g *GoogleAI) Init(ctx context.Context, meta conversation.Metadata) error {
47+
md := conversation.LangchainMetadata{}
48+
err := kmeta.DecodeMetadata(meta.Properties, &md)
49+
if err != nil {
50+
return err
51+
}
52+
53+
model := defaultModel
54+
if md.Model != "" {
55+
model = md.Model
56+
}
57+
58+
opts := []googleai.Option{
59+
googleai.WithAPIKey(md.Key),
60+
googleai.WithDefaultModel(model),
61+
}
62+
llm, err := googleai.New(
63+
ctx,
64+
opts...,
65+
)
66+
if err != nil {
67+
return err
68+
}
69+
70+
g.llm = llm
71+
72+
if md.CacheTTL != "" {
73+
cachedModel, cacheErr := conversation.CacheModel(ctx, md.CacheTTL, g.llm)
74+
if cacheErr != nil {
75+
return cacheErr
76+
}
77+
78+
g.llm = cachedModel
79+
}
80+
return nil
81+
}
82+
83+
func (g *GoogleAI) GetComponentMetadata() (metadataInfo metadata.MetadataMap) {
84+
metadataStruct := conversation.LangchainMetadata{}
85+
metadata.GetMetadataInfoFromStructType(reflect.TypeOf(metadataStruct), &metadataInfo, metadata.ConversationType)
86+
return
87+
}
88+
89+
func (g *GoogleAI) Converse(ctx context.Context, r *conversation.ConversationRequest) (res *conversation.ConversationResponse, err error) {
90+
messages := make([]llms.MessageContent, 0, len(r.Inputs))
91+
92+
for _, input := range r.Inputs {
93+
role := conversation.ConvertLangchainRole(input.Role)
94+
95+
messages = append(messages, llms.MessageContent{
96+
Role: role,
97+
Parts: []llms.ContentPart{
98+
llms.TextPart(input.Message),
99+
},
100+
})
101+
}
102+
103+
opts := []llms.CallOption{}
104+
105+
if r.Temperature > 0 {
106+
opts = append(opts, conversation.LangchainTemperature(r.Temperature))
107+
}
108+
109+
resp, err := g.llm.GenerateContent(ctx, messages, opts...)
110+
if err != nil {
111+
return nil, err
112+
}
113+
114+
outputs := make([]conversation.ConversationResult, 0, len(resp.Choices))
115+
116+
for i := range resp.Choices {
117+
outputs = append(outputs, conversation.ConversationResult{
118+
Result: resp.Choices[i].Content,
119+
Parameters: r.Parameters,
120+
})
121+
}
122+
123+
res = &conversation.ConversationResponse{
124+
Outputs: outputs,
125+
}
126+
127+
return res, nil
128+
}
129+
130+
func (g *GoogleAI) Close() error {
131+
return nil
132+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# yaml-language-server: $schema=../../../component-metadata-schema.json
2+
schemaVersion: v1
3+
type: conversation
4+
name: googleai
5+
version: v1
6+
status: alpha
7+
title: "GoogleAI"
8+
urls:
9+
- title: Reference
10+
url: https://docs.dapr.io/reference/components-reference/supported-conversation/googleai/
11+
authenticationProfiles:
12+
- title: "API Key"
13+
description: "Authenticate using an API key"
14+
metadata:
15+
- name: key
16+
type: string
17+
required: true
18+
sensitive: true
19+
description: |
20+
API key for GoogleAI.
21+
example: "**********"
22+
default: ""
23+
metadata:
24+
- name: model
25+
required: false
26+
description: |
27+
The GoogleAI LLM to use. Defaults to gemini-1.5-flash
28+
type: string
29+
example: 'gemini-2.0-flash'
30+
- name: cacheTTL
31+
required: false
32+
description: |
33+
A time-to-live value for a prompt cache to expire. Uses Golang durations
34+
type: string
35+
example: '10m'

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,14 @@ require (
146146

147147
require (
148148
cloud.google.com/go v0.113.0 // indirect
149+
cloud.google.com/go/ai v0.6.0 // indirect
150+
cloud.google.com/go/aiplatform v1.67.0 // indirect
149151
cloud.google.com/go/auth v0.4.1 // indirect
150152
cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect
151153
cloud.google.com/go/compute/metadata v0.3.0 // indirect
152154
cloud.google.com/go/iam v1.1.7 // indirect
155+
cloud.google.com/go/longrunning v0.5.7 // indirect
156+
cloud.google.com/go/vertexai v0.10.0 // indirect
153157
contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect
154158
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
155159
github.com/99designs/keyring v1.2.1 // indirect
@@ -261,6 +265,7 @@ require (
261265
github.com/golang/snappy v0.0.4 // indirect
262266
github.com/google/btree v1.1.2 // indirect
263267
github.com/google/flatbuffers v23.5.26+incompatible // indirect
268+
github.com/google/generative-ai-go v0.14.0 // indirect
264269
github.com/google/gnostic v0.6.9 // indirect
265270
github.com/google/go-cmp v0.6.0 // indirect
266271
github.com/google/gofuzz v1.2.0 // indirect

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY
1515
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
1616
cloud.google.com/go v0.113.0 h1:g3C70mn3lWfckKBiCVsAshabrDg01pQ0pnX1MNtnMkA=
1717
cloud.google.com/go v0.113.0/go.mod h1:glEqlogERKYeePz6ZdkcLJ28Q2I6aERgDDErBg9GzO8=
18+
cloud.google.com/go/ai v0.6.0 h1:QWjb2UoaM15e51IMeLuIUFyWxooKOKDb66Mk47zZ2/g=
19+
cloud.google.com/go/ai v0.6.0/go.mod h1:6/mrRq6aJdK7MZH76ZvcMpESiAiha5aRvurmroiOrgI=
20+
cloud.google.com/go/aiplatform v1.67.0 h1:YWeqD4BjYwrmY4fa+isGcw0P81lJ3dKVxbWxdBchoiU=
21+
cloud.google.com/go/aiplatform v1.67.0/go.mod h1:s/sJ6btBEr6bKnrNWdK9ZgHCvwbZNdP90b3DDtxxw+Y=
1822
cloud.google.com/go/auth v0.4.1 h1:Z7YNIhlWRtrnKlZke7z3GMqzvuYzdc2z98F9D1NV5Hg=
1923
cloud.google.com/go/auth v0.4.1/go.mod h1:QVBuVEKpCn4Zp58hzRGvL0tjRGU0YqdRTdCHM1IHnro=
2024
cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4=
@@ -36,6 +40,8 @@ cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM=
3640
cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA=
3741
cloud.google.com/go/kms v1.15.8 h1:szIeDCowID8th2i8XE4uRev5PMxQFqW+JjwYxL9h6xs=
3842
cloud.google.com/go/kms v1.15.8/go.mod h1:WoUHcDjD9pluCg7pNds131awnH429QGvRM3N/4MyoVs=
43+
cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU=
44+
cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng=
3945
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
4046
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
4147
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
@@ -51,6 +57,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
5157
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
5258
cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw=
5359
cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g=
60+
cloud.google.com/go/vertexai v0.10.0 h1:k157bLrtyajGtAAZnqdEn8lwFlUTG3BgHc7kvWbP/3s=
61+
cloud.google.com/go/vertexai v0.10.0/go.mod h1:w/Zb22QvOVvxx5CGM4fPzH3WA6gwUkId9juA7pigzFI=
5462
contrib.go.opencensus.io/exporter/prometheus v0.4.1/go.mod h1:t9wvfitlUjGXG2IXAZsuFq26mDGid/JwCEXp+gTG/9U=
5563
contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg=
5664
contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ=
@@ -797,6 +805,8 @@ github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl76
797805
github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
798806
github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg=
799807
github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
808+
github.com/google/generative-ai-go v0.14.0 h1:2GwFKXui9LmG+PukQwYk9KpJUIemmQ9NJ46BV9VIw38=
809+
github.com/google/generative-ai-go v0.14.0/go.mod h1:hOzbW3cB5hRV2x05McOwJS4GsqSluYwejjk5tSfb6YY=
800810
github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0=
801811
github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E=
802812
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=

0 commit comments

Comments
 (0)