image.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package jimeng
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "one-api/common"
  8. "one-api/dto"
  9. relaycommon "one-api/relay/common"
  10. "one-api/types"
  11. "github.com/gin-gonic/gin"
  12. )
  13. type ImageResponse struct {
  14. Code int `json:"code"`
  15. Message string `json:"message"`
  16. Data struct {
  17. BinaryDataBase64 []string `json:"binary_data_base64"`
  18. ImageUrls []string `json:"image_urls"`
  19. RephraseResult string `json:"rephraser_result"`
  20. RequestID string `json:"request_id"`
  21. // Other fields are omitted for brevity
  22. } `json:"data"`
  23. RequestID string `json:"request_id"`
  24. Status int `json:"status"`
  25. TimeElapsed string `json:"time_elapsed"`
  26. }
  27. func responseJimeng2OpenAIImage(_ *gin.Context, response *ImageResponse, info *relaycommon.RelayInfo) *dto.ImageResponse {
  28. imageResponse := dto.ImageResponse{
  29. Created: info.StartTime.Unix(),
  30. }
  31. for _, base64Data := range response.Data.BinaryDataBase64 {
  32. imageResponse.Data = append(imageResponse.Data, dto.ImageData{
  33. B64Json: base64Data,
  34. })
  35. }
  36. for _, imageUrl := range response.Data.ImageUrls {
  37. imageResponse.Data = append(imageResponse.Data, dto.ImageData{
  38. Url: imageUrl,
  39. })
  40. }
  41. return &imageResponse
  42. }
  43. // jimengImageHandler handles the Jimeng image generation response
  44. func jimengImageHandler(c *gin.Context, resp *http.Response, info *relaycommon.RelayInfo) (*dto.Usage, *types.NewAPIError) {
  45. var jimengResponse ImageResponse
  46. responseBody, err := io.ReadAll(resp.Body)
  47. if err != nil {
  48. return nil, types.NewError(err, types.ErrorCodeReadResponseBodyFailed)
  49. }
  50. common.CloseResponseBodyGracefully(resp)
  51. err = json.Unmarshal(responseBody, &jimengResponse)
  52. if err != nil {
  53. return nil, types.NewError(err, types.ErrorCodeBadResponseBody)
  54. }
  55. // Check if the response indicates an error
  56. if jimengResponse.Code != 10000 {
  57. return nil, types.WithOpenAIError(types.OpenAIError{
  58. Message: jimengResponse.Message,
  59. Type: "jimeng_error",
  60. Param: "",
  61. Code: fmt.Sprintf("%d", jimengResponse.Code),
  62. }, resp.StatusCode)
  63. }
  64. // Convert Jimeng response to OpenAI format
  65. fullTextResponse := responseJimeng2OpenAIImage(c, &jimengResponse, info)
  66. jsonResponse, err := json.Marshal(fullTextResponse)
  67. if err != nil {
  68. return nil, types.NewError(err, types.ErrorCodeBadResponseBody)
  69. }
  70. c.Writer.Header().Set("Content-Type", "application/json")
  71. c.Writer.WriteHeader(resp.StatusCode)
  72. _, err = c.Writer.Write(jsonResponse)
  73. if err != nil {
  74. return nil, types.NewError(err, types.ErrorCodeBadResponseBody)
  75. }
  76. return &dto.Usage{}, nil
  77. }