llm_entities.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. from decimal import Decimal
  2. from enum import StrEnum
  3. from typing import Optional
  4. from pydantic import BaseModel
  5. from core.model_runtime.entities.message_entities import AssistantPromptMessage, PromptMessage
  6. from core.model_runtime.entities.model_entities import ModelUsage, PriceInfo
  7. class LLMMode(StrEnum):
  8. """
  9. Enum class for large language model mode.
  10. """
  11. COMPLETION = "completion"
  12. CHAT = "chat"
  13. @classmethod
  14. def value_of(cls, value: str) -> "LLMMode":
  15. """
  16. Get value of given mode.
  17. :param value: mode value
  18. :return: mode
  19. """
  20. for mode in cls:
  21. if mode.value == value:
  22. return mode
  23. raise ValueError(f"invalid mode value {value}")
  24. class LLMUsage(ModelUsage):
  25. """
  26. Model class for llm usage.
  27. """
  28. prompt_tokens: int
  29. prompt_unit_price: Decimal
  30. prompt_price_unit: Decimal
  31. prompt_price: Decimal
  32. completion_tokens: int
  33. completion_unit_price: Decimal
  34. completion_price_unit: Decimal
  35. completion_price: Decimal
  36. total_tokens: int
  37. total_price: Decimal
  38. currency: str
  39. latency: float
  40. @classmethod
  41. def empty_usage(cls):
  42. return cls(
  43. prompt_tokens=0,
  44. prompt_unit_price=Decimal("0.0"),
  45. prompt_price_unit=Decimal("0.0"),
  46. prompt_price=Decimal("0.0"),
  47. completion_tokens=0,
  48. completion_unit_price=Decimal("0.0"),
  49. completion_price_unit=Decimal("0.0"),
  50. completion_price=Decimal("0.0"),
  51. total_tokens=0,
  52. total_price=Decimal("0.0"),
  53. currency="USD",
  54. latency=0.0,
  55. )
  56. def plus(self, other: "LLMUsage") -> "LLMUsage":
  57. """
  58. Add two LLMUsage instances together.
  59. :param other: Another LLMUsage instance to add
  60. :return: A new LLMUsage instance with summed values
  61. """
  62. if self.total_tokens == 0:
  63. return other
  64. else:
  65. return LLMUsage(
  66. prompt_tokens=self.prompt_tokens + other.prompt_tokens,
  67. prompt_unit_price=other.prompt_unit_price,
  68. prompt_price_unit=other.prompt_price_unit,
  69. prompt_price=self.prompt_price + other.prompt_price,
  70. completion_tokens=self.completion_tokens + other.completion_tokens,
  71. completion_unit_price=other.completion_unit_price,
  72. completion_price_unit=other.completion_price_unit,
  73. completion_price=self.completion_price + other.completion_price,
  74. total_tokens=self.total_tokens + other.total_tokens,
  75. total_price=self.total_price + other.total_price,
  76. currency=other.currency,
  77. latency=self.latency + other.latency,
  78. )
  79. def __add__(self, other: "LLMUsage") -> "LLMUsage":
  80. """
  81. Overload the + operator to add two LLMUsage instances.
  82. :param other: Another LLMUsage instance to add
  83. :return: A new LLMUsage instance with summed values
  84. """
  85. return self.plus(other)
  86. class LLMResult(BaseModel):
  87. """
  88. Model class for llm result.
  89. """
  90. id: Optional[str] = None
  91. model: str
  92. prompt_messages: list[PromptMessage]
  93. message: AssistantPromptMessage
  94. usage: LLMUsage
  95. system_fingerprint: Optional[str] = None
  96. class LLMResultChunkDelta(BaseModel):
  97. """
  98. Model class for llm result chunk delta.
  99. """
  100. index: int
  101. message: AssistantPromptMessage
  102. usage: Optional[LLMUsage] = None
  103. finish_reason: Optional[str] = None
  104. class LLMResultChunk(BaseModel):
  105. """
  106. Model class for llm result chunk.
  107. """
  108. model: str
  109. prompt_messages: list[PromptMessage]
  110. system_fingerprint: Optional[str] = None
  111. delta: LLMResultChunkDelta
  112. class NumTokensResult(PriceInfo):
  113. """
  114. Model class for number of tokens result.
  115. """
  116. tokens: int