Skip to content

Commit 2cc0599

Browse files
authored
chore!: optimum - drop Python 3.9 and use X|Y typing (#2721)
1 parent ffd5d69 commit 2cc0599

4 files changed

Lines changed: 30 additions & 36 deletions

File tree

integrations/optimum/pyproject.toml

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ name = "optimum-haystack"
77
dynamic = ["version"]
88
description = "Component to embed strings and Documents using models loaded with the HuggingFace Optimum library. This component is designed to seamlessly inference models using the high speed ONNX runtime."
99
readme = "README.md"
10-
requires-python = ">=3.9"
10+
requires-python = ">=3.10"
1111
license = "Apache-2.0"
1212
keywords = []
1313
authors = [
@@ -18,15 +18,14 @@ classifiers = [
1818
"License :: OSI Approved :: Apache Software License",
1919
"Development Status :: 4 - Beta",
2020
"Programming Language :: Python",
21-
"Programming Language :: Python :: 3.9",
2221
"Programming Language :: Python :: 3.10",
2322
"Programming Language :: Python :: 3.11",
2423
"Programming Language :: Python :: 3.12",
2524
"Programming Language :: Python :: Implementation :: CPython",
2625
"Programming Language :: Python :: Implementation :: PyPy",
2726
]
2827
dependencies = [
29-
"haystack-ai",
28+
"haystack-ai>=2.22.0",
3029
"optimum[onnxruntime]>=1.21.0",
3130
# The main export function of Optimum into ONNX has hidden dependencies.
3231
# It depends on either "sentence-transformers", "diffusers" or "timm", based
@@ -99,7 +98,6 @@ known-first-party = ["haystack_integrations"]
9998

10099

101100
[tool.ruff]
102-
target-version = "py39"
103101
line-length = 120
104102
exclude = ["example", "tests"]
105103

@@ -146,10 +144,6 @@ ignore = [
146144
# Asserts
147145
"S101",
148146
]
149-
unfixable = [
150-
# Don't touch unused imports
151-
"F401",
152-
]
153147

154148
[tool.ruff.lint.flake8-tidy-imports]
155149
ban-relative-imports = "parents"

integrations/optimum/src/haystack_integrations/components/embedders/optimum/_backend.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import json
77
from dataclasses import dataclass
88
from pathlib import Path
9-
from typing import Any, Optional, Union, overload
9+
from typing import Any, overload
1010

1111
import numpy as np
1212
import torch
@@ -32,18 +32,18 @@
3232
@dataclass
3333
class _EmbedderParams:
3434
model: str
35-
token: Optional[Secret]
35+
token: Secret | None
3636
prefix: str
3737
suffix: str
3838
normalize_embeddings: bool
3939
onnx_execution_provider: str
4040
batch_size: int
4141
progress_bar: bool
42-
pooling_mode: Optional[Union[str, OptimumEmbedderPooling]]
43-
model_kwargs: Optional[dict[str, Any]]
44-
working_dir: Optional[str]
45-
optimizer_settings: Optional[OptimumEmbedderOptimizationConfig]
46-
quantizer_settings: Optional[OptimumEmbedderQuantizationConfig]
42+
pooling_mode: str | OptimumEmbedderPooling | None
43+
model_kwargs: dict[str, Any] | None
44+
working_dir: str | None
45+
optimizer_settings: OptimumEmbedderOptimizationConfig | None
46+
quantizer_settings: OptimumEmbedderQuantizationConfig | None
4747

4848
def serialize(self) -> dict[str, Any]:
4949
out = {}
@@ -115,7 +115,7 @@ def __init__(self, params: _EmbedderParams):
115115
self.params = params
116116
self.model = None
117117
self.tokenizer = None
118-
self.pooling_layer: Optional[SentenceTransformerPoolingLayer] = None
118+
self.pooling_layer: SentenceTransformerPoolingLayer | None = None
119119

120120
def warm_up(self):
121121
assert self.params.model_kwargs
@@ -200,8 +200,8 @@ def embed_texts(self, texts_to_embed: list[str]) -> list[list[float]]: ...
200200

201201
def embed_texts(
202202
self,
203-
texts_to_embed: Union[str, list[str]],
204-
) -> Union[list[list[float]], list[float]]:
203+
texts_to_embed: str | list[str],
204+
) -> list[list[float]] | list[float]:
205205
assert self.model is not None
206206
assert self.tokenizer is not None
207207

@@ -236,7 +236,7 @@ def embed_texts(
236236

237237
# Reorder embeddings according to original order
238238
reordered_embeddings: list[list[float]] = [None] * len(texts) # type: ignore
239-
for embedding, idx in zip(embeddings, length_sorted_idx):
239+
for embedding, idx in zip(embeddings, length_sorted_idx, strict=True):
240240
reordered_embeddings[idx] = embedding
241241

242242
if isinstance(texts_to_embed, str):
@@ -245,7 +245,7 @@ def embed_texts(
245245
return reordered_embeddings
246246

247247

248-
def _pooling_from_model_config(model: str, token: Optional[str] = None) -> Optional[OptimumEmbedderPooling]:
248+
def _pooling_from_model_config(model: str, token: str | None = None) -> OptimumEmbedderPooling | None:
249249
try:
250250
pooling_config_path = hf_hub_download(repo_id=model, token=token, filename="1_Pooling/config.json")
251251
except Exception as e:

integrations/optimum/src/haystack_integrations/components/embedders/optimum/optimum_document_embedder.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# SPDX-License-Identifier: Apache-2.0
44

55
from dataclasses import replace
6-
from typing import Any, Optional, Union
6+
from typing import Any
77

88
from haystack import Document, component, default_from_dict, default_to_dict
99
from haystack.utils import Secret
@@ -43,19 +43,19 @@ class OptimumDocumentEmbedder:
4343
def __init__(
4444
self,
4545
model: str = "sentence-transformers/all-mpnet-base-v2",
46-
token: Optional[Secret] = Secret.from_env_var("HF_API_TOKEN", strict=False), # noqa: B008
46+
token: Secret | None = Secret.from_env_var("HF_API_TOKEN", strict=False), # noqa: B008
4747
prefix: str = "",
4848
suffix: str = "",
4949
normalize_embeddings: bool = True,
5050
onnx_execution_provider: str = "CPUExecutionProvider",
51-
pooling_mode: Optional[Union[str, OptimumEmbedderPooling]] = None,
52-
model_kwargs: Optional[dict[str, Any]] = None,
53-
working_dir: Optional[str] = None,
54-
optimizer_settings: Optional[OptimumEmbedderOptimizationConfig] = None,
55-
quantizer_settings: Optional[OptimumEmbedderQuantizationConfig] = None,
51+
pooling_mode: str | OptimumEmbedderPooling | None = None,
52+
model_kwargs: dict[str, Any] | None = None,
53+
working_dir: str | None = None,
54+
optimizer_settings: OptimumEmbedderOptimizationConfig | None = None,
55+
quantizer_settings: OptimumEmbedderQuantizationConfig | None = None,
5656
batch_size: int = 32,
5757
progress_bar: bool = True,
58-
meta_fields_to_embed: Optional[list[str]] = None,
58+
meta_fields_to_embed: list[str] | None = None,
5959
embedding_separator: str = "\n",
6060
) -> None:
6161
"""
@@ -226,7 +226,7 @@ def run(self, documents: list[Document]) -> dict[str, list[Document]]:
226226
embeddings = self._backend.embed_texts(texts_to_embed)
227227

228228
new_documents = []
229-
for doc, emb in zip(documents, embeddings):
229+
for doc, emb in zip(documents, embeddings, strict=True):
230230
new_documents.append(replace(doc, embedding=emb))
231231

232232
return {"documents": new_documents}

integrations/optimum/src/haystack_integrations/components/embedders/optimum/optimum_text_embedder.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#
33
# SPDX-License-Identifier: Apache-2.0
44

5-
from typing import Any, Optional, Union
5+
from typing import Any
66

77
from haystack import component, default_from_dict, default_to_dict
88
from haystack.utils import Secret
@@ -38,16 +38,16 @@ class OptimumTextEmbedder:
3838
def __init__(
3939
self,
4040
model: str = "sentence-transformers/all-mpnet-base-v2",
41-
token: Optional[Secret] = Secret.from_env_var("HF_API_TOKEN", strict=False), # noqa: B008
41+
token: Secret | None = Secret.from_env_var("HF_API_TOKEN", strict=False), # noqa: B008
4242
prefix: str = "",
4343
suffix: str = "",
4444
normalize_embeddings: bool = True,
4545
onnx_execution_provider: str = "CPUExecutionProvider",
46-
pooling_mode: Optional[Union[str, OptimumEmbedderPooling]] = None,
47-
model_kwargs: Optional[dict[str, Any]] = None,
48-
working_dir: Optional[str] = None,
49-
optimizer_settings: Optional[OptimumEmbedderOptimizationConfig] = None,
50-
quantizer_settings: Optional[OptimumEmbedderQuantizationConfig] = None,
46+
pooling_mode: str | OptimumEmbedderPooling | None = None,
47+
model_kwargs: dict[str, Any] | None = None,
48+
working_dir: str | None = None,
49+
optimizer_settings: OptimumEmbedderOptimizationConfig | None = None,
50+
quantizer_settings: OptimumEmbedderQuantizationConfig | None = None,
5151
):
5252
"""
5353
Create a OptimumTextEmbedder component.

0 commit comments

Comments
 (0)