Skip to content

Commit 70ba616

Browse files
authored
Merge pull request google-gemini#47 from kinarr/go-models-api-samples
Add Go samples for the Models API
2 parents fe1d535 + 85f93d3 commit 70ba616

8 files changed

+332
-0
lines changed

go/configure_model_parameters.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package examples
2+
3+
import (
4+
"context"
5+
"os"
6+
"log"
7+
8+
"google.golang.org/genai"
9+
)
10+
11+
func ConfigureModel() (*genai.GenerateContentResponse, error) {
12+
// [START configure_model_parameters]
13+
ctx := context.Background()
14+
client, err := genai.NewClient(ctx, &genai.ClientConfig{
15+
APIKey: os.Getenv("GEMINI_API_KEY"),
16+
Backend: genai.BackendGeminiAPI,
17+
})
18+
if err != nil {
19+
log.Fatal(err)
20+
}
21+
22+
// Create local variables for parameters.
23+
candidateCount := int32(1)
24+
maxOutputTokens := int32(20)
25+
temperature := float32(1.0)
26+
27+
response, err := client.Models.GenerateContent(
28+
ctx,
29+
"gemini-2.0-flash",
30+
genai.Text("Tell me a story about a magic backpack."),
31+
&genai.GenerateContentConfig{
32+
CandidateCount: &candidateCount,
33+
StopSequences: []string{"x"},
34+
MaxOutputTokens: &maxOutputTokens,
35+
Temperature: &temperature,
36+
},
37+
)
38+
if err != nil {
39+
log.Fatal(err)
40+
}
41+
42+
printResponse(response)
43+
// [END configure_model_parameters]
44+
return response, err
45+
}

go/configure_model_parameters_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package examples
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestConfigureModel(t *testing.T) {
8+
_, err := ConfigureModel()
9+
if err != nil {
10+
t.Errorf("ConfigureModel returned an error.")
11+
}
12+
}

go/models.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package examples
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
"log"
8+
9+
"google.golang.org/genai"
10+
)
11+
12+
func ModelsList() error {
13+
// [START models_list]
14+
ctx := context.Background()
15+
client, err := genai.NewClient(ctx, &genai.ClientConfig{
16+
APIKey: os.Getenv("GEMINI_API_KEY"),
17+
Backend: genai.BackendGeminiAPI,
18+
})
19+
if err != nil {
20+
log.Fatal(err)
21+
}
22+
23+
24+
// Retrieve the list of models.
25+
models, err := client.Models.List(ctx, &genai.ListModelsConfig{})
26+
if err != nil {
27+
log.Fatal(err)
28+
}
29+
30+
fmt.Println("List of models that support generateContent:")
31+
for _, m := range models.Items {
32+
for _, action := range m.SupportedActions {
33+
if action == "generateContent" {
34+
fmt.Println(m.Name)
35+
break
36+
}
37+
}
38+
}
39+
40+
fmt.Println("\nList of models that support embedContent:")
41+
for _, m := range models.Items {
42+
for _, action := range m.SupportedActions {
43+
if action == "embedContent" {
44+
fmt.Println(m.Name)
45+
break
46+
}
47+
}
48+
}
49+
// [END models_list]
50+
return err
51+
}
52+
53+
func ModelsGet() error {
54+
// [START models_get]
55+
ctx := context.Background()
56+
client, err := genai.NewClient(ctx, &genai.ClientConfig{
57+
APIKey: os.Getenv("GEMINI_API_KEY"),
58+
Backend: genai.BackendGeminiAPI,
59+
})
60+
if err != nil {
61+
log.Fatal(err)
62+
}
63+
64+
modelInfo, err := client.Models.Get(ctx, "gemini-2.0-flash", nil)
65+
if err != nil {
66+
log.Fatal(err)
67+
}
68+
69+
fmt.Println(modelInfo)
70+
// [END models_get]
71+
return err
72+
}

go/models_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package examples
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestModelsList(t *testing.T) {
8+
err := ModelsList()
9+
if err != nil {
10+
t.Errorf("ModelsList returned an error.")
11+
}
12+
}
13+
14+
func TestModelsGet(t *testing.T) {
15+
err := ModelsGet()
16+
if err != nil {
17+
t.Errorf("ModelsGet returned an error.")
18+
}
19+
}

go/safety_settings.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package examples
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
"log"
8+
"encoding/json"
9+
10+
"google.golang.org/genai"
11+
)
12+
13+
func SafetySettings() error {
14+
// [START safety_settings]
15+
ctx := context.Background()
16+
client, err := genai.NewClient(ctx, &genai.ClientConfig{
17+
APIKey: os.Getenv("GEMINI_API_KEY"),
18+
Backend: genai.BackendGeminiAPI,
19+
})
20+
if err != nil {
21+
log.Fatal(err)
22+
}
23+
24+
unsafePrompt := "I support Martians Soccer Club and I think Jupiterians Football Club sucks! " +
25+
"Write a ironic phrase about them including expletives."
26+
27+
config := &genai.GenerateContentConfig{
28+
SafetySettings: []*genai.SafetySetting{
29+
{
30+
Category: "HARM_CATEGORY_HARASSMENT",
31+
Threshold: "BLOCK_ONLY_HIGH",
32+
},
33+
},
34+
}
35+
contents := []*genai.Content{
36+
genai.NewUserContentFromText(unsafePrompt),
37+
}
38+
response, err := client.Models.GenerateContent(ctx, "gemini-2.0-flash", contents, config)
39+
if err != nil {
40+
log.Fatal(err)
41+
}
42+
43+
// Print the finish reason and safety ratings from the first candidate.
44+
if len(response.Candidates) > 0 {
45+
fmt.Println("Finish reason:", response.Candidates[0].FinishReason)
46+
safetyRatings, err := json.MarshalIndent(response.Candidates[0].SafetyRatings, "", " ")
47+
if err != nil {
48+
return err
49+
}
50+
fmt.Println("Safety ratings:", string(safetyRatings))
51+
} else {
52+
fmt.Println("No candidate returned.")
53+
}
54+
// [END safety_settings]
55+
return err
56+
}
57+
58+
func SafetySettingsMulti() error {
59+
// [START safety_settings_multi]
60+
ctx := context.Background()
61+
client, err := genai.NewClient(ctx, &genai.ClientConfig{
62+
APIKey: os.Getenv("GEMINI_API_KEY"),
63+
Backend: genai.BackendGeminiAPI,
64+
})
65+
if err != nil {
66+
log.Fatal(err)
67+
}
68+
69+
unsafePrompt := "I support Martians Soccer Club and I think Jupiterians Football Club sucks! " +
70+
"Write a ironic phrase about them including expletives."
71+
72+
config := &genai.GenerateContentConfig{
73+
SafetySettings: []*genai.SafetySetting{
74+
{
75+
Category: "HARM_CATEGORY_HATE_SPEECH",
76+
Threshold: "BLOCK_MEDIUM_AND_ABOVE",
77+
},
78+
{
79+
Category: "HARM_CATEGORY_HARASSMENT",
80+
Threshold: "BLOCK_ONLY_HIGH",
81+
},
82+
},
83+
}
84+
contents := []*genai.Content{
85+
genai.NewUserContentFromText(unsafePrompt),
86+
}
87+
response, err := client.Models.GenerateContent(ctx, "gemini-2.0-flash", contents, config)
88+
if err != nil {
89+
log.Fatal(err)
90+
}
91+
92+
// Try to print the generated text.
93+
text, err := response.Text()
94+
if err != nil {
95+
fmt.Println("No information generated by the model.")
96+
} else {
97+
fmt.Println("Generated text:", text)
98+
}
99+
100+
// Print the and safety ratings from the first candidate.
101+
if len(response.Candidates) > 0 {
102+
fmt.Println("Finish reason:", response.Candidates[0].FinishReason)
103+
safetyRatings, err := json.MarshalIndent(response.Candidates[0].SafetyRatings, "", " ")
104+
if err != nil {
105+
return err
106+
}
107+
fmt.Println("Safety ratings:", string(safetyRatings))
108+
} else {
109+
fmt.Println("No candidate returned.")
110+
}
111+
// [END safety_settings_multi]
112+
return err
113+
}

go/safety_settings_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package examples
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestSafetySettings(t *testing.T) {
8+
err := SafetySettings()
9+
if err != nil {
10+
t.Errorf("SafetySettings returned an error.")
11+
}
12+
}
13+
14+
func TestSafetySettingsMulti(t *testing.T) {
15+
err := SafetySettingsMulti()
16+
if err != nil {
17+
t.Errorf("SafetySettingsMulti returned an error.")
18+
}
19+
}

go/system_instruction.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package examples
2+
3+
import (
4+
"context"
5+
"os"
6+
"log"
7+
8+
"google.golang.org/genai"
9+
)
10+
11+
// SystemInstructions demonstrates setting a system instruction using a *genai.Content in the generation config.
12+
func SystemInstruction() error {
13+
// [START system_instruction]
14+
ctx := context.Background()
15+
client, err := genai.NewClient(ctx, &genai.ClientConfig{
16+
APIKey: os.Getenv("GEMINI_API_KEY"),
17+
Backend: genai.BackendGeminiAPI,
18+
})
19+
if err != nil {
20+
log.Fatal(err)
21+
}
22+
23+
// Construct the user message contents.
24+
contents := []*genai.Content{
25+
genai.NewUserContentFromText("Good morning! How are you?"),
26+
}
27+
28+
// Set the system instruction as a *genai.Content.
29+
config := &genai.GenerateContentConfig{
30+
SystemInstruction: genai.NewModelContentFromText("You are a cat. Your name is Neko."),
31+
}
32+
33+
response, err := client.Models.GenerateContent(ctx, "gemini-2.0-flash", contents, config)
34+
if err != nil {
35+
log.Fatal(err)
36+
}
37+
printResponse(response)
38+
// [END system_instruction]
39+
return err
40+
}

go/system_instruction_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package examples
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestSystemInstruction(t *testing.T) {
8+
err := SystemInstruction()
9+
if err != nil {
10+
t.Errorf("SystemInstruction returned an error.")
11+
}
12+
}

0 commit comments

Comments
 (0)