chat_completion.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package openai
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "io"
  7. "net/http"
  8. "net/url"
  9. )
  10. type ChatCompletionMessage struct {
  11. Role string `json:"role"`
  12. Content string `json:"content"`
  13. }
  14. type ChatCompletionChoice struct {
  15. Message *ChatCompletionMessage `json:"message"`
  16. }
  17. type ChatCompletionResponse struct {
  18. Error any `json:"error"`
  19. Model string `json:"model"`
  20. Choices []ChatCompletionChoice `json:"choices"`
  21. }
  22. func PostChatCompletion(messages []ChatCompletionMessage, apiKey string, apiHost string) (string, error) {
  23. if apiHost == "" {
  24. apiHost = "https://api.openai.com"
  25. }
  26. url, err := url.JoinPath(apiHost, "/v1/chat/completions")
  27. if err != nil {
  28. return "", err
  29. }
  30. values := map[string]any{
  31. "model": "gpt-3.5-turbo",
  32. "messages": messages,
  33. "max_tokens": 2000,
  34. "temperature": 0,
  35. "frequency_penalty": 0.0,
  36. "presence_penalty": 0.0,
  37. }
  38. jsonValue, err := json.Marshal(values)
  39. if err != nil {
  40. return "", err
  41. }
  42. req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonValue))
  43. if err != nil {
  44. return "", err
  45. }
  46. // Set the API key in the request header
  47. req.Header.Set("Content-Type", "application/json")
  48. req.Header.Set("Authorization", "Bearer "+apiKey)
  49. // Send the request to OpenAI's API
  50. client := http.Client{}
  51. resp, err := client.Do(req)
  52. if err != nil {
  53. return "", err
  54. }
  55. defer resp.Body.Close()
  56. // Read the response body
  57. responseBody, err := io.ReadAll(resp.Body)
  58. if err != nil {
  59. return "", err
  60. }
  61. chatCompletionResponse := ChatCompletionResponse{}
  62. err = json.Unmarshal(responseBody, &chatCompletionResponse)
  63. if err != nil {
  64. return "", err
  65. }
  66. if chatCompletionResponse.Error != nil {
  67. errorBytes, err := json.Marshal(chatCompletionResponse.Error)
  68. if err != nil {
  69. return "", err
  70. }
  71. return "", errors.New(string(errorBytes))
  72. }
  73. if len(chatCompletionResponse.Choices) == 0 {
  74. return "", nil
  75. }
  76. return chatCompletionResponse.Choices[0].Message.Content, nil
  77. }