Skip to content

Commit ba98e2f

Browse files
committed
Updates
1 parent c7c8a8e commit ba98e2f

File tree

8 files changed

+102
-23
lines changed

8 files changed

+102
-23
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.20
55
require (
66
github.com/djthorpe/go-errors v1.0.3
77
github.com/stretchr/testify v1.8.4
8+
github.com/veandco/go-sdl2 v0.4.36
89
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa
910
)
1011

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
66
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
77
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
88
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
9+
github.com/veandco/go-sdl2 v0.4.36 h1:Ltydev536rRQodmIrTWFZ3dRp5A+/6t5CYvbi4Kvia0=
10+
github.com/veandco/go-sdl2 v0.4.36/go.mod h1:OROqMhHD43nT4/i9crJukyVecjPNYYuCofep6SNiAjY=
911
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ=
1012
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE=
1113
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=

pkg/client/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ const (
5858
ContentTypeTextPlain = "text/plain"
5959
ContentTypeTextHTML = "text/html"
6060
ContentTypeBinary = "application/octet-stream"
61+
ContentTypeForm = "multipart/form-data"
6162
)
6263

6364
///////////////////////////////////////////////////////////////////////////////

pkg/elevenlabs/voice.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ type voiceDeleteRequest struct {
3434
client.Payload `json:"-"`
3535
}
3636

37+
type voiceAddRequest struct {
38+
Name string `json:"name,omitempty"`
39+
Description string `json:"description,omitempty"`
40+
}
41+
3742
type voicesResponse struct {
3843
Voices []Voice `json:"voices"`
3944
}
@@ -81,7 +86,7 @@ func (c *Client) VoiceSettings(Id string) (VoiceSettings, error) {
8186
}
8287

8388
// Delete a voice
84-
func (c *Client) VoiceDelete(Id string) error {
89+
func (c *Client) DeleteVoice(Id string) error {
8590
var request voiceDeleteRequest
8691
if Id == "" {
8792
return errors.ErrBadParameter.With("Id")
@@ -92,6 +97,28 @@ func (c *Client) VoiceDelete(Id string) error {
9297
return nil
9398
}
9499

100+
// Add a voice
101+
func (c *Client) AddVoice(Name, Description string) error {
102+
var request voiceAddRequest
103+
104+
// Check parameters
105+
if Name == "" {
106+
return errors.ErrBadParameter.With("Name")
107+
}
108+
109+
// Set request
110+
request.Name = Name
111+
request.Description = Description
112+
113+
// Execute request
114+
if err := c.Do(request, nil, client.OptPath("voices", "add")); err != nil {
115+
return err
116+
}
117+
118+
// Return success
119+
return nil
120+
}
121+
95122
///////////////////////////////////////////////////////////////////////////////
96123
// PAYLOAD METHODS
97124

@@ -106,3 +133,15 @@ func (voiceDeleteRequest) Type() string {
106133
func (voiceDeleteRequest) Accept() string {
107134
return client.ContentTypeJson
108135
}
136+
137+
func (voiceAddRequest) Method() string {
138+
return http.MethodPost
139+
}
140+
141+
func (voiceAddRequest) Type() string {
142+
return client.ContentTypeBinary
143+
}
144+
145+
func (voiceAddRequest) Accept() string {
146+
return client.ContentTypeForm
147+
}

pkg/openai/chat_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,21 @@ func Test_chat_001(t *testing.T) {
2727
assert.NoError(err)
2828
t.Log(string(data))
2929
}
30+
31+
func Test_chat_002(t *testing.T) {
32+
assert := assert.New(t)
33+
client, err := openai.New(GetApiKey(t), opts.OptTrace(os.Stderr, true))
34+
assert.NoError(err)
35+
assert.NotNil(client)
36+
37+
response, err := client.ChatCompletions("gpt-4-vision-preview", []openai.Message{
38+
openai.UserMessage("What's in this image?"),
39+
openai.ImageUrlMessage("https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"),
40+
}, openai.OptMaxChoices(1), openai.OptMaxTokens(300))
41+
assert.NoError(err)
42+
assert.NotNil(response)
43+
44+
data, err := json.MarshalIndent(response, "", " ")
45+
assert.NoError(err)
46+
t.Log(string(data))
47+
}

pkg/openai/image.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import (
1616
// SCHEMA
1717

1818
type Image struct {
19-
Url string `json:"url"`
20-
Data string `json:"b64_json"`
19+
Url string `json:"url,omitempty"`
20+
Data string `json:"b64_json,omitempty"`
2121
}
2222

2323
///////////////////////////////////////////////////////////////////////////////

pkg/openai/message.go

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,53 +3,71 @@ package openai
33
///////////////////////////////////////////////////////////////////////////////
44
// TYPES
55

6-
// Represents a message for chat completion
6+
// Represents a message with a role for chat completion
77
type Message interface {
88
Role() string
9-
Type() string // Returns "text"
9+
Content() []messageContent
1010
}
1111

12-
type textMessage struct {
13-
Role_ string `json:"role"`
14-
Content_ string `json:"content"`
12+
// Represents message content, which can either be text or an image
13+
type messageContent struct {
14+
Type string `json:"type"`
15+
Text string `json:"text,omitempty"`
16+
ImageUrl *Image `json:"image_url,omitempty"`
1517
}
1618

17-
type imageUrlMessage struct {
18-
Role_ string `json:"role"`
19-
Content_ string `json:"content"`
19+
// Represents message content, which can either be text or an image
20+
type message struct {
21+
Role_ string `json:"role"`
22+
Content_ []messageContent `json:"content"`
2023
}
2124

2225
///////////////////////////////////////////////////////////////////////////////
2326
// CONSTRUCTOR
2427

2528
func SystemMessage(text string) Message {
26-
return textMessage{
27-
Role_: "system",
28-
Content_: text,
29+
return message{
30+
Role_: "system",
31+
Content_: []messageContent{
32+
{Type: "text", Text: text},
33+
},
2934
}
3035
}
3136

3237
func UserMessage(text string) Message {
33-
return textMessage{
34-
Role_: "user",
35-
Content_: text,
38+
return message{
39+
Role_: "user",
40+
Content_: []messageContent{
41+
{Type: "text", Text: text},
42+
},
3643
}
3744
}
3845

3946
func AssistantMessage(text string) Message {
40-
return textMessage{
41-
Role_: "assistant",
42-
Content_: text,
47+
return message{
48+
Role_: "assistant",
49+
Content_: []messageContent{
50+
{Type: "text", Text: text},
51+
},
52+
}
53+
}
54+
55+
func ImageUrlMessage(url string) Message {
56+
return message{
57+
Role_: "user",
58+
Content_: []messageContent{
59+
{Type: "image_url", ImageUrl: &Image{Url: url}},
60+
},
4361
}
4462
}
4563

4664
///////////////////////////////////////////////////////////////////////////////
4765
// PUBLIC METHODS
4866

49-
func (m textMessage) Role() string {
67+
func (m message) Role() string {
5068
return m.Role_
5169
}
5270

53-
func (textMessage) Type() string {
54-
return "text"
71+
func (m message) Content() []messageContent {
72+
return m.Content_
5573
}

test.mp3

-29 KB
Binary file not shown.

0 commit comments

Comments
 (0)