chat

package module
v1.0.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 21, 2023 License: MIT Imports: 17 Imported by: 0

README

ChatGPT API

用于官方 ChatGPT API 的 Golang客户端

MIT License

介绍

这个包是OpenAIChatGPT的一个Golang包装✨

Updates

2023年3月21日

官方OpenAI聊天完成度API已经发布,它现在是这个包的默认版本 🔥

方法 免费? 稳定? 特性?
ChatGPTAPI ❌ No ✅ Yes ✅️ 真实的ChatGPT模型

注意。暂不支持 ChatGPTUnofficialProxyAPI`

  1. ChatGPTAPI - 使用gpt-3.5-turbo-0301模型和官方的OpenAI聊天完成度API(官方的、强大的方法,但它不是免费的)。

安装

go get github.com/MyJacking/chatgpt-go

确保你使用的是go >= 1.19

使用方法

方法 免费? 稳定? 特性?
ChatGPTAPI ❌ No ✅ Yes ✅️ 真实的ChatGPT模型
  1. ChatGPTAPI - 使用gpt-3.5-turbo-0301模型和官方的OpenAI聊天完成度API(官方的、强大的方法,但它不是免费的)。

注意。暂不支持 ChatGPTUnofficialProxyAPI`

用法 - ChatGPTAPI

注册一个OpenAI API密钥,并将其存储在你的环境中。

package main

import (
	chat "github.com/MyJacking/chatgpt-go"
	"context"
	"fmt"
	"testing"
)

func main() {
	ctx := context.Background()

	api, err := chat.NewChatGPTAPI(&chat.ChatGPTAPIOptions{
		ApiKey: "key",
		Debug:  false,
	})
	if err != nil {
		panic(err)
	}

	prompt := "Hello World!"

	message, err := api.SendMessage(ctx, prompt, &chat.SendMessageOptions{})

	fmt.Println(message.Text)
}

你可以使用completionParams覆盖默认的modelgpt-3.5-turbo-0301 )和任何[OpenAI聊天完成参数](https://platform.openai.com/docs/api-reference/chat/create)

package main

func main() {
	ctx := context.Background()

	api, err := chat.NewChatGPTAPI(&chat.ChatGPTAPIOptions{
		ApiKey: "key",
		Debug:  false,
		CompletionParams: &chat.CompletionParams{
			Temperature: 0.5,
			TopP:        0.8,
		},
	})
	if err != nil {
		panic(err)
	}
}


如果你想跟踪对话,你需要像这样传递parentMessageId

package main

func main() {
	ctx := context.Background()

	api, err := chat.NewChatGPTAPI(&chat.ChatGPTAPIOptions{
		ApiKey: "",
		Debug:  false,
	})
	if err != nil {
		panic(err)
	}

	prompt := "What is OpenAI?"

	message, err := api.SendMessage(ctx, prompt, &chat.SendMessageOptions{})

	fmt.Println(message.Text, "-----------1")

	prompt = "Can you expand on that?"
	message2, err := api.SendMessage(ctx, prompt, &chat.SendMessageOptions{
		ParentMessageId: message.ID,
	})

	fmt.Println(message2.Text, "-----------2")
}


你可以通过onProgress处理程序添加流媒体。

package main

func main() {
	ctx := context.Background()

	api, err := chat.NewChatGPTAPI(&chat.ChatGPTAPIOptions{
		ApiKey: "",
		Debug:  false,
	})
	if err != nil {
		panic(err)
	}

	prompt := "写一篇关于青蛙的500字论文。"

	message, err := api.SendMessage(ctx, prompt, &chat.SendMessageOptions{
		OnProgress: func(message *chat.ChatMessage) {
			fmt.Println(message.Text, "-----------stream")
		},
	})
	fmt.Println(message, "-----------end")
}

如果你想看到更多关于实际发送到OpenAI的聊天完成度API的信息,在ChatGPTAPI构造函数中设置debug: true选项。


我们默认的是一个基本的systemMessage'。你可以在ChatGPTAPI构造函数或sendMessage`中覆盖它。

package main

func TestDemo01(t *testing.T) {
	ctx := context.Background()

	currentDate := time.Now().Format("2006-01-02")
	systemMessage := fmt.Sprintf("You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.\nKnowledge cutoff: 2021-09-01\nCurrent date: %s", currentDate)
	api, err := chat.NewChatGPTAPI(&chat.ChatGPTAPIOptions{
		ApiKey:     "",
		Debug:      false,
		SystemMessage: systemMessage,
	})
	if err != nil {
		panic(err)
	}

}

请注意,我们会自动处理将之前的信息追加到提示中,并尝试优化可用的令牌(默认为4096)。

License

MIT © Huxiaoyou

作者

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	CHATGPT_MODEL           = "gpt-3.5-turbo"
	USER_LABEL_DEFAULT      = "User"
	ASSISTANT_LABEL_DEFAULT = "ChatGPT"
)

Functions

This section is empty.

Types

type CompletionParams

type CompletionParams struct {
	Prompt              string                 `json:"prompt"`
	MaxTokens           int                    `json:"max_tokens,omitempty"`
	Temperature         float64                `json:"temperature,omitempty"`
	TopP                float64                `json:"top_p,omitempty"`
	N                   int                    `json:"n,omitempty"`
	Logprobs            int                    `json:"logprobs,omitempty"`
	Echo                bool                   `json:"echo,omitempty"`
	Stop                []string               `json:"stop,omitempty"`
	PresencePenalty     float64                `json:"presence_penalty,omitempty"`
	FrequencyPenalty    float64                `json:"frequency_penalty,omitempty"`
	BestOf              int                    `json:"best_of,omitempty"`
	Model               string                 `json:"model,omitempty"`
	ModelOwner          string                 `json:"model_owner,omitempty"`
	Stream              bool                   `json:"stream,omitempty"`
	State               map[string]interface{} `json:"state,omitempty"`
	StopSequences       [][]string             `json:"stop_sequences,omitempty"`
	InjectOpenAIAnswers bool                   `json:"inject_openai_answers,omitempty"`
}

type CompletionRequestMessage

type CompletionRequestMessage struct {
	Role    string `json:"role"`
	Content string `json:"content"`
	Name    string `json:"name"`
}

type CreateChatCompletionDeltaResponse

type CreateChatCompletionDeltaResponse struct {
	ID      string `json:"id"`
	Choices []struct {
		Delta struct {
			Content string `json:"content"`
			Role    string `json:"role"`
		} `json:"delta"`
	} `json:"choices"`
}

type CreateChatCompletionRequest

type CreateChatCompletionRequest struct {
	Model            string                           `json:"model"`
	Messages         []CompletionRequestMessage       `json:"messages"`
	Temperature      float64                          `json:"temperature,omitempty"`
	TopP             float64                          `json:"top_p,omitempty"`
	N                int                              `json:"n,omitempty"`
	Stream           bool                             `json:"stream,omitempty"`
	Stop             *CreateChatCompletionRequestStop `json:"stop,omitempty"`
	MaxTokens        int                              `json:"max_tokens,omitempty"`
	PresencePenalty  float64                          `json:"presence_penalty,omitempty"`
	FrequencyPenalty float64                          `json:"frequency_penalty,omitempty"`
	StopSequences    []string                         `json:"stop_sequences,omitempty"`
	LogitBias        map[string]int                   `json:"logit_bias,omitempty"`
	User             string                           `json:"user,omitempty"`
}

type CreateChatCompletionRequestStop

type CreateChatCompletionRequestStop interface{}

type CreateChatCompletionResponse

type CreateChatCompletionResponse struct {
	ID      string `json:"id"`
	Choices []struct {
		Message struct {
			Content string `json:"content"`
			Role    string `json:"role"`
		} `json:"message"`
	} `json:"choices"`
	Detail struct {
		Message string `json:"message"`
	} `json:"detail"`
	Usage CreateCompletionResponseUsage `json:"usage"`
}

type CreateCompletionResponseUsage

type CreateCompletionResponseUsage struct {
	PromptTokens     int `json:"prompt_tokens"`
	CompletionTokens int `json:"completion_tokens"`
	TotalTokens      int `json:"total_tokens"`
}

type FetchFn

type FetchFn func(string) (*http.Response, error)

type GPTAPI

type GPTAPI struct {
	// contains filtered or unexported fields
}

func NewChatGPTAPI

func NewChatGPTAPI(opts *GPTAPIOptions) (*GPTAPI, error)

func (*GPTAPI) SendMessage

func (c *GPTAPI) SendMessage(ctx context.Context, text string, opts *SendMessageOptions) (*Message, error)

type GPTAPIOptions

type GPTAPIOptions struct {
	ApiKey            string
	ApiBaseUrl        string `default:"https://api.openai.com"`
	Debug             bool   `default:"false"`
	CompletionParams  *CompletionParams
	SystemMessage     string
	MaxModelTokens    int         `default:"4096"`
	MaxResponseTokens int         `default:"1000"`
	MessageStore      *leveldb.DB // 未指定默认值,需要在使用时手动初始化
	GetMessageById    GetMessageByIdFunction
	UpsertMessage     UpsertMessageFunction
	Fetch             func(req *http.Request) (*http.Response, error) // 未指定默认值,需要在使用时手动初始化
}

type GetMessageByIdFunction

type GetMessageByIdFunction func(id string) (*Message, error)

type Message

type Message struct {
	ID              string                        `json:"id"`
	Text            string                        `json:"text"`
	Role            string                        `json:"role"`
	Name            string                        `json:"name,omitempty"`
	Delta           string                        `json:"delta,omitempty"`
	Detail          interface{}                   `json:"detail,omitempty"`
	ParentMessageID string                        `json:"parentMessageId,omitempty"`
	ConversationID  string                        `json:"conversationId,omitempty"`
	Usage           CreateCompletionResponseUsage `json:"usage,omitempty"`
}

type OpenAIChatCompletionRequest

type OpenAIChatCompletionRequest struct {
	Model            string                          `json:"model"`
	Prompt           string                          `json:"prompt"`
	MaxTokens        int                             `json:"max_tokens"`
	Temperature      float64                         `json:"temperature,omitempty"`
	TopP             float64                         `json:"top_p,omitempty"`
	FrequencyPenalty float64                         `json:"frequency_penalty,omitempty"`
	PresencePenalty  float64                         `json:"presence_penalty,omitempty"`
	StopSequences    []string                        `json:"stop,omitempty"`
	N                int                             `json:"n,omitempty"`
	Logprobs         int                             `json:"logprobs,omitempty"`
	Echo             bool                            `json:"echo,omitempty"`
	User             string                          `json:"user,omitempty"`
	State            map[string]map[string][]float32 `json:"state,omitempty"`
	Messages         []CompletionRequestMessage      `json:"messages,omitempty"`
	NumTokens        int                             `json:"num_tokens,omitempty"`
	ErrorHandler     func(error)                     `json:"-"`
	Debug            bool                            `json:"-"`
	Payload          map[string]interface{}          `json:"-"`
}

type SendMessageOptions

type SendMessageOptions struct {
	Name            string          `json:"name,omitempty"`
	ParentMessageId string          `json:"parentMessageId,omitempty"`
	MessageId       string          `json:"messageId,omitempty"`
	Stream          bool            `json:"stream,omitempty"`
	SystemMessage   string          `json:"systemMessage,omitempty"`
	TimeoutMs       int             `json:"timeoutMs,omitempty"`
	OnProgress      func(*Message)  `json:"-"`
	AbortSignal     <-chan struct{} `json:"-"`
	UpdateApiKey    string          `json:"-"` // 用于更新 api key 的场景  如果不为空则使用该 api key
}

type UpsertMessageFunction

type UpsertMessageFunction func(message *Message) error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL