|
|
from typing import List, Optional, Union, Dict, Any, Literal
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
|
|
|
class ChatMessage(BaseModel):
|
|
|
role: str = Field()
|
|
|
content: str = Field()
|
|
|
|
|
|
|
|
|
class Logprob(BaseModel):
|
|
|
token: str
|
|
|
logprob: float
|
|
|
top_logprobs: Optional[List[Dict[str, Any]]] = None
|
|
|
|
|
|
|
|
|
class LogprobsContent(BaseModel):
|
|
|
content: Optional[List[Logprob]] = None
|
|
|
refusal: Optional[List[Logprob]] = None
|
|
|
|
|
|
|
|
|
class FunctionCall(BaseModel):
|
|
|
name: str
|
|
|
arguments: str
|
|
|
|
|
|
|
|
|
class ChatCompletionMessage(BaseModel):
|
|
|
role: Optional[str] = Field(
|
|
|
None, description="The role of the author of this message"
|
|
|
)
|
|
|
content: Optional[str] = Field(None, description="The contents of the message")
|
|
|
reasoning_content: Optional[str] = Field(
|
|
|
None, description="The reasoning contents of the message"
|
|
|
)
|
|
|
tool_calls: Optional[List[Dict[str, Any]]] = Field(
|
|
|
None, description="Tool calls generated by the model"
|
|
|
)
|
|
|
|
|
|
|
|
|
class SamplerConfig(BaseModel):
|
|
|
"""Sampler configuration used in API requests and model defaults.
|
|
|
|
|
|
This mirrors the server-side `SamplerConfig` and exposes an optional
|
|
|
`ALLOW_*` set of fields that can be used to override the model/global
|
|
|
allow flags per-request (when present)."""
|
|
|
|
|
|
max_tokens: Optional[int] = Field(512)
|
|
|
temperature: Optional[float] = Field(1.0)
|
|
|
top_p: Optional[float] = Field(0.3)
|
|
|
presence_penalty: Optional[float] = Field(0.5)
|
|
|
count_penalty: Optional[float] = Field(0.5)
|
|
|
penalty_decay: Optional[float] = Field(0.996)
|
|
|
stop: Optional[List[str]] = Field(default_factory=lambda: ["\n\n"])
|
|
|
stop_tokens: Optional[List[int]] = Field(default_factory=lambda: [0])
|
|
|
ALLOW_WEB_SEARCH: Optional[bool] = Field(None)
|
|
|
ALLOW_TOOLS: Optional[bool] = Field(None)
|
|
|
ALLOW_REASONING: Optional[bool] = Field(None)
|
|
|
ALLOW_FILE_TOOL: Optional[bool] = Field(None, description="Per-sampler override for allowing file tools (uploads/file_read).")
|
|
|
|
|
|
SHOW_WEB_SEARCH_BUTTON: Optional[bool] = Field(None, description="Whether the UI should show a web-search toggle for this sampler")
|
|
|
SHOW_FILE_UPLOAD_BUTTON: Optional[bool] = Field(None, description="Whether the UI should show a file upload control for this sampler")
|
|
|
SHOW_REASONING_TOGGLE: Optional[bool] = Field(None, description="Whether the UI should show a reasoning toggle for this sampler")
|
|
|
|
|
|
UI_STYLE: Optional[str] = Field(None, description="UI style hint that clients may use to render controls (example: 'whatsapp' or 'compact')")
|
|
|
|
|
|
|
|
|
class PromptTokensDetails(BaseModel):
|
|
|
cached_tokens: int
|
|
|
|
|
|
|
|
|
class CompletionTokensDetails(BaseModel):
|
|
|
reasoning_tokens: int
|
|
|
accepted_prediction_tokens: int
|
|
|
rejected_prediction_tokens: int
|
|
|
|
|
|
|
|
|
class Usage(BaseModel):
|
|
|
prompt_tokens: int
|
|
|
completion_tokens: int
|
|
|
total_tokens: int
|
|
|
prompt_tokens_details: Optional[PromptTokensDetails]
|
|
|
|
|
|
|
|
|
|
|
|
class ChatCompletionChoice(BaseModel):
|
|
|
index: int
|
|
|
message: Optional[ChatCompletionMessage] = None
|
|
|
delta: Optional[ChatCompletionMessage] = None
|
|
|
logprobs: Optional[LogprobsContent] = None
|
|
|
finish_reason: Optional[str] = Field(
|
|
|
..., description="Reason for stopping: stop, length, content_filter, tool_calls"
|
|
|
)
|
|
|
|
|
|
|
|
|
class ChatCompletion(BaseModel):
|
|
|
id: str = Field(..., description="Unique identifier for the chat completion")
|
|
|
object: Literal["chat.completion"] = "chat.completion"
|
|
|
created: int = Field(..., description="Unix timestamp of creation")
|
|
|
model: str
|
|
|
choices: List[ChatCompletionChoice]
|
|
|
usage: Usage
|
|
|
|
|
|
|
|
|
class ChatCompletionChunk(BaseModel):
|
|
|
id: str = Field(..., description="Unique identifier for the chat completion")
|
|
|
object: Literal["chat.completion.chunk"] = "chat.completion.chunk"
|
|
|
created: int = Field(..., description="Unix timestamp of creation")
|
|
|
model: str
|
|
|
choices: List[ChatCompletionChoice]
|
|
|
usage: Optional[Usage]
|
|
|
|
|
|
|
|
|
class UploadedFile(BaseModel):
|
|
|
file_id: str
|
|
|
filename: str
|
|
|
size: int
|
|
|
mime_type: Optional[str] = None
|
|
|
path: Optional[str] = None
|
|
|
uploaded_at: Optional[int] = None
|
|
|
|
|
|
|
|
|
class FileUploadResponse(BaseModel):
|
|
|
success: bool = True
|
|
|
file: UploadedFile
|
|
|
|