Skip to content

Commit 1ee799b

Browse files
committed
Added image methods
1 parent 53ef633 commit 1ee799b

File tree

9 files changed

+319
-333
lines changed

9 files changed

+319
-333
lines changed

pkg/openai/chat.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,49 @@ const (
1212
///////////////////////////////////////////////////////////////////////////////
1313
// PUBLIC METHODS
1414

15-
func NewUserMessage(text string) Message {
16-
return Message{
17-
Role: "user", Content: &text,
15+
func NewMessage(role string, text ...string) *Message {
16+
msg := &Message{
17+
Role: role, Content: []MessageContent{},
1818
}
19+
return msg.AppendText(text...)
1920
}
2021

21-
func NewSystemMessage(text string) Message {
22-
return Message{
23-
Role: "system", Content: &text,
22+
func (msg *Message) AppendText(text ...string) *Message {
23+
for _, t := range text {
24+
msg.Content = append(msg.Content, MessageContent{
25+
Type: "text", Text: &t,
26+
})
2427
}
28+
return msg
2529
}
2630

27-
func NewAssistantMessage(text string) Message {
28-
return Message{
29-
Role: "assistant", Content: &text,
31+
func (msg *Message) AppendImageUrl(url ...string) *Message {
32+
for _, v := range url {
33+
msg.Content = append(msg.Content, MessageContent{
34+
Type: "image_url", ImageUrl: &MessageContentImageUrl{
35+
Url: v,
36+
},
37+
})
3038
}
39+
return msg
40+
}
41+
42+
func (msg *Message) AppendImageFile(file ...string) *Message {
43+
for _, v := range file {
44+
msg.Content = append(msg.Content, MessageContent{
45+
Type: "image_file", ImageFile: &MessageContentImageFile{
46+
File: v,
47+
},
48+
})
49+
}
50+
return msg
3151
}
3252

3353
///////////////////////////////////////////////////////////////////////////////
3454
// API CALLS
3555

3656
// Chat creates a model response for the given chat conversation.
37-
func (c *Client) Chat(messages []Message, opts ...Opt) (Chat, error) {
57+
func (c *Client) Chat(messages []*Message, opts ...Opt) (Chat, error) {
3858
// Create the request
3959
var request reqChat
4060
request.Model = defaultChatCompletion

pkg/openai/chat.go_old

Lines changed: 0 additions & 114 deletions
This file was deleted.

pkg/openai/chat_test.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ func Test_chat_001(t *testing.T) {
1616
assert.NoError(err)
1717
assert.NotNil(client)
1818

19-
response, err := client.Chat([]openai.Message{
20-
openai.NewUserMessage("What would be the best app to use to get the weather in berlin today?"),
21-
})
19+
message := openai.NewMessage("user", "What would be the best app to use to get the weather in berlin today?")
20+
response, err := client.Chat([]*openai.Message{message})
2221
assert.NoError(err)
2322
assert.NotNil(response)
2423
assert.NotEmpty(response)
@@ -35,9 +34,8 @@ func Test_chat_002(t *testing.T) {
3534
assert.NoError(err)
3635
assert.NotNil(client)
3736

38-
response, err := client.Chat([]openai.Message{
39-
openai.NewUserMessage("What is the weather in berlin today?"),
40-
}, openai.OptFunction("get_weather", "Get the weather in a specific city and country", openai.ToolParameter{
37+
message := openai.NewMessage("user", "What will the weather be like in Berlin tomorrow?")
38+
response, err := client.Chat([]*openai.Message{message}, openai.OptFunction("get_weather", "Get the weather in a specific city and country", openai.ToolParameter{
4139
Name: "city",
4240
Type: "string",
4341
Description: "The city to get the weather for",
@@ -69,10 +67,8 @@ func Test_chat_003(t *testing.T) {
6967
assert.NoError(err)
7068
assert.NotNil(client)
7169

72-
response, err := client.Chat([]openai.Message{
73-
openai.NewUserMessage("What is in this image"),
74-
openai.NewImageMessage("https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"),
75-
}, openai.OptModel("gpt-4-vision-preview"))
70+
message := openai.NewMessage("user", "What is in this image").AppendImageUrl("https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg")
71+
response, err := client.Chat([]*openai.Message{message}, openai.OptModel("gpt-4-vision-preview"))
7672
assert.NoError(err)
7773
assert.NotNil(response)
7874
assert.NotEmpty(response)

pkg/openai/image.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package openai
2+
3+
import (
4+
// Packages
5+
"github.com/mutablelogic/go-client/pkg/client"
6+
)
7+
8+
///////////////////////////////////////////////////////////////////////////////
9+
// TYPES
10+
11+
type responseImages struct {
12+
Created int64 `json:"created"`
13+
Data []Image `json:"data"`
14+
}
15+
16+
///////////////////////////////////////////////////////////////////////////////
17+
// API CALLS
18+
19+
// CreateImage generates one or more images from a prompt
20+
func (c *Client) CreateImages(prompt string, opts ...Opt) ([]Image, error) {
21+
var request reqImage
22+
var response responseImages
23+
24+
// Create the request
25+
request.Prompt = prompt
26+
for _, opt := range opts {
27+
if err := opt(&request); err != nil {
28+
return nil, err
29+
}
30+
}
31+
32+
// Return the response
33+
if payload, err := client.NewJSONRequest(request, client.ContentTypeJson); err != nil {
34+
return nil, err
35+
} else if err := c.Do(payload.Post(), &response, client.OptPath("images/generations")); err != nil {
36+
return nil, err
37+
}
38+
39+
// Return success
40+
return response.Data, nil
41+
}

pkg/openai/image_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package openai_test
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
opts "github.com/mutablelogic/go-client/pkg/client"
8+
openai "github.com/mutablelogic/go-client/pkg/openai"
9+
assert "github.com/stretchr/testify/assert"
10+
)
11+
12+
func Test_image_001(t *testing.T) {
13+
assert := assert.New(t)
14+
client, err := openai.New(GetApiKey(t), opts.OptTrace(os.Stderr, true))
15+
assert.NoError(err)
16+
assert.NotNil(client)
17+
18+
images, err := client.CreateImages("A painting of a cat", openai.OptCount(1))
19+
assert.NoError(err)
20+
assert.NotNil(images)
21+
assert.NotEmpty(images)
22+
assert.Len(images, 1)
23+
}
24+
25+
func Test_image_002(t *testing.T) {
26+
assert := assert.New(t)
27+
client, err := openai.New(GetApiKey(t), opts.OptTrace(os.Stderr, true))
28+
assert.NoError(err)
29+
assert.NotNil(client)
30+
31+
images, err := client.CreateImages("A painting of a cat", openai.OptResponseFormat("b64_json"), openai.OptCount(1))
32+
assert.NoError(err)
33+
assert.NotNil(images)
34+
assert.NotEmpty(images)
35+
assert.Len(images, 1)
36+
}

pkg/openai/image_test.go_old

Lines changed: 0 additions & 49 deletions
This file was deleted.

0 commit comments

Comments
 (0)