# Go OpenAI
[![GoDoc](http://img.shields.io/badge/GoDoc-Reference-blue.svg)](https://godoc.org/github.com/sashabaranov/go-gogpt)
[![Go Report Card](https://goreportcard.com/badge/github.com/sashabaranov/go-gogpt)](https://goreportcard.com/report/github.com/sashabaranov/go-gogpt)
[![codecov](https://codecov.io/gh/sashabaranov/go-gogpt/branch/master/graph/badge.svg?token=bCbIfHLIsW)](https://codecov.io/gh/sashabaranov/go-gogpt)
> **Note**: the repository was recently renamed from `go-gpt3` to `go-gogpt`
This library provides Go clients for [OpenAI API](https://platform.gogpt.com/). We support:
* ChatGPT
* GPT-3, GPT-4
* DALLĀ·E 2
* Whisper
Installation:
```
go get github.com/sashabaranov/go-gogpt
```
ChatGPT example usage:
```go
package main
import (
"context"
"fmt"
gogpt "github.com/sashabaranov/go-gogpt"
)
func main() {
client := gogpt.NewClient("your token")
resp, err := client.CreateChatCompletion(
context.Background(),
gogpt.ChatCompletionRequest{
Model: gogpt.GPT3Dot5Turbo,
Messages: []gogpt.ChatCompletionMessage{
{
Role: gogpt.ChatMessageRoleUser,
Content: "Hello!",
},
},
},
)
if err != nil {
fmt.Printf("ChatCompletion error: %v\n", err)
return
}
fmt.Println(resp.Choices[0].Message.Content)
}
```
Other examples:
GPT-3 completion
```go
package main
import (
"context"
"fmt"
gogpt "github.com/sashabaranov/go-gogpt"
)
func main() {
c := gogpt.NewClient("your token")
ctx := context.Background()
req := gogpt.CompletionRequest{
Model: gogpt.GPT3Ada,
MaxTokens: 5,
Prompt: "Lorem ipsum",
}
resp, err := c.CreateCompletion(ctx, req)
if err != nil {
fmt.Printf("Completion error: %v\n", err)
return
}
fmt.Println(resp.Choices[0].Text)
}
```
GPT-3 streaming completion
```go
package main
import (
"errors"
"context"
"fmt"
"io"
gogpt "github.com/sashabaranov/go-gogpt"
)
func main() {
c := gogpt.NewClient("your token")
ctx := context.Background()
req := gogpt.CompletionRequest{
Model: gogpt.GPT3Ada,
MaxTokens: 5,
Prompt: "Lorem ipsum",
Stream: true,
}
stream, err := c.CreateCompletionStream(ctx, req)
if err != nil {
fmt.Printf("CompletionStream error: %v\n", err)
return
}
defer stream.Close()
for {
response, err := stream.Recv()
if errors.Is(err, io.EOF) {
fmt.Println("Stream finished")
return
}
if err != nil {
fmt.Printf("Stream error: %v\n", err)
return
}
fmt.Printf("Stream response: %v\n", response)
}
}
```
Audio Speech-To-Text
```go
package main
import (
"context"
"fmt"
gogpt "github.com/sashabaranov/go-gogpt"
)
func main() {
c := gogpt.NewClient("your token")
ctx := context.Background()
req := gogpt.AudioRequest{
Model: gogpt.Whisper1,
FilePath: "recording.mp3",
}
resp, err := c.CreateTranscription(ctx, req)
if err != nil {
fmt.Printf("Transcription error: %v\n", err)
return
}
fmt.Println(resp.Text)
}
```
DALL-E 2 image generation
```go
package main
import (
"bytes"
"context"
"encoding/base64"
"fmt"
gogpt "github.com/sashabaranov/go-gogpt"
"image/png"
"os"
)
func main() {
c := gogpt.NewClient("your token")
ctx := context.Background()
// Sample image by link
reqUrl := gogpt.ImageRequest{
Prompt: "Parrot on a skateboard performs a trick, cartoon style, natural light, high detail",
Size: gogpt.CreateImageSize256x256,
ResponseFormat: gogpt.CreateImageResponseFormatURL,
N: 1,
}
respUrl, err := c.CreateImage(ctx, reqUrl)
if err != nil {
fmt.Printf("Image creation error: %v\n", err)
return
}
fmt.Println(respUrl.Data[0].URL)
// Example image as base64
reqBase64 := gogpt.ImageRequest{
Prompt: "Portrait of a humanoid parrot in a classic costume, high detail, realistic light, unreal engine",
Size: gogpt.CreateImageSize256x256,
ResponseFormat: gogpt.CreateImageResponseFormatB64JSON,
N: 1,
}
respBase64, err := c.CreateImage(ctx, reqBase64)
if err != nil {
fmt.Printf("Image creation error: %v\n", err)
return
}
imgBytes, err := base64.StdEncoding.DecodeString(respBase64.Data[0].B64JSON)
if err != nil {
fmt.Printf("Base64 decode error: %v\n", err)
return
}
r := bytes.NewReader(imgBytes)
imgData, err := png.Decode(r)
if err != nil {
fmt.Printf("PNG decode error: %v\n", err)
return
}
file, err := os.Create("image.png")
if err != nil {
fmt.Printf("File creation error: %v\n", err)
return
}
defer file.Close()
if err := png.Encode(file, imgData); err != nil {
fmt.Printf("PNG encode error: %v\n", err)
return
}
fmt.Println("The image was saved as example.png")
}
```
Configuring proxy
```go
config := gogpt.DefaultConfig("token")
proxyUrl, err := url.Parse("http://localhost:{port}")
if err != nil {
panic(err)
}
transport := &http.Transport{
Proxy: http.ProxyURL(proxyUrl),
}
config.HTTPClient = &http.Client{
Transport: transport,
}
c := gogpt.NewClientWithConfig(config)
```
See also: https://pkg.go.dev/github.com/sashabaranov/go-gogpt#ClientConfig
ChatGPT support context
```go
package main
import (
"bufio"
"context"
"fmt"
"os"
"strings"
"github.com/sashabaranov/go-gogpt"
)
func main() {
client := gogpt.NewClient("your token")
messages := make([]gogpt.ChatCompletionMessage, 0)
reader := bufio.NewReader(os.Stdin)
fmt.Println("Conversation")
fmt.Println("---------------------")
for {
fmt.Print("-> ")
text, _ := reader.ReadString('\n')
// convert CRLF to LF
text = strings.Replace(text, "\n", "", -1)
messages = append(messages, gogpt.ChatCompletionMessage{
Role: gogpt.ChatMessageRoleUser,
Content: text,
})
resp, err := client.CreateChatCompletion(
context.Background(),
gogpt.ChatCompletionRequest{
Model: gogpt.GPT3Dot5Turbo,
Messages: messages,
},
)
if err != nil {
fmt.Printf("ChatCompletion error: %v\n", err)
continue
}
content := resp.Choices[0].Message.Content
messages = append(messages, gogpt.ChatCompletionMessage{
Role: gogpt.ChatMessageRoleAssistant,
Content: content,
})
fmt.Println(content)
}
}
```