Skip to content

Commit 78a0c0f

Browse files
authored
Merge pull request Pipelex#136 from Pipelex/release/v0.4.11
Release/v0.4.11
2 parents 585df68 + 61f2248 commit 78a0c0f

13 files changed

Lines changed: 79 additions & 192 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## [v0.4.11] - 2025-06-30
4+
5+
- **LLM Settings Simplification**: Streamlined LLM choice system by removing complex `for_object_direct`, `for_object_list`, and `for_object_list_direct` options. LLM selection now uses a simpler fallback pattern: specific choice → text choice → overrides → defaults.
6+
- **Image Model Updates**: Renamed `image_bytes` field to `base_64` in `PromptImageTypedBytes` for better consistency. Updated to use `CustomBaseModel` base class to benefit from bytes truncation when printing.
7+
38
## [v0.4.10] - 2025-06-30
49

510
- Fixed a bad import statement

pipelex/cogt/image/prompt_image.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
from pipelex.tools.misc.attribute_utils import AttributePolisher
88
from pipelex.tools.misc.filetype_utils import FileType, detect_file_type_from_base64, detect_file_type_from_path
9+
from pipelex.tools.typing.pydantic_utils import CustomBaseModel
910

1011

11-
class PromptImageTypedBytes(BaseModel):
12-
image_bytes: bytes
12+
class PromptImageTypedBytes(CustomBaseModel):
13+
base_64: bytes
1314
file_type: FileType
1415

1516

@@ -37,7 +38,7 @@ class PromptImageUrl(PromptImage):
3738
@override
3839
def __str__(self) -> str:
3940
truncated_url = AttributePolisher.get_truncated_value(name="url", value=self.url)
40-
return f"PromptImageUrl(url='{truncated_url}')"
41+
return f"PromptImageUrl(url='{truncated_url!r}')"
4142

4243
@override
4344
def __format__(self, format_spec: str) -> str:
@@ -54,7 +55,7 @@ def get_file_type(self) -> FileType:
5455
def __str__(self) -> str:
5556
base_64_str = str(self.base_64)
5657
truncated_base_64 = AttributePolisher.get_truncated_value(name="base_64", value=base_64_str)
57-
return f"PromptImageBytes(image_bytes={truncated_base_64})"
58+
return f"PromptImageBytes(image_bytes={truncated_base_64!r})"
5859

5960
@override
6061
def __repr__(self) -> str:
@@ -65,4 +66,4 @@ def __format__(self, format_spec: str) -> str:
6566
return self.__str__()
6667

6768
def make_prompt_image_typed_bytes(self) -> PromptImageTypedBytes:
68-
return PromptImageTypedBytes(image_bytes=self.base_64, file_type=self.get_file_type())
69+
return PromptImageTypedBytes(base_64=self.base_64, file_type=self.get_file_type())

pipelex/cogt/llm/llm_models/llm_deck.py

Lines changed: 0 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from pydantic import field_validator, model_validator
44
from typing_extensions import Self, override
55

6-
from pipelex import log
76
from pipelex.cogt.exceptions import LLMDeckValidatonError, LLMHandleNotFoundError, LLMPresetNotFoundError, LLMSettingsValidationError
87
from pipelex.cogt.llm.llm_models.llm_deck_abstract import LLMDeckAbstract
98
from pipelex.cogt.llm.llm_models.llm_engine_blueprint import LLMEngineBlueprint
@@ -51,80 +50,6 @@ def get_llm_setting(self, llm_setting_or_preset_id: LLMSettingOrPresetId) -> LLM
5150
raise LLMPresetNotFoundError(f"LLM preset '{llm_setting_or_preset_id}' not found in deck")
5251
return the_llm_preset
5352

54-
@override
55-
def get_llm_setting_for_text(self, override: Optional[LLMSettingChoices] = None) -> LLMSetting:
56-
llm_setting: LLMSettingOrPresetId
57-
if replacement := self.llm_choice_overrides.for_text:
58-
log.warning(f"General llm setting override for text, '{self.llm_choice_defaults.for_text}' -> '{replacement}'")
59-
llm_setting = replacement
60-
elif override and (provided_override_for_text := override.for_text):
61-
llm_setting = provided_override_for_text
62-
elif self.llm_choice_defaults.for_text is None:
63-
raise ConfigValidationError("llm_choices.for_text cannot be None")
64-
else:
65-
llm_setting = self.llm_choice_defaults.for_text
66-
67-
return self.get_llm_setting(llm_setting_or_preset_id=llm_setting)
68-
69-
@override
70-
def get_llm_setting_for_object(self, override: Optional[LLMSettingChoices] = None) -> LLMSetting:
71-
log.debug(f"Getting LLM setting for object with provided_override: {override}")
72-
llm_setting: LLMSettingOrPresetId
73-
if replacement := self.llm_choice_overrides.for_object:
74-
log.warning(f"General llm setting override for object, '{self.llm_choice_defaults.for_object}' -> '{replacement}'")
75-
llm_setting = replacement
76-
elif override and (provided_override_for_object := override.for_object):
77-
llm_setting = provided_override_for_object
78-
elif self.llm_choice_defaults.for_object is None:
79-
raise ConfigValidationError("llm_choices.for_object cannot be None")
80-
else:
81-
llm_setting = self.llm_choice_defaults.for_object
82-
83-
return self.get_llm_setting(llm_setting_or_preset_id=llm_setting)
84-
85-
@override
86-
def get_llm_setting_for_object_direct(self, override: Optional[LLMSettingChoices] = None) -> LLMSetting:
87-
log.debug(f"Getting LLM preset for object direct with provided_override: {override}")
88-
llm_setting: LLMSettingOrPresetId
89-
if replacement := self.llm_choice_overrides.for_object_direct:
90-
log.warning(f"General choice override for LLM preset for structured, '{self.llm_choice_defaults.for_object_direct}' -> '{replacement}'")
91-
llm_setting = replacement
92-
elif override and (provided_override_for_object_direct := override.for_object_direct):
93-
llm_setting = provided_override_for_object_direct
94-
elif self.llm_choice_defaults.for_object_direct is None:
95-
raise ConfigValidationError("llm_choices.for_object_direct cannot be None")
96-
else:
97-
llm_setting = self.llm_choice_defaults.for_object_direct
98-
99-
return self.get_llm_setting(llm_setting_or_preset_id=llm_setting)
100-
101-
@override
102-
def get_llm_setting_for_object_list(self, override: Optional[LLMSettingChoices] = None) -> LLMSetting:
103-
llm_setting: LLMSettingOrPresetId
104-
if replacement := self.llm_choice_overrides.for_object_list:
105-
log.warning(f"General choice override for LLM preset for structured, '{self.llm_choice_defaults.for_object_list}' -> '{replacement}'")
106-
llm_setting = replacement
107-
elif override and (provided_override_for_object_list := override.for_object_list):
108-
llm_setting = provided_override_for_object_list
109-
elif self.llm_choice_defaults.for_object_list is None:
110-
raise ConfigValidationError("llm_choices.for_object_list cannot be None")
111-
else:
112-
llm_setting = self.llm_choice_defaults.for_object_list
113-
114-
return self.get_llm_setting(llm_setting_or_preset_id=llm_setting)
115-
116-
@override
117-
def get_llm_setting_for_object_list_direct(self, override: Optional[LLMSettingChoices] = None) -> LLMSetting:
118-
llm_setting: LLMSettingOrPresetId
119-
if override and (provided_override_for_object_list_direct := override.for_object_list_direct):
120-
llm_setting = provided_override_for_object_list_direct
121-
elif self.llm_choice_defaults.for_object_list_direct is None:
122-
raise ConfigValidationError("llm_choices.for_object_list_direct cannot be None")
123-
else:
124-
llm_setting = self.llm_choice_defaults.for_object_list_direct
125-
126-
return self.get_llm_setting(llm_setting_or_preset_id=llm_setting)
127-
12853
@override
12954
def find_llm_model(self, llm_handle: str) -> LLMModel:
13055
llm_models_provider = get_llm_models_provider()
@@ -202,12 +127,6 @@ def validate_llm_choice_defaults(cls, llm_choice_defaults: LLMSettingChoices) ->
202127
raise ConfigValidationError("llm_choice_defaults.for_text cannot be None")
203128
if llm_choice_defaults.for_object is None:
204129
raise ConfigValidationError("llm_choice_defaults.for_object cannot be None")
205-
if llm_choice_defaults.for_object_direct is None:
206-
raise ConfigValidationError("llm_choice_defaults.for_object_direct cannot be None")
207-
if llm_choice_defaults.for_object_list is None:
208-
raise ConfigValidationError("llm_choice_defaults.for_object_list cannot be None")
209-
if llm_choice_defaults.for_object_list_direct is None:
210-
raise ConfigValidationError("llm_choice_defaults.for_object_list_direct cannot be None")
211130
return llm_choice_defaults
212131

213132
@field_validator("llm_choice_overrides", mode="after")
@@ -217,12 +136,6 @@ def validate_llm_choice_overrides(cls, value: LLMSettingChoices) -> LLMSettingCh
217136
value.for_text = None
218137
if value.for_object == LLM_PRESET_DISABLED:
219138
value.for_object = None
220-
if value.for_object_direct == LLM_PRESET_DISABLED:
221-
value.for_object_direct = None
222-
if value.for_object_list == LLM_PRESET_DISABLED:
223-
value.for_object_list = None
224-
if value.for_object_list_direct == LLM_PRESET_DISABLED:
225-
value.for_object_list_direct = None
226139
return value
227140

228141
def add_llm_name_as_handle_with_defaults(self, llm_name: str):
@@ -237,11 +150,6 @@ def validate_llm_presets(self) -> Self:
237150
raise LLMHandleNotFoundError(f"llm_handle '{llm_setting.llm_handle}' for llm_preset '{llm_preset_id}' not found in deck")
238151
return self
239152

240-
@model_validator(mode="after")
241-
def validate_llm_default_choices(self) -> Self:
242-
self._validate_llm_choices(llm_choices=self.llm_choice_defaults)
243-
return self
244-
245153
@model_validator(mode="after")
246154
def validate_llm_setting_overrides(self) -> Self:
247155
self._validate_llm_choices(llm_choices=self.llm_choice_overrides)

pipelex/cogt/llm/llm_models/llm_deck_abstract.py

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,17 @@
66

77
from pipelex.cogt.llm.llm_models.llm_engine_blueprint import LLMEngineBlueprint
88
from pipelex.cogt.llm.llm_models.llm_model import LLMModel
9-
from pipelex.cogt.llm.llm_models.llm_setting import LLMSetting, LLMSettingChoices, LLMSettingOrPresetId
9+
from pipelex.cogt.llm.llm_models.llm_setting import LLMSetting, LLMSettingChoices, LLMSettingChoicesDefaults, LLMSettingOrPresetId
1010

1111

1212
class LLMDeckAbstract(ABC):
1313
llm_handles: Dict[str, LLMEngineBlueprint] = Field(default_factory=dict)
1414
llm_external_handles: List[str] = Field(default_factory=list)
1515
llm_presets: Dict[str, LLMSetting] = Field(default_factory=dict)
16-
llm_choice_defaults: LLMSettingChoices
16+
llm_choice_defaults: LLMSettingChoicesDefaults
1717
llm_choice_overrides: LLMSettingChoices = LLMSettingChoices(
1818
for_text=None,
1919
for_object=None,
20-
for_object_direct=None,
21-
for_object_list=None,
22-
for_object_list_direct=None,
2320
)
2421

2522
@abstractmethod
@@ -34,26 +31,6 @@ def get_llm_engine_blueprint(self, llm_handle: str) -> LLMEngineBlueprint:
3431
def get_llm_setting(self, llm_setting_or_preset_id: LLMSettingOrPresetId) -> LLMSetting:
3532
pass
3633

37-
@abstractmethod
38-
def get_llm_setting_for_text(self, override: Optional[LLMSettingChoices] = None) -> LLMSetting:
39-
pass
40-
41-
@abstractmethod
42-
def get_llm_setting_for_object(self, override: Optional[LLMSettingChoices] = None) -> LLMSetting:
43-
pass
44-
45-
@abstractmethod
46-
def get_llm_setting_for_object_direct(self, override: Optional[LLMSettingChoices] = None) -> LLMSetting:
47-
pass
48-
49-
@abstractmethod
50-
def get_llm_setting_for_object_list(self, override: Optional[LLMSettingChoices] = None) -> LLMSetting:
51-
pass
52-
53-
@abstractmethod
54-
def get_llm_setting_for_object_list_direct(self, override: Optional[LLMSettingChoices] = None) -> LLMSetting:
55-
pass
56-
5734
@abstractmethod
5835
def find_llm_model(self, llm_handle: str) -> LLMModel:
5936
pass

pipelex/cogt/llm/llm_models/llm_setting.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,14 @@ def desc(self) -> str:
5555
LLMSettingOrPresetId = Union[LLMSetting, str]
5656

5757

58+
class LLMSettingChoicesDefaults(ConfigModel):
59+
for_text: LLMSettingOrPresetId
60+
for_object: LLMSettingOrPresetId
61+
62+
5863
class LLMSettingChoices(ConfigModel):
5964
for_text: Optional[LLMSettingOrPresetId]
6065
for_object: Optional[LLMSettingOrPresetId]
61-
for_object_direct: Optional[LLMSettingOrPresetId]
62-
for_object_list: Optional[LLMSettingOrPresetId]
63-
for_object_list_direct: Optional[LLMSettingOrPresetId]
6466

6567
def list_used_presets(self) -> Set[str]:
6668
return set(
@@ -69,9 +71,6 @@ def list_used_presets(self) -> Set[str]:
6971
for setting in [
7072
self.for_text,
7173
self.for_object,
72-
self.for_object_direct,
73-
self.for_object_list,
74-
self.for_object_list_direct,
7574
]
7675
if isinstance(setting, str)
7776
]
@@ -82,14 +81,8 @@ def make_completed_with_defaults(
8281
cls,
8382
for_text: Optional[LLMSettingOrPresetId] = None,
8483
for_object: Optional[LLMSettingOrPresetId] = None,
85-
for_object_direct: Optional[LLMSettingOrPresetId] = None,
86-
for_object_list: Optional[LLMSettingOrPresetId] = None,
87-
for_object_list_direct: Optional[LLMSettingOrPresetId] = None,
8884
) -> Self:
8985
return cls(
9086
for_text=for_text,
9187
for_object=for_object,
92-
for_object_direct=for_object_direct,
93-
for_object_list=for_object_list,
94-
for_object_list_direct=for_object_list_direct,
9588
)

pipelex/libraries/llm_deck/base_llm_deck.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,3 @@ llm_to_extract_tables = { llm_handle = "best-claude", temperature = 0.1 }
7777
[llm_choice_defaults]
7878
for_text = "cheap_llm_for_text"
7979
for_object = "cheap_llm_for_object"
80-
for_object_direct = "cheap_llm_for_object"
81-
for_object_list = "cheap_llm_for_object"
82-
for_object_list_direct = "cheap_llm_for_object"

pipelex/libraries/llm_deck/overrides.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,3 @@
77
[llm_choice_overrides]
88
for_text = "disabled"
99
for_object = "disabled"
10-
for_object_direct = "disabled"
11-
for_object_list = "disabled"
12-
for_object_list_direct = "disabled"

0 commit comments

Comments
 (0)