stubs.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. ToolCalls = Optional[List[Dict[str, Any]]]
  6. Usage = Optional[Dict[str, int]]
  7. try:
  8. from pydantic import BaseModel, Field
  9. except ImportError:
  10. class BaseModel():
  11. @classmethod
  12. def model_construct(cls, **data):
  13. new = cls()
  14. for key, value in data.items():
  15. setattr(new, key, value)
  16. return new
  17. class Field():
  18. def __init__(self, **config):
  19. pass
  20. class BaseModel(BaseModel):
  21. @classmethod
  22. def model_construct(cls, **data):
  23. if hasattr(super(), "model_construct"):
  24. return super().model_construct(**data)
  25. return cls.construct(**data)
  26. class ChatCompletionChunk(BaseModel):
  27. id: str
  28. object: str
  29. created: int
  30. model: str
  31. provider: Optional[str]
  32. choices: List[ChatCompletionDeltaChoice]
  33. usage: Usage
  34. @classmethod
  35. def model_construct(
  36. cls,
  37. content: str,
  38. finish_reason: str,
  39. completion_id: str = None,
  40. created: int = None,
  41. usage: Usage = None
  42. ):
  43. return super().model_construct(
  44. id=f"chatcmpl-{completion_id}" if completion_id else None,
  45. object="chat.completion.cunk",
  46. created=created,
  47. model=None,
  48. provider=None,
  49. choices=[ChatCompletionDeltaChoice.model_construct(
  50. ChatCompletionDelta.model_construct(content),
  51. finish_reason
  52. )],
  53. **filter_none(usage=usage)
  54. )
  55. class ChatCompletionMessage(BaseModel):
  56. role: str
  57. content: str
  58. tool_calls: ToolCalls
  59. @classmethod
  60. def model_construct(cls, content: str, tool_calls: ToolCalls = None):
  61. return super().model_construct(role="assistant", content=content, **filter_none(tool_calls=tool_calls))
  62. class ChatCompletionChoice(BaseModel):
  63. index: int
  64. message: ChatCompletionMessage
  65. finish_reason: str
  66. @classmethod
  67. def model_construct(cls, message: ChatCompletionMessage, finish_reason: str):
  68. return super().model_construct(index=0, message=message, finish_reason=finish_reason)
  69. class ChatCompletion(BaseModel):
  70. id: str
  71. object: str
  72. created: int
  73. model: str
  74. provider: Optional[str]
  75. choices: List[ChatCompletionChoice]
  76. usage: Usage = Field(default={
  77. "prompt_tokens": 0, #prompt_tokens,
  78. "completion_tokens": 0, #completion_tokens,
  79. "total_tokens": 0, #prompt_tokens + completion_tokens,
  80. })
  81. @classmethod
  82. def model_construct(
  83. cls,
  84. content: str,
  85. finish_reason: str,
  86. completion_id: str = None,
  87. created: int = None,
  88. tool_calls: ToolCalls = None,
  89. usage: Usage = None
  90. ):
  91. return super().model_construct(
  92. id=f"chatcmpl-{completion_id}" if completion_id else None,
  93. object="chat.completion",
  94. created=created,
  95. model=None,
  96. provider=None,
  97. choices=[ChatCompletionChoice.model_construct(
  98. ChatCompletionMessage.model_construct(content, tool_calls),
  99. finish_reason,
  100. )],
  101. **filter_none(usage=usage)
  102. )
  103. class ChatCompletionDelta(BaseModel):
  104. role: str
  105. content: str
  106. @classmethod
  107. def model_construct(cls, content: Optional[str]):
  108. return super().model_construct(role="assistant", content=content)
  109. class ChatCompletionDeltaChoice(BaseModel):
  110. index: int
  111. delta: ChatCompletionDelta
  112. finish_reason: Optional[str]
  113. @classmethod
  114. def model_construct(cls, delta: ChatCompletionDelta, finish_reason: Optional[str]):
  115. return super().model_construct(index=0, delta=delta, finish_reason=finish_reason)
  116. class Image(BaseModel):
  117. url: Optional[str]
  118. b64_json: Optional[str]
  119. revised_prompt: Optional[str]
  120. @classmethod
  121. def model_construct(cls, url: str = None, b64_json: str = None, revised_prompt: str = None):
  122. return super().model_construct(**filter_none(
  123. url=url,
  124. b64_json=b64_json,
  125. revised_prompt=revised_prompt
  126. ))
  127. class ImagesResponse(BaseModel):
  128. data: List[Image]
  129. model: str
  130. provider: str
  131. created: int
  132. @classmethod
  133. def model_construct(cls, data: List[Image], created: int = None, model: str = None, provider: str = None):
  134. if created is None:
  135. created = int(time())
  136. return super().model_construct(
  137. data=data,
  138. model=model,
  139. provider=provider,
  140. created=created
  141. )