some more skeleton
This commit is contained in:
@@ -1,13 +1,31 @@
|
|||||||
|
from openai import OpenAI
|
||||||
|
from openai.types.chat import ChatCompletion
|
||||||
|
|
||||||
from photools3.models import LlmRequest, LlmResponse
|
from photools3.models import LlmRequest
|
||||||
|
from photools3.settings import Settings
|
||||||
|
|
||||||
|
settings = Settings()
|
||||||
|
|
||||||
|
|
||||||
class LlmSession:
|
class LlmSession:
|
||||||
def __init__(self):
|
base_url: str = str(settings.llm_api_base_url)
|
||||||
...
|
api_key: str = settings.llm_api_key
|
||||||
|
|
||||||
def prompt(self, request: LlmRequest) -> LlmResponse:
|
def __init__(self, system_prompt: str):
|
||||||
...
|
self._models: list = []
|
||||||
|
|
||||||
def close(self):
|
self.system_prompt = system_prompt
|
||||||
...
|
|
||||||
|
self.client = OpenAI(
|
||||||
|
base_url=self.base_url,
|
||||||
|
api_key=self.api_key,
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def models(self):
|
||||||
|
if not self._models:
|
||||||
|
self._models = self.client.models.list().data
|
||||||
|
return self._models
|
||||||
|
|
||||||
|
def call_raw(self, request: LlmRequest) -> ChatCompletion:
|
||||||
|
return self.client.chat.completions.create(**request.model_dump())
|
||||||
|
|||||||
+24
-4
@@ -1,8 +1,28 @@
|
|||||||
from pydantic import BaseModel
|
from typing import Literal
|
||||||
|
|
||||||
|
from pydantic import BaseModel, model_validator
|
||||||
|
|
||||||
|
|
||||||
class LlmRequest(BaseModel):
|
class LlmRequest(BaseModel):
|
||||||
...
|
model_id: int
|
||||||
|
messages: list[LlmRequestMessage]
|
||||||
|
temperature: float | None = None
|
||||||
|
|
||||||
class LlmResponse(BaseModel):
|
|
||||||
...
|
class LlmRequestMessage(BaseModel):
|
||||||
|
role: Literal["system", "user"]
|
||||||
|
content: list[LlmMessageContent]
|
||||||
|
|
||||||
|
|
||||||
|
class LlmMessageContent(BaseModel):
|
||||||
|
type: Literal["text", "image_url"]
|
||||||
|
text: str | None = None
|
||||||
|
image_url: str | None = None
|
||||||
|
|
||||||
|
@model_validator(mode="after")
|
||||||
|
def _type_matches_content(self):
|
||||||
|
if self.type == "text" and self.text is None:
|
||||||
|
raise ValueError("text must be set when type is 'text'")
|
||||||
|
if self.type == "image_url" and self.image_url is None:
|
||||||
|
raise ValueError("image_url must be set when type is 'image_url'")
|
||||||
|
return self
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
from pydantic_core import Url
|
||||||
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||||
|
|
||||||
|
|
||||||
|
class Settings(BaseSettings):
|
||||||
|
model_config = SettingsConfigDict(env_file=".env")
|
||||||
|
|
||||||
|
llm_api_base_url: Url
|
||||||
|
llm_api_key: str
|
||||||
Reference in New Issue
Block a user