aidial_sdk/chat_completion/request.py (148 lines of code) (raw):
from enum import Enum
from typing import Any, Dict, List, Literal, Mapping, Optional, Union
from typing_extensions import assert_never
from aidial_sdk.chat_completion.enums import Status
from aidial_sdk.deployment.from_request_mixin import FromRequestDeploymentMixin
from aidial_sdk.exceptions import InvalidRequestError
from aidial_sdk.pydantic_v1 import (
ConstrainedFloat,
ConstrainedInt,
ConstrainedList,
PositiveInt,
StrictBool,
StrictInt,
StrictStr,
)
from aidial_sdk.utils.pydantic import ExtraForbidModel
class Attachment(ExtraForbidModel):
type: Optional[StrictStr] = "text/markdown"
title: Optional[StrictStr] = None
data: Optional[StrictStr] = None
url: Optional[StrictStr] = None
reference_type: Optional[StrictStr] = None
reference_url: Optional[StrictStr] = None
class Stage(ExtraForbidModel):
name: StrictStr
status: Status
content: Optional[StrictStr] = None
attachments: Optional[List[Attachment]] = None
class CustomContent(ExtraForbidModel):
stages: Optional[List[Stage]] = None
attachments: Optional[List[Attachment]] = None
state: Optional[Any] = None
form_value: Optional[Any] = None
form_schema: Optional[Any] = None
class FunctionCall(ExtraForbidModel):
name: str
arguments: str
class ToolCall(ExtraForbidModel):
# OpenAI API doesn't strictly specify existence of the index field
index: Optional[int]
id: StrictStr
type: Literal["function"]
function: FunctionCall
class Role(str, Enum):
SYSTEM = "system"
USER = "user"
ASSISTANT = "assistant"
FUNCTION = "function"
TOOL = "tool"
class ImageURL(ExtraForbidModel):
url: StrictStr
detail: Optional[Literal["auto", "low", "high"]] = None
class MessageContentImagePart(ExtraForbidModel):
type: Literal["image_url"]
image_url: ImageURL
class MessageContentTextPart(ExtraForbidModel):
type: Literal["text"]
text: StrictStr
MessageContentPart = Union[MessageContentTextPart, MessageContentImagePart]
class Message(ExtraForbidModel):
role: Role
content: Optional[Union[StrictStr, List[MessageContentPart]]] = None
custom_content: Optional[CustomContent] = None
name: Optional[StrictStr] = None
tool_calls: Optional[List[ToolCall]] = None
tool_call_id: Optional[StrictStr] = None
function_call: Optional[FunctionCall] = None
def text(self) -> str:
"""
Returns content of the message only if it's present as a string.
Otherwise, throws an invalid request exception.
"""
def _error_message(actual: str) -> str:
return f"Unable to retrieve text content of the message: the actual content is {actual}."
if self.content is None:
raise InvalidRequestError(_error_message("null or missing"))
elif isinstance(self.content, str):
return self.content
elif isinstance(self.content, list):
raise InvalidRequestError(_error_message("a list of content parts"))
else:
assert_never(self.content)
class Addon(ExtraForbidModel):
name: Optional[StrictStr] = None
url: Optional[StrictStr] = None
class Function(ExtraForbidModel):
name: StrictStr
description: Optional[StrictStr] = None
parameters: Optional[Dict] = None
class Temperature(ConstrainedFloat):
ge = 0
le = 2
class TopP(ConstrainedFloat):
ge = 0
le = 1
class N(ConstrainedInt):
ge = 1
le = 128
class Stop(ConstrainedList):
max_items: int = 4
__args__ = tuple([StrictStr])
class Penalty(ConstrainedFloat):
ge = -2
le = 2
class Tool(ExtraForbidModel):
type: Literal["function"]
function: Function
class StaticFunction(ExtraForbidModel):
name: str
description: Optional[str] = None
configuration: Optional[Dict[str, Any]] = None
class StaticTool(ExtraForbidModel):
type: Literal["static_function"]
static_function: StaticFunction
class FunctionChoice(ExtraForbidModel):
name: StrictStr
class ToolChoice(ExtraForbidModel):
type: Literal["function"]
function: FunctionChoice
class ResponseFormat(ExtraForbidModel):
type: Literal["text", "json_object"]
class AzureChatCompletionRequest(ExtraForbidModel):
model: Optional[StrictStr] = None
messages: List[Message]
functions: Optional[List[Function]] = None
function_call: Optional[Union[Literal["auto", "none"], FunctionChoice]] = (
None
)
tools: Optional[List[Union[Tool, StaticTool]]] = None
tool_choice: Optional[Union[Literal["auto", "none"], ToolChoice]] = None
stream: bool = False
temperature: Optional[Temperature] = None
top_p: Optional[TopP] = None
n: Optional[N] = None
stop: Optional[Union[StrictStr, Stop]] = None
max_tokens: Optional[PositiveInt] = None
presence_penalty: Optional[Penalty] = None
frequency_penalty: Optional[Penalty] = None
logit_bias: Optional[Mapping[int, float]] = None
user: Optional[StrictStr] = None
seed: Optional[StrictInt] = None
logprobs: Optional[StrictBool] = None
top_logprobs: Optional[StrictInt] = None
response_format: Optional[ResponseFormat] = None
class ChatCompletionRequestCustomFields(ExtraForbidModel):
configuration: Optional[Dict[str, Any]] = None
application_properties: Optional[Dict[str, Any]] = None
class ChatCompletionRequest(AzureChatCompletionRequest):
addons: Optional[List[Addon]] = None
max_prompt_tokens: Optional[PositiveInt] = None
custom_fields: Optional[ChatCompletionRequestCustomFields] = None
class Request(ChatCompletionRequest, FromRequestDeploymentMixin):
pass