stubs.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. from __future__ import annotations
  2. from typing import Optional, List, Dict, Any
  3. from time import time
  4. from .helper import filter_none
  5. try:
  6. from pydantic import BaseModel, Field
  7. except ImportError:
  8. class BaseModel():
  9. @classmethod
  10. def model_construct(cls, **data):
  11. new = cls()
  12. for key, value in data.items():
  13. setattr(new, key, value)
  14. return new
  15. class Field():
  16. def __init__(self, **config):
  17. pass
  18. class BaseModel(BaseModel):
  19. @classmethod
  20. def model_construct(cls, **data):
  21. if hasattr(super(), "model_construct"):
  22. return super().model_construct(**data)
  23. return cls.construct(**data)
  24. class TokenDetails(BaseModel):
  25. pass
  26. class UsageModel(BaseModel):
  27. prompt_tokens: int
  28. completion_tokens: int
  29. total_tokens: int
  30. prompt_tokens_details: TokenDetails
  31. completion_tokens_details: TokenDetails
  32. @classmethod
  33. def model_construct(cls, prompt_tokens=0, completion_tokens=0, total_tokens=0, prompt_tokens_details=None, completion_tokens_details=None, **kwargs):
  34. return super().model_construct(
  35. prompt_tokens=prompt_tokens,
  36. completion_tokens=completion_tokens,
  37. total_tokens=total_tokens,
  38. prompt_tokens_details=TokenDetails.model_construct(**prompt_tokens_details) if prompt_tokens_details else None,
  39. completion_tokens_details=TokenDetails.model_construct(**completion_tokens_details) if completion_tokens_details else None,
  40. **kwargs
  41. )
  42. class ToolFunctionModel(BaseModel):
  43. name: str
  44. arguments: str
  45. class ToolCallModel(BaseModel):
  46. id: str
  47. type: str
  48. function: ToolFunctionModel
  49. @classmethod
  50. def model_construct(cls, function=None, **kwargs):
  51. return super().model_construct(
  52. **kwargs,
  53. function=ToolFunctionModel.model_construct(**function),
  54. )
  55. class ChatCompletionChunk(BaseModel):
  56. id: str
  57. object: str
  58. created: int
  59. model: str
  60. provider: Optional[str]
  61. choices: List[ChatCompletionDeltaChoice]
  62. usage: UsageModel
  63. @classmethod
  64. def model_construct(
  65. cls,
  66. content: str,
  67. finish_reason: str,
  68. completion_id: str = None,
  69. created: int = None,
  70. usage: UsageModel = None
  71. ):
  72. return super().model_construct(
  73. id=f"chatcmpl-{completion_id}" if completion_id else None,
  74. object="chat.completion.cunk",
  75. created=created,
  76. model=None,
  77. provider=None,
  78. choices=[ChatCompletionDeltaChoice.model_construct(
  79. ChatCompletionDelta.model_construct(content),
  80. finish_reason
  81. )],
  82. **filter_none(usage=usage)
  83. )
  84. class ChatCompletionMessage(BaseModel):
  85. role: str
  86. content: str
  87. tool_calls: list[ToolCallModel] = None
  88. @classmethod
  89. def model_construct(cls, content: str, tool_calls: list = None):
  90. return super().model_construct(role="assistant", content=content, **filter_none(tool_calls=tool_calls))
  91. class ChatCompletionChoice(BaseModel):
  92. index: int
  93. message: ChatCompletionMessage
  94. finish_reason: str
  95. @classmethod
  96. def model_construct(cls, message: ChatCompletionMessage, finish_reason: str):
  97. return super().model_construct(index=0, message=message, finish_reason=finish_reason)
  98. class ChatCompletion(BaseModel):
  99. id: str
  100. object: str
  101. created: int
  102. model: str
  103. provider: Optional[str]
  104. choices: List[ChatCompletionChoice]
  105. usage: UsageModel
  106. @classmethod
  107. def model_construct(
  108. cls,
  109. content: str,
  110. finish_reason: str,
  111. completion_id: str = None,
  112. created: int = None,
  113. tool_calls: list[ToolCallModel] = None,
  114. usage: UsageModel = None
  115. ):
  116. return super().model_construct(
  117. id=f"chatcmpl-{completion_id}" if completion_id else None,
  118. object="chat.completion",
  119. created=created,
  120. model=None,
  121. provider=None,
  122. choices=[ChatCompletionChoice.model_construct(
  123. ChatCompletionMessage.model_construct(content, tool_calls),
  124. finish_reason,
  125. )],
  126. **filter_none(usage=usage)
  127. )
  128. class ChatCompletionDelta(BaseModel):
  129. role: str
  130. content: str
  131. @classmethod
  132. def model_construct(cls, content: Optional[str]):
  133. return super().model_construct(role="assistant", content=content)
  134. class ChatCompletionDeltaChoice(BaseModel):
  135. index: int
  136. delta: ChatCompletionDelta
  137. finish_reason: Optional[str]
  138. @classmethod
  139. def model_construct(cls, delta: ChatCompletionDelta, finish_reason: Optional[str]):
  140. return super().model_construct(index=0, delta=delta, finish_reason=finish_reason)
  141. class Image(BaseModel):
  142. url: Optional[str]
  143. b64_json: Optional[str]
  144. revised_prompt: Optional[str]
  145. @classmethod
  146. def model_construct(cls, url: str = None, b64_json: str = None, revised_prompt: str = None):
  147. return super().model_construct(**filter_none(
  148. url=url,
  149. b64_json=b64_json,
  150. revised_prompt=revised_prompt
  151. ))
  152. class ImagesResponse(BaseModel):
  153. data: List[Image]
  154. model: str
  155. provider: str
  156. created: int
  157. @classmethod
  158. def model_construct(cls, data: List[Image], created: int = None, model: str = None, provider: str = None):
  159. if created is None:
  160. created = int(time())
  161. return super().model_construct(
  162. data=data,
  163. model=model,
  164. provider=provider,
  165. created=created
  166. )