speedy-utils 1.1.22__py3-none-any.whl → 1.1.24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
llm_utils/lm/lm.py DELETED
@@ -1,207 +0,0 @@
1
- # # from ._utils import *
2
- # from typing import (
3
- # Any,
4
- # List,
5
- # Literal,
6
- # Optional,
7
- # Type,
8
- # Union,
9
- # cast,
10
- # )
11
-
12
- # from loguru import logger
13
- # from openai import AuthenticationError, BadRequestError, OpenAI, RateLimitError
14
- # from pydantic import BaseModel
15
- # from speedy_utils import jloads
16
-
17
- # # from llm_utils.lm.async_lm.async_llm_task import OutputModelType
18
- # from llm_utils.lm.lm_base import LMBase
19
-
20
- # from .async_lm._utils import (
21
- # LegacyMsgs,
22
- # Messages,
23
- # OutputModelType,
24
- # ParsedOutput,
25
- # RawMsgs,
26
- # )
27
-
28
-
29
- # class LM(LMBase):
30
- # """Unified **sync** language‑model wrapper with optional JSON parsing."""
31
-
32
- # def __init__(
33
- # self,
34
- # *,
35
- # model: Optional[str] = None,
36
- # response_model: Optional[type[BaseModel]] = None,
37
- # temperature: float = 0.0,
38
- # max_tokens: int = 2_000,
39
- # base_url: Optional[str] = None,
40
- # api_key: Optional[str] = None,
41
- # cache: bool = True,
42
- # ports: Optional[List[int]] = None,
43
- # top_p: float = 1.0,
44
- # presence_penalty: float = 0.0,
45
- # top_k: int = 1,
46
- # repetition_penalty: float = 1.0,
47
- # frequency_penalty: Optional[float] = None,
48
- # ) -> None:
49
-
50
- # if model is None:
51
- # if base_url is None:
52
- # raise ValueError("Either model or base_url must be provided")
53
- # models = OpenAI(base_url=base_url, api_key=api_key or 'abc').models.list().data
54
- # assert len(models) == 1, f"Found {len(models)} models, please specify one."
55
- # model = models[0].id
56
- # print(f"Using model: {model}")
57
-
58
- # super().__init__(
59
- # ports=ports,
60
- # base_url=base_url,
61
- # cache=cache,
62
- # api_key=api_key,
63
- # )
64
-
65
- # # Model behavior options
66
- # self.response_model = response_model
67
-
68
- # # Store all model-related parameters in model_kwargs
69
- # self.model_kwargs = dict(
70
- # model=model,
71
- # temperature=temperature,
72
- # max_tokens=max_tokens,
73
- # top_p=top_p,
74
- # presence_penalty=presence_penalty,
75
- # )
76
- # self.extra_body = dict(
77
- # top_k=top_k,
78
- # repetition_penalty=repetition_penalty,
79
- # frequency_penalty=frequency_penalty,
80
- # )
81
-
82
- # def _unified_client_call(
83
- # self,
84
- # messages: RawMsgs,
85
- # extra_body: Optional[dict] = None,
86
- # max_tokens: Optional[int] = None,
87
- # ) -> dict:
88
- # """Unified method for all client interactions (caching handled by MOpenAI)."""
89
- # converted_messages: Messages = (
90
- # self._convert_messages(cast(LegacyMsgs, messages))
91
- # if messages and isinstance(messages[0], dict)
92
- # else cast(Messages, messages)
93
- # )
94
- # if max_tokens is not None:
95
- # self.model_kwargs["max_tokens"] = max_tokens
96
-
97
- # try:
98
- # # Get completion from API (caching handled by MOpenAI)
99
- # call_kwargs = {
100
- # "messages": converted_messages,
101
- # **self.model_kwargs,
102
- # }
103
- # if extra_body:
104
- # call_kwargs["extra_body"] = extra_body
105
-
106
- # completion = self.client.chat.completions.create(**call_kwargs)
107
-
108
- # if hasattr(completion, "model_dump"):
109
- # completion = completion.model_dump()
110
-
111
- # except (AuthenticationError, RateLimitError, BadRequestError) as exc:
112
- # error_msg = f"OpenAI API error ({type(exc).__name__}): {exc}"
113
- # logger.error(error_msg)
114
- # raise
115
-
116
- # return completion
117
-
118
- # def __call__(
119
- # self,
120
- # prompt: Optional[str] = None,
121
- # messages: Optional[RawMsgs] = None,
122
- # max_tokens: Optional[int] = None,
123
- # ): # -> tuple[Any | dict[Any, Any], list[ChatCompletionMessagePar...:# -> tuple[Any | dict[Any, Any], list[ChatCompletionMessagePar...:
124
- # """Unified sync call for language model, returns (assistant_message.model_dump(), messages)."""
125
- # if (prompt is None) == (messages is None):
126
- # raise ValueError("Provide *either* `prompt` or `messages` (but not both).")
127
-
128
- # if prompt is not None:
129
- # messages = [{"role": "user", "content": prompt}]
130
-
131
- # assert messages is not None
132
-
133
- # openai_msgs: Messages = (
134
- # self._convert_messages(cast(LegacyMsgs, messages))
135
- # if isinstance(messages[0], dict)
136
- # else cast(Messages, messages)
137
- # )
138
-
139
- # assert self.model_kwargs["model"] is not None, (
140
- # "Model must be set before making a call."
141
- # )
142
-
143
- # # Use unified client call
144
- # raw_response = self._unified_client_call(
145
- # list(openai_msgs), max_tokens=max_tokens
146
- # )
147
-
148
- # if hasattr(raw_response, "model_dump"):
149
- # raw_response = raw_response.model_dump() # type: ignore
150
-
151
- # # Extract the assistant's message
152
- # assistant_msg = raw_response["choices"][0]["message"]
153
- # # Build the full messages list (input + assistant reply)
154
- # full_messages = list(messages) + [
155
- # {"role": assistant_msg["role"], "content": assistant_msg["content"]}
156
- # ]
157
- # # Return the OpenAI message as model_dump (if available) and the messages list
158
- # if hasattr(assistant_msg, "model_dump"):
159
- # msg_dump = assistant_msg.model_dump()
160
- # else:
161
- # msg_dump = dict(assistant_msg)
162
- # return msg_dump, full_messages
163
-
164
- # def parse(
165
- # self,
166
- # messages: Messages,
167
- # response_model: Optional[type[BaseModel]] = None,
168
- # ) -> ParsedOutput[BaseModel]:
169
- # """Parse response using OpenAI's native parse API."""
170
- # # Use provided response_model or fall back to instance default
171
- # model_to_use = response_model or self.response_model
172
- # assert model_to_use is not None, "response_model must be provided or set at init."
173
-
174
- # # Use OpenAI's native parse API directly
175
- # response = self.client.chat.completions.parse(
176
- # model=self.model_kwargs["model"],
177
- # messages=messages,
178
- # response_format=model_to_use,
179
- # **{k: v for k, v in self.model_kwargs.items() if k != "model"}
180
- # )
181
-
182
- # parsed = response.choices[0].message.parsed
183
- # completion = response.model_dump() if hasattr(response, "model_dump") else {}
184
- # full_messages = list(messages) + [
185
- # {"role": "assistant", "content": parsed}
186
- # ]
187
-
188
- # return ParsedOutput(
189
- # messages=full_messages,
190
- # parsed=cast(BaseModel, parsed),
191
- # completion=completion,
192
- # model_kwargs=self.model_kwargs,
193
- # )
194
-
195
-
196
-
197
- # def __enter__(self):
198
- # return self
199
-
200
- # def __exit__(self, exc_type, exc_val, exc_tb):
201
- # if hasattr(self, "_last_client"):
202
- # last_client = self._last_client # type: ignore
203
- # if hasattr(last_client, "close"):
204
- # last_client.close()
205
- # else:
206
- # logger.warning("No last client to close")
207
- LM = None