chat.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package model
  2. import (
  3. "github.com/labring/aiproxy/core/model"
  4. "github.com/labring/aiproxy/core/relay/adaptor"
  5. )
  6. type ChatUsage struct {
  7. PromptTokens int64 `json:"prompt_tokens,omitempty"`
  8. CompletionTokens int64 `json:"completion_tokens,omitempty"`
  9. TotalTokens int64 `json:"total_tokens"`
  10. WebSearchCount int64 `json:"web_search_count,omitempty"`
  11. PromptTokensDetails *PromptTokensDetails `json:"prompt_tokens_details,omitempty"`
  12. CompletionTokensDetails *CompletionTokensDetails `json:"completion_tokens_details,omitempty"`
  13. }
  14. func (u ChatUsage) ToModelUsage() model.Usage {
  15. usage := model.Usage{
  16. InputTokens: model.ZeroNullInt64(u.PromptTokens),
  17. OutputTokens: model.ZeroNullInt64(u.CompletionTokens),
  18. TotalTokens: model.ZeroNullInt64(u.TotalTokens),
  19. WebSearchCount: model.ZeroNullInt64(u.WebSearchCount),
  20. }
  21. if u.PromptTokensDetails != nil {
  22. usage.CachedTokens = model.ZeroNullInt64(u.PromptTokensDetails.CachedTokens)
  23. usage.CacheCreationTokens = model.ZeroNullInt64(u.PromptTokensDetails.CacheCreationTokens)
  24. }
  25. if u.CompletionTokensDetails != nil {
  26. usage.ReasoningTokens = model.ZeroNullInt64(u.CompletionTokensDetails.ReasoningTokens)
  27. }
  28. return usage
  29. }
  30. func (u *ChatUsage) Add(other *ChatUsage) {
  31. if other == nil {
  32. return
  33. }
  34. u.PromptTokens += other.PromptTokens
  35. u.CompletionTokens += other.CompletionTokens
  36. u.TotalTokens += other.TotalTokens
  37. if other.PromptTokensDetails != nil {
  38. if u.PromptTokensDetails == nil {
  39. u.PromptTokensDetails = &PromptTokensDetails{}
  40. }
  41. u.PromptTokensDetails.Add(other.PromptTokensDetails)
  42. }
  43. }
  44. func (u ChatUsage) ToClaudeUsage() ClaudeUsage {
  45. cu := ClaudeUsage{
  46. InputTokens: u.PromptTokens,
  47. OutputTokens: u.CompletionTokens,
  48. }
  49. if u.PromptTokensDetails != nil {
  50. cu.CacheCreationInputTokens = u.PromptTokensDetails.CacheCreationTokens
  51. cu.CacheReadInputTokens = u.PromptTokensDetails.CachedTokens
  52. }
  53. return cu
  54. }
  55. type PromptTokensDetails struct {
  56. CachedTokens int64 `json:"cached_tokens"`
  57. AudioTokens int64 `json:"audio_tokens"`
  58. CacheCreationTokens int64 `json:"cache_creation_tokens,omitempty"`
  59. }
  60. func (d *PromptTokensDetails) Add(other *PromptTokensDetails) {
  61. if other == nil {
  62. return
  63. }
  64. d.CachedTokens += other.CachedTokens
  65. d.AudioTokens += other.AudioTokens
  66. d.CacheCreationTokens += other.CacheCreationTokens
  67. }
  68. type CompletionTokensDetails struct {
  69. ReasoningTokens int64 `json:"reasoning_tokens"`
  70. AudioTokens int64 `json:"audio_tokens"`
  71. AcceptedPredictionTokens int64 `json:"accepted_prediction_tokens"`
  72. RejectedPredictionTokens int64 `json:"rejected_prediction_tokens"`
  73. }
  74. type OpenAIErrorResponse struct {
  75. Error OpenAIError `json:"error"`
  76. }
  77. type OpenAIError struct {
  78. Code any `json:"code,omitempty"`
  79. Message string `json:"message,omitempty"`
  80. Type string `json:"type,omitempty"`
  81. Param string `json:"param,omitempty"`
  82. }
  83. func NewOpenAIError(statusCode int, err OpenAIError) adaptor.Error {
  84. return adaptor.NewError(statusCode, OpenAIErrorResponse{
  85. Error: err,
  86. })
  87. }
  88. func WrapperOpenAIError(err error, code any, statusCode int, _type ...string) adaptor.Error {
  89. return WrapperOpenAIErrorWithMessage(err.Error(), code, statusCode, _type...)
  90. }
  91. func WrapperOpenAIErrorWithMessage(
  92. message string,
  93. code any,
  94. statusCode int,
  95. _type ...string,
  96. ) adaptor.Error {
  97. errType := ErrorTypeAIPROXY
  98. if len(_type) > 0 {
  99. errType = _type[0]
  100. }
  101. return NewOpenAIError(statusCode, OpenAIError{
  102. Message: message,
  103. Type: errType,
  104. Code: code,
  105. })
  106. }