Skip to content

Commit

Permalink
Merge branch 'main' into add-documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelfeil authored Dec 18, 2024
2 parents 36c7a4c + 944643b commit e336f8f
Show file tree
Hide file tree
Showing 23 changed files with 419 additions and 60 deletions.
2 changes: 1 addition & 1 deletion docs/assets/openapi.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ class OpenAIEmbeddingInputAudio:
model (Union[Unset, str]): Default: 'default/not-specified'.
encoding_format (Union[Unset, EmbeddingEncodingFormat]):
user (Union[None, Unset, str]):
dimensions (Union[Unset, int]): Default: 0.
modality (Union[Unset, OpenAIEmbeddingInputAudioModality]): Default: OpenAIEmbeddingInputAudioModality.AUDIO.
"""

input_: Union[List[str], str]
model: Union[Unset, str] = "default/not-specified"
encoding_format: Union[Unset, EmbeddingEncodingFormat] = UNSET
user: Union[None, Unset, str] = UNSET
dimensions: Union[Unset, int] = 0
modality: Union[Unset, OpenAIEmbeddingInputAudioModality] = OpenAIEmbeddingInputAudioModality.AUDIO
additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)

Expand Down Expand Up @@ -52,6 +54,8 @@ def to_dict(self) -> Dict[str, Any]:
else:
user = self.user

dimensions = self.dimensions

modality: Union[Unset, str] = UNSET
if not isinstance(self.modality, Unset):
modality = self.modality.value
Expand All @@ -69,6 +73,8 @@ def to_dict(self) -> Dict[str, Any]:
field_dict["encoding_format"] = encoding_format
if user is not UNSET:
field_dict["user"] = user
if dimensions is not UNSET:
field_dict["dimensions"] = dimensions
if modality is not UNSET:
field_dict["modality"] = modality

Expand Down Expand Up @@ -118,6 +124,8 @@ def _parse_user(data: object) -> Union[None, Unset, str]:

user = _parse_user(d.pop("user", UNSET))

dimensions = d.pop("dimensions", UNSET)

_modality = d.pop("modality", UNSET)
modality: Union[Unset, OpenAIEmbeddingInputAudioModality]
if isinstance(_modality, Unset):
Expand All @@ -130,6 +138,7 @@ def _parse_user(data: object) -> Union[None, Unset, str]:
model=model,
encoding_format=encoding_format,
user=user,
dimensions=dimensions,
modality=modality,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ class OpenAIEmbeddingInputImage:
model (Union[Unset, str]): Default: 'default/not-specified'.
encoding_format (Union[Unset, EmbeddingEncodingFormat]):
user (Union[None, Unset, str]):
dimensions (Union[Unset, int]): Default: 0.
modality (Union[Unset, OpenAIEmbeddingInputImageModality]): Default: OpenAIEmbeddingInputImageModality.IMAGE.
"""

input_: Union[List[str], str]
model: Union[Unset, str] = "default/not-specified"
encoding_format: Union[Unset, EmbeddingEncodingFormat] = UNSET
user: Union[None, Unset, str] = UNSET
dimensions: Union[Unset, int] = 0
modality: Union[Unset, OpenAIEmbeddingInputImageModality] = OpenAIEmbeddingInputImageModality.IMAGE
additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)

Expand Down Expand Up @@ -52,6 +54,8 @@ def to_dict(self) -> Dict[str, Any]:
else:
user = self.user

dimensions = self.dimensions

modality: Union[Unset, str] = UNSET
if not isinstance(self.modality, Unset):
modality = self.modality.value
Expand All @@ -69,6 +73,8 @@ def to_dict(self) -> Dict[str, Any]:
field_dict["encoding_format"] = encoding_format
if user is not UNSET:
field_dict["user"] = user
if dimensions is not UNSET:
field_dict["dimensions"] = dimensions
if modality is not UNSET:
field_dict["modality"] = modality

Expand Down Expand Up @@ -118,6 +124,8 @@ def _parse_user(data: object) -> Union[None, Unset, str]:

user = _parse_user(d.pop("user", UNSET))

dimensions = d.pop("dimensions", UNSET)

_modality = d.pop("modality", UNSET)
modality: Union[Unset, OpenAIEmbeddingInputImageModality]
if isinstance(_modality, Unset):
Expand All @@ -130,6 +138,7 @@ def _parse_user(data: object) -> Union[None, Unset, str]:
model=model,
encoding_format=encoding_format,
user=user,
dimensions=dimensions,
modality=modality,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@ class OpenAIEmbeddingInputText:
model (Union[Unset, str]): Default: 'default/not-specified'.
encoding_format (Union[Unset, EmbeddingEncodingFormat]):
user (Union[None, Unset, str]):
dimensions (Union[Unset, int]): Default: 0.
modality (Union[Unset, OpenAIEmbeddingInputTextModality]): Default: OpenAIEmbeddingInputTextModality.TEXT.
"""

input_: Union[List[str], str]
model: Union[Unset, str] = "default/not-specified"
encoding_format: Union[Unset, EmbeddingEncodingFormat] = UNSET
user: Union[None, Unset, str] = UNSET
dimensions: Union[Unset, int] = 0
modality: Union[Unset, OpenAIEmbeddingInputTextModality] = OpenAIEmbeddingInputTextModality.TEXT
additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)

Expand All @@ -49,6 +51,8 @@ def to_dict(self) -> Dict[str, Any]:
else:
user = self.user

dimensions = self.dimensions

modality: Union[Unset, str] = UNSET
if not isinstance(self.modality, Unset):
modality = self.modality.value
Expand All @@ -66,6 +70,8 @@ def to_dict(self) -> Dict[str, Any]:
field_dict["encoding_format"] = encoding_format
if user is not UNSET:
field_dict["user"] = user
if dimensions is not UNSET:
field_dict["dimensions"] = dimensions
if modality is not UNSET:
field_dict["modality"] = modality

Expand Down Expand Up @@ -106,6 +112,8 @@ def _parse_user(data: object) -> Union[None, Unset, str]:

user = _parse_user(d.pop("user", UNSET))

dimensions = d.pop("dimensions", UNSET)

_modality = d.pop("modality", UNSET)
modality: Union[Unset, OpenAIEmbeddingInputTextModality]
if isinstance(_modality, Unset):
Expand All @@ -118,6 +126,7 @@ def _parse_user(data: object) -> Union[None, Unset, str]:
model=model,
encoding_format=encoding_format,
user=user,
dimensions=dimensions,
modality=modality,
)

Expand Down
2 changes: 1 addition & 1 deletion libs/client_infinity/infinity_client/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "infinity_client"
version = "0.0.71"
version = "0.0.73"
description = "A client library for accessing ♾️ Infinity - Embedding Inference Server"
authors = []
readme = "README.md"
Expand Down
46 changes: 34 additions & 12 deletions libs/infinity_emb/infinity_emb/engine.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# SPDX-License-Identifier: MIT
# Copyright (c) 2023-now michaelfeilfeil
from __future__ import annotations

from asyncio import Semaphore
from typing import Iterable, Iterator, Optional, Union
Expand Down Expand Up @@ -130,11 +131,14 @@ def capabilities(self) -> set[ModelCapabilites]:
def engine_args(self) -> EngineArgs:
return self._engine_args

async def embed(self, sentences: list[str]) -> tuple[list["EmbeddingReturnType"], int]:
async def embed(
self, sentences: list[str], matryoshka_dim: int | None = None
) -> tuple[list["EmbeddingReturnType"], int]:
"""embed multiple sentences
Kwargs:
sentences (list[str]): sentences to be embedded
matryoshka_dim (int): Length of matryoshka embedding
Raises:
ValueError: raised if engine is not started yet
Expand All @@ -148,7 +152,9 @@ async def embed(self, sentences: list[str]) -> tuple[list["EmbeddingReturnType"]
"""

self._assert_running()
embeddings, usage = await self._batch_handler.embed(sentences=sentences)
embeddings, usage = await self._batch_handler.embed(
sentences=sentences, matryoshka_dim=matryoshka_dim
)
return embeddings, usage

async def rerank(
Expand Down Expand Up @@ -213,12 +219,16 @@ async def classify(
return scores, usage

async def image_embed(
self, *, images: list[Union[str, "ImageClassType", bytes]]
self,
*,
images: list[Union[str, "ImageClassType", bytes]],
matryoshka_dim: int | None = None,
) -> tuple[list["EmbeddingReturnType"], int]:
"""embed multiple images
Kwargs:
images (list[Union[str, ImageClassType]]): list of image urls or ImageClassType objects, to be embedded
matryoshka_dim (int): Length of matryoshka embedding
Raises:
ValueError: raised if engine is not started yet
Expand All @@ -232,16 +242,19 @@ async def image_embed(
"""

self._assert_running()
embeddings, usage = await self._batch_handler.image_embed(images=images)
embeddings, usage = await self._batch_handler.image_embed(
images=images, matryoshka_dim=matryoshka_dim
)
return embeddings, usage

async def audio_embed(
self, *, audios: list[Union[str, bytes]]
self, *, audios: list[Union[str, bytes]], matryoshka_dim: int | None = None
) -> tuple[list["EmbeddingReturnType"], int]:
"""embed multiple audios
Kwargs:
audios (list[Union[str, Audiobytes]]): list of audio data, to be embedded
matryoshka_dim (int): Length of matryoshka embedding
Raises:
ValueError: raised if engine is not started yet
Expand All @@ -255,7 +268,9 @@ async def audio_embed(
"""

self._assert_running()
embeddings, usage = await self._batch_handler.audio_embed(audios=audios)
embeddings, usage = await self._batch_handler.audio_embed(
audios=audios, matryoshka_dim=matryoshka_dim
)
return embeddings, usage

def _assert_running(self):
Expand Down Expand Up @@ -304,13 +319,14 @@ async def astop(self):
await engine.astop()

async def embed(
self, *, model: str, sentences: list[str]
self, *, model: str, sentences: list[str], matryoshka_dim: Optional[int] = None
) -> tuple[list["EmbeddingReturnType"], int]:
"""embed multiple sentences
Kwargs:
model (str): model name to be used
sentences (list[str]): sentences to be embedded
matryoshka_dim (int): Length of matryoshka embedding
Raises:
ValueError: raised if engine is not started yet
Expand All @@ -322,7 +338,7 @@ async def embed(
2D list-array of shape( len(sentences),embed_dim )
int: token usage
"""
return await self[model].embed(sentences)
return await self[model].embed(sentences, matryoshka_dim=matryoshka_dim)

def is_running(self) -> bool:
return all(engine.is_running for engine in self.engines_dict.values())
Expand Down Expand Up @@ -378,13 +394,18 @@ async def classify(
return await self[model].classify(sentences=sentences, raw_scores=raw_scores)

async def image_embed(
self, *, model: str, images: list[Union[str, "ImageClassType"]]
self,
*,
model: str,
images: list[Union[str, "ImageClassType"]],
matryoshka_dim: Optional[int] = None,
) -> tuple[list["EmbeddingReturnType"], int]:
"""embed multiple images
Kwargs:
model (str): model name to be used
images (list[Union[str, ImageClassType]]): list of image urls or ImageClassType objects, to be embedded
matryoshka_dim (int): Length of matryoshka embedding
Raises:
ValueError: raised if engine is not started yet
Expand All @@ -396,7 +417,7 @@ async def image_embed(
2D list-array of shape( len(sentences),embed_dim )
int: token usage
"""
return await self[model].image_embed(images=images)
return await self[model].image_embed(images=images, matryoshka_dim=matryoshka_dim)

def __getitem__(self, index_or_name: Union[str, int]) -> "AsyncEmbeddingEngine":
"""resolve engine by model name -> Auto resolve if only one engine is present
Expand All @@ -416,13 +437,14 @@ def __getitem__(self, index_or_name: Union[str, int]) -> "AsyncEmbeddingEngine":
)

async def audio_embed(
self, *, model: str, audios: list[Union[str, bytes]]
self, *, model: str, audios: list[Union[str, bytes]], matryoshka_dim: Optional[int] = None
) -> tuple[list["EmbeddingReturnType"], int]:
"""embed multiple audios
Kwargs:
model (str): model name to be used
audios (list[Union[str, bytes]]): list of audio data, to be embedded
matryoshka_dim (int): Length of matryoshka embedding
Raises:
ValueError: raised if engine is not started yet
Expand All @@ -434,4 +456,4 @@ async def audio_embed(
2D list-array of shape( len(sentences),embed_dim )
int: token usage
"""
return await self[model].audio_embed(audios=audios)
return await self[model].audio_embed(audios=audios, matryoshka_dim=matryoshka_dim)
10 changes: 9 additions & 1 deletion libs/infinity_emb/infinity_emb/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,15 @@ def cache_dir(self) -> Path:

@cached_property
def queue_size(self) -> int:
return int(self._optional_infinity_var("queue_size", default="32000"))
size = int(self._optional_infinity_var("queue_size", default="32000"))
assert size > 0, "INFINITY_QUEUE_SIZE must be a positive number"
return size

@cached_property
def max_client_batch_size(self) -> int:
size = int(self._optional_infinity_var("max_client_batch_size", default="2048"))
assert size > 0, "INFINITY_MAX_CLIENT_BATCH_SIZE must be a positive number"
return size

@cached_property
def permissive_cors(self):
Expand Down
4 changes: 3 additions & 1 deletion libs/infinity_emb/infinity_emb/fastapi_schemas/docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ def startup_message(host: str, port: int, prefix: str) -> str:
return f"""
♾️ Infinity - Embedding Inference Server
MIT License; Copyright (c) 2023-now Michael Feil
MIT License; Copyright (c) 2023-now
Infinity OSS-Project: github.com/michaelfeil.infinity
Maintained by @michaelfeil @wirthual
Version {__version__}
Open the Docs via Swagger UI:
Expand Down
5 changes: 3 additions & 2 deletions libs/infinity_emb/infinity_emb/fastapi_schemas/pydantic_v2.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from pydantic import AnyUrl, HttpUrl, StringConstraints
from infinity_emb.env import MANAGER

__all__ = [
"INPUT_STRING",
Expand All @@ -14,9 +15,9 @@
INPUT_STRING = StringConstraints(max_length=8192 * 15, strip_whitespace=True)
ITEMS_LIMIT = {
"min_length": 1,
"max_length": 2048,
"max_length": MANAGER.max_client_batch_size,
}
ITEMS_LIMIT_SMALL = {
"min_length": 1,
"max_length": 32,
"max_length": min(32, MANAGER.max_client_batch_size),
}
1 change: 1 addition & 0 deletions libs/infinity_emb/infinity_emb/fastapi_schemas/pymodels.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ class _OpenAIEmbeddingInput(BaseModel):
model: str = "default/not-specified"
encoding_format: EmbeddingEncodingFormat = EmbeddingEncodingFormat.float
user: Optional[str] = None
dimensions: int = 0


class _OpenAIEmbeddingInput_Text(_OpenAIEmbeddingInput):
Expand Down
Loading

0 comments on commit e336f8f

Please sign in to comment.