chat_completion.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 interface{} `json:"error"`
  19. Model string `json:"model"`
  20. Choices []ChatCompletionChoice `json:"choices"`
  21. }
  22. func PostChatCompletion(prompt string, 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]interface{}{
  31. "model": "gpt-3.5-turbo",
  32. "messages": []map[string]string{{"role": "user", "content": prompt}},
  33. }
  34. jsonValue, err := json.Marshal(values)
  35. if err != nil {
  36. return "", err
  37. }
  38. req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonValue))
  39. if err != nil {
  40. return "", err
  41. }
  42. // Set the API key in the request header
  43. req.Header.Set("Content-Type", "application/json")
  44. req.Header.Set("Authorization", "Bearer "+apiKey)
  45. // Send the request to OpenAI's API
  46. client := http.Client{}
  47. resp, err := client.Do(req)
  48. if err != nil {
  49. return "", err
  50. }
  51. defer resp.Body.Close()
  52. // Read the response body
  53. responseBody, err := io.ReadAll(resp.Body)
  54. if err != nil {
  55. return "", err
  56. }
  57. chatCompletionResponse := ChatCompletionResponse{}
  58. err = json.Unmarshal(responseBody, &chatCompletionResponse)
  59. if err != nil {
  60. return "", err
  61. }
  62. if chatCompletionResponse.Error != nil {
  63. errorBytes, err := json.Marshal(chatCompletionResponse.Error)
  64. if err != nil {
  65. return "", err
  66. }
  67. return "", errors.New(string(errorBytes))
  68. }
  69. if len(chatCompletionResponse.Choices) == 0 {
  70. return "", nil
  71. }
  72. return chatCompletionResponse.Choices[0].Message.Content, nil
  73. }