Skip to content

Commit 1e71c78

Browse files
authored
Merge pull request #1827 from weaviate/gen_openai_params
Add reasoning and verbosity to generative openai
2 parents 033542f + 9a4bedf commit 1e71c78

File tree

10 files changed

+391
-228
lines changed

10 files changed

+391
-228
lines changed

test/collection/test_classes_generative.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ def test_generative_parameters_images_parsing(
322322
stop=["\n"],
323323
temperature=0.5,
324324
top_p=50,
325+
reasoning_effort="high",
326+
verbosity="low",
325327
)._to_grpc(
326328
_GenerativeConfigRuntimeOptions(
327329
return_metadata=True, images=[LOGO_ENCODED], image_properties=["image"]
@@ -344,6 +346,8 @@ def test_generative_parameters_images_parsing(
344346
images=base_pb2.TextArray(values=[LOGO_ENCODED]),
345347
image_properties=base_pb2.TextArray(values=["image"]),
346348
is_azure=False,
349+
reasoning_effort=generative_pb2.GenerativeOpenAI.ReasoningEffort.REASONING_EFFORT_HIGH,
350+
verbosity=generative_pb2.GenerativeOpenAI.Verbosity.VERBOSITY_LOW,
347351
),
348352
),
349353
),

test/collection/test_config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,8 @@ def test_config_with_vectorizer_and_properties(
838838
temperature=0.5,
839839
top_p=0.5,
840840
base_url="https://api.openai.com",
841+
reasoning_effort="high",
842+
verbosity="verbose",
841843
),
842844
{
843845
"generative-openai": {
@@ -848,6 +850,8 @@ def test_config_with_vectorizer_and_properties(
848850
"temperatureProperty": 0.5,
849851
"topPProperty": 0.5,
850852
"baseURL": "https://api.openai.com/",
853+
"reasoningEffort": "high",
854+
"verbosity": "verbose",
851855
}
852856
},
853857
),

weaviate/collections/classes/config.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,19 @@
8282
"sagemaker",
8383
]
8484

85+
OpenAiVerbosity: TypeAlias = Literal[
86+
"low",
87+
"medium",
88+
"high",
89+
]
90+
91+
OpenAiReasoningEffort: TypeAlias = Literal[
92+
"minimal",
93+
"low",
94+
"medium",
95+
"high",
96+
]
97+
8598

8699
class ConsistencyLevel(str, BaseEnum):
87100
"""The consistency levels when writing to Weaviate with replication enabled.
@@ -416,6 +429,8 @@ def _to_dict(self) -> Dict[str, Any]:
416429

417430
class _GenerativeOpenAIConfig(_GenerativeOpenAIConfigBase):
418431
model: Optional[str]
432+
verbosity: Optional[str]
433+
reasoningEffort: Optional[str]
419434

420435

421436
class _GenerativeAzureOpenAIConfig(_GenerativeOpenAIConfigBase):
@@ -711,6 +726,9 @@ def openai(
711726
temperature: Optional[float] = None,
712727
top_p: Optional[float] = None,
713728
base_url: Optional[AnyHttpUrl] = None,
729+
*,
730+
verbosity: Optional[Union[OpenAiVerbosity, str]] = None,
731+
reasoning_effort: Optional[Union[OpenAiReasoningEffort, str]] = None,
714732
) -> _GenerativeProvider:
715733
"""Create a `_GenerativeOpenAIConfig` object for use when performing AI generation using the `generative-openai` module.
716734
@@ -725,6 +743,8 @@ def openai(
725743
temperature: The temperature to use. Defaults to `None`, which uses the server-defined default
726744
top_p: The top P to use. Defaults to `None`, which uses the server-defined default
727745
base_url: The base URL where the API request should go. Defaults to `None`, which uses the server-defined default
746+
verbosity: The verbosity level to use. One of 'low', 'medium', 'high'. Defaults to `None`, which uses the server-defined default
747+
reasoning_effort: The reasoning effort level to use. One of 'minimal', 'low
728748
"""
729749
return _GenerativeOpenAIConfig(
730750
baseURL=base_url,
@@ -734,6 +754,8 @@ def openai(
734754
presencePenaltyProperty=presence_penalty,
735755
temperatureProperty=temperature,
736756
topPProperty=top_p,
757+
verbosity=verbosity,
758+
reasoningEffort=reasoning_effort,
737759
)
738760

739761
@staticmethod

weaviate/collections/classes/generative.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from weaviate.collections.classes.config import (
1010
AWSService,
1111
GenerativeSearches,
12+
OpenAiReasoningEffort,
13+
OpenAiVerbosity,
1214
_EnumLikeStr,
1315
)
1416
from weaviate.exceptions import WeaviateInvalidInputError
@@ -319,6 +321,8 @@ class _GenerativeOpenAI(_GenerativeConfigRuntime):
319321
stop: Optional[List[str]]
320322
temperature: Optional[float]
321323
top_p: Optional[float]
324+
verbosity: Optional[Union[OpenAiVerbosity, str]]
325+
reasoning_effort: Optional[Union[OpenAiReasoningEffort, str]]
322326

323327
def _to_grpc(self, opts: _GenerativeConfigRuntimeOptions) -> generative_pb2.GenerativeProvider:
324328
return generative_pb2.GenerativeProvider(
@@ -338,9 +342,37 @@ def _to_grpc(self, opts: _GenerativeConfigRuntimeOptions) -> generative_pb2.Gene
338342
is_azure=self.is_azure,
339343
images=_to_text_array(opts.images),
340344
image_properties=_to_text_array(opts.image_properties),
345+
verbosity=self.__verbosity(),
346+
reasoning_effort=self.__reasoning_effort(),
341347
),
342348
)
343349

350+
def __verbosity(self):
351+
if self.verbosity is None:
352+
return None
353+
354+
if self.verbosity == "low":
355+
return generative_pb2.GenerativeOpenAI.Verbosity.VERBOSITY_LOW
356+
if self.verbosity == "medium":
357+
return generative_pb2.GenerativeOpenAI.Verbosity.VERBOSITY_MEDIUM
358+
if self.verbosity == "high":
359+
return generative_pb2.GenerativeOpenAI.Verbosity.VERBOSITY_HIGH
360+
raise WeaviateInvalidInputError(f"Invalid verbosity value: {self.verbosity}")
361+
362+
def __reasoning_effort(self):
363+
if self.reasoning_effort is None:
364+
return None
365+
366+
if self.reasoning_effort == "minimal":
367+
return generative_pb2.GenerativeOpenAI.ReasoningEffort.REASONING_EFFORT_MINIMAL
368+
if self.reasoning_effort == "low":
369+
return generative_pb2.GenerativeOpenAI.ReasoningEffort.REASONING_EFFORT_LOW
370+
if self.reasoning_effort == "medium":
371+
return generative_pb2.GenerativeOpenAI.ReasoningEffort.REASONING_EFFORT_MEDIUM
372+
if self.reasoning_effort == "high":
373+
return generative_pb2.GenerativeOpenAI.ReasoningEffort.REASONING_EFFORT_HIGH
374+
raise WeaviateInvalidInputError(f"Invalid reasoning_effort value: {self.reasoning_effort}")
375+
344376

345377
class _GenerativeGoogle(_GenerativeConfigRuntime):
346378
generative: Union[GenerativeSearches, _EnumLikeStr] = Field(
@@ -763,10 +795,12 @@ def openai(
763795
max_tokens: Optional[int] = None,
764796
model: Optional[str] = None,
765797
presence_penalty: Optional[float] = None,
798+
reasoning_effort: Optional[Union[OpenAiReasoningEffort, str]] = None,
766799
resource_name: Optional[str] = None,
767800
stop: Optional[List[str]] = None,
768801
temperature: Optional[float] = None,
769802
top_p: Optional[float] = None,
803+
verbosity: Optional[Union[OpenAiVerbosity, str]] = None,
770804
) -> _GenerativeConfigRuntime:
771805
"""Create a `_GenerativeOpenAI` object for use when performing AI generation using the OpenAI-backed `generative-openai` module.
772806
@@ -781,10 +815,12 @@ def openai(
781815
max_tokens: The maximum number of tokens to generate. Defaults to `None`, which uses the server-defined default
782816
model: The model to use. Defaults to `None`, which uses the server-defined default
783817
presence_penalty: The presence penalty to use. Defaults to `None`, which uses the server-defined default
818+
reasoning_effort: The reasoning effort to use. Defaults to `None`, which uses the server-defined default
784819
resource_name: The name of the OpenAI resource to use. Defaults to `None`, which uses the server-defined default
785820
stop: The stop sequences to use. Defaults to `None`, which uses the server-defined default
786821
temperature: The temperature to use. Defaults to `None`, which uses the server-defined default
787822
top_p: The top P to use. Defaults to `None`, which uses the server-defined default
823+
verbosity: The verbosity to use. Defaults to `None`, which uses the server-defined default
788824
"""
789825
return _GenerativeOpenAI(
790826
api_version=api_version,
@@ -799,6 +835,8 @@ def openai(
799835
temperature=temperature,
800836
top_p=top_p,
801837
is_azure=False,
838+
verbosity=verbosity,
839+
reasoning_effort=reasoning_effort,
802840
)
803841

804842
@staticmethod
@@ -847,6 +885,8 @@ def azure_openai(
847885
temperature=temperature,
848886
top_p=top_p,
849887
is_azure=True,
888+
verbosity=None,
889+
reasoning_effort=None,
850890
)
851891

852892
@staticmethod

weaviate/proto/v1/v4216/v1/generative_pb2.py

Lines changed: 78 additions & 74 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

weaviate/proto/v1/v4216/v1/generative_pb2.pyi

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from weaviate.proto.v1.v4216.v1 import base_pb2 as _base_pb2
22
from google.protobuf.internal import containers as _containers
3+
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
34
from google.protobuf import descriptor as _descriptor
45
from google.protobuf import message as _message
56
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
@@ -183,7 +184,29 @@ class GenerativeOllama(_message.Message):
183184
def __init__(self, api_endpoint: _Optional[str] = ..., model: _Optional[str] = ..., temperature: _Optional[float] = ..., images: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., image_properties: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ...) -> None: ...
184185

185186
class GenerativeOpenAI(_message.Message):
186-
__slots__ = ["frequency_penalty", "max_tokens", "model", "n", "presence_penalty", "stop", "temperature", "top_p", "base_url", "api_version", "resource_name", "deployment_id", "is_azure", "images", "image_properties"]
187+
__slots__ = ["frequency_penalty", "max_tokens", "model", "n", "presence_penalty", "stop", "temperature", "top_p", "base_url", "api_version", "resource_name", "deployment_id", "is_azure", "images", "image_properties", "reasoning_effort", "verbosity"]
188+
class ReasoningEffort(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
189+
__slots__ = []
190+
REASONING_EFFORT_UNSPECIFIED: _ClassVar[GenerativeOpenAI.ReasoningEffort]
191+
REASONING_EFFORT_MINIMAL: _ClassVar[GenerativeOpenAI.ReasoningEffort]
192+
REASONING_EFFORT_LOW: _ClassVar[GenerativeOpenAI.ReasoningEffort]
193+
REASONING_EFFORT_MEDIUM: _ClassVar[GenerativeOpenAI.ReasoningEffort]
194+
REASONING_EFFORT_HIGH: _ClassVar[GenerativeOpenAI.ReasoningEffort]
195+
REASONING_EFFORT_UNSPECIFIED: GenerativeOpenAI.ReasoningEffort
196+
REASONING_EFFORT_MINIMAL: GenerativeOpenAI.ReasoningEffort
197+
REASONING_EFFORT_LOW: GenerativeOpenAI.ReasoningEffort
198+
REASONING_EFFORT_MEDIUM: GenerativeOpenAI.ReasoningEffort
199+
REASONING_EFFORT_HIGH: GenerativeOpenAI.ReasoningEffort
200+
class Verbosity(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
201+
__slots__ = []
202+
VERBOSITY_UNSPECIFIED: _ClassVar[GenerativeOpenAI.Verbosity]
203+
VERBOSITY_LOW: _ClassVar[GenerativeOpenAI.Verbosity]
204+
VERBOSITY_MEDIUM: _ClassVar[GenerativeOpenAI.Verbosity]
205+
VERBOSITY_HIGH: _ClassVar[GenerativeOpenAI.Verbosity]
206+
VERBOSITY_UNSPECIFIED: GenerativeOpenAI.Verbosity
207+
VERBOSITY_LOW: GenerativeOpenAI.Verbosity
208+
VERBOSITY_MEDIUM: GenerativeOpenAI.Verbosity
209+
VERBOSITY_HIGH: GenerativeOpenAI.Verbosity
187210
FREQUENCY_PENALTY_FIELD_NUMBER: _ClassVar[int]
188211
MAX_TOKENS_FIELD_NUMBER: _ClassVar[int]
189212
MODEL_FIELD_NUMBER: _ClassVar[int]
@@ -199,6 +222,8 @@ class GenerativeOpenAI(_message.Message):
199222
IS_AZURE_FIELD_NUMBER: _ClassVar[int]
200223
IMAGES_FIELD_NUMBER: _ClassVar[int]
201224
IMAGE_PROPERTIES_FIELD_NUMBER: _ClassVar[int]
225+
REASONING_EFFORT_FIELD_NUMBER: _ClassVar[int]
226+
VERBOSITY_FIELD_NUMBER: _ClassVar[int]
202227
frequency_penalty: float
203228
max_tokens: int
204229
model: str
@@ -214,7 +239,9 @@ class GenerativeOpenAI(_message.Message):
214239
is_azure: bool
215240
images: _base_pb2.TextArray
216241
image_properties: _base_pb2.TextArray
217-
def __init__(self, frequency_penalty: _Optional[float] = ..., max_tokens: _Optional[int] = ..., model: _Optional[str] = ..., n: _Optional[int] = ..., presence_penalty: _Optional[float] = ..., stop: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., temperature: _Optional[float] = ..., top_p: _Optional[float] = ..., base_url: _Optional[str] = ..., api_version: _Optional[str] = ..., resource_name: _Optional[str] = ..., deployment_id: _Optional[str] = ..., is_azure: bool = ..., images: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., image_properties: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ...) -> None: ...
242+
reasoning_effort: GenerativeOpenAI.ReasoningEffort
243+
verbosity: GenerativeOpenAI.Verbosity
244+
def __init__(self, frequency_penalty: _Optional[float] = ..., max_tokens: _Optional[int] = ..., model: _Optional[str] = ..., n: _Optional[int] = ..., presence_penalty: _Optional[float] = ..., stop: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., temperature: _Optional[float] = ..., top_p: _Optional[float] = ..., base_url: _Optional[str] = ..., api_version: _Optional[str] = ..., resource_name: _Optional[str] = ..., deployment_id: _Optional[str] = ..., is_azure: bool = ..., images: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., image_properties: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., reasoning_effort: _Optional[_Union[GenerativeOpenAI.ReasoningEffort, str]] = ..., verbosity: _Optional[_Union[GenerativeOpenAI.Verbosity, str]] = ...) -> None: ...
218245

219246
class GenerativeGoogle(_message.Message):
220247
__slots__ = ["frequency_penalty", "max_tokens", "model", "presence_penalty", "temperature", "top_k", "top_p", "stop_sequences", "api_endpoint", "project_id", "endpoint_id", "region", "images", "image_properties"]

weaviate/proto/v1/v5261/v1/generative_pb2.py

Lines changed: 78 additions & 74 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

weaviate/proto/v1/v5261/v1/generative_pb2.pyi

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from weaviate.proto.v1.v5261.v1 import base_pb2 as _base_pb2
22
from google.protobuf.internal import containers as _containers
3+
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
34
from google.protobuf import descriptor as _descriptor
45
from google.protobuf import message as _message
56
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
@@ -183,7 +184,29 @@ class GenerativeOllama(_message.Message):
183184
def __init__(self, api_endpoint: _Optional[str] = ..., model: _Optional[str] = ..., temperature: _Optional[float] = ..., images: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., image_properties: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ...) -> None: ...
184185

185186
class GenerativeOpenAI(_message.Message):
186-
__slots__ = ("frequency_penalty", "max_tokens", "model", "n", "presence_penalty", "stop", "temperature", "top_p", "base_url", "api_version", "resource_name", "deployment_id", "is_azure", "images", "image_properties")
187+
__slots__ = ("frequency_penalty", "max_tokens", "model", "n", "presence_penalty", "stop", "temperature", "top_p", "base_url", "api_version", "resource_name", "deployment_id", "is_azure", "images", "image_properties", "reasoning_effort", "verbosity")
188+
class ReasoningEffort(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
189+
__slots__ = ()
190+
REASONING_EFFORT_UNSPECIFIED: _ClassVar[GenerativeOpenAI.ReasoningEffort]
191+
REASONING_EFFORT_MINIMAL: _ClassVar[GenerativeOpenAI.ReasoningEffort]
192+
REASONING_EFFORT_LOW: _ClassVar[GenerativeOpenAI.ReasoningEffort]
193+
REASONING_EFFORT_MEDIUM: _ClassVar[GenerativeOpenAI.ReasoningEffort]
194+
REASONING_EFFORT_HIGH: _ClassVar[GenerativeOpenAI.ReasoningEffort]
195+
REASONING_EFFORT_UNSPECIFIED: GenerativeOpenAI.ReasoningEffort
196+
REASONING_EFFORT_MINIMAL: GenerativeOpenAI.ReasoningEffort
197+
REASONING_EFFORT_LOW: GenerativeOpenAI.ReasoningEffort
198+
REASONING_EFFORT_MEDIUM: GenerativeOpenAI.ReasoningEffort
199+
REASONING_EFFORT_HIGH: GenerativeOpenAI.ReasoningEffort
200+
class Verbosity(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
201+
__slots__ = ()
202+
VERBOSITY_UNSPECIFIED: _ClassVar[GenerativeOpenAI.Verbosity]
203+
VERBOSITY_LOW: _ClassVar[GenerativeOpenAI.Verbosity]
204+
VERBOSITY_MEDIUM: _ClassVar[GenerativeOpenAI.Verbosity]
205+
VERBOSITY_HIGH: _ClassVar[GenerativeOpenAI.Verbosity]
206+
VERBOSITY_UNSPECIFIED: GenerativeOpenAI.Verbosity
207+
VERBOSITY_LOW: GenerativeOpenAI.Verbosity
208+
VERBOSITY_MEDIUM: GenerativeOpenAI.Verbosity
209+
VERBOSITY_HIGH: GenerativeOpenAI.Verbosity
187210
FREQUENCY_PENALTY_FIELD_NUMBER: _ClassVar[int]
188211
MAX_TOKENS_FIELD_NUMBER: _ClassVar[int]
189212
MODEL_FIELD_NUMBER: _ClassVar[int]
@@ -199,6 +222,8 @@ class GenerativeOpenAI(_message.Message):
199222
IS_AZURE_FIELD_NUMBER: _ClassVar[int]
200223
IMAGES_FIELD_NUMBER: _ClassVar[int]
201224
IMAGE_PROPERTIES_FIELD_NUMBER: _ClassVar[int]
225+
REASONING_EFFORT_FIELD_NUMBER: _ClassVar[int]
226+
VERBOSITY_FIELD_NUMBER: _ClassVar[int]
202227
frequency_penalty: float
203228
max_tokens: int
204229
model: str
@@ -214,7 +239,9 @@ class GenerativeOpenAI(_message.Message):
214239
is_azure: bool
215240
images: _base_pb2.TextArray
216241
image_properties: _base_pb2.TextArray
217-
def __init__(self, frequency_penalty: _Optional[float] = ..., max_tokens: _Optional[int] = ..., model: _Optional[str] = ..., n: _Optional[int] = ..., presence_penalty: _Optional[float] = ..., stop: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., temperature: _Optional[float] = ..., top_p: _Optional[float] = ..., base_url: _Optional[str] = ..., api_version: _Optional[str] = ..., resource_name: _Optional[str] = ..., deployment_id: _Optional[str] = ..., is_azure: bool = ..., images: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., image_properties: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ...) -> None: ...
242+
reasoning_effort: GenerativeOpenAI.ReasoningEffort
243+
verbosity: GenerativeOpenAI.Verbosity
244+
def __init__(self, frequency_penalty: _Optional[float] = ..., max_tokens: _Optional[int] = ..., model: _Optional[str] = ..., n: _Optional[int] = ..., presence_penalty: _Optional[float] = ..., stop: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., temperature: _Optional[float] = ..., top_p: _Optional[float] = ..., base_url: _Optional[str] = ..., api_version: _Optional[str] = ..., resource_name: _Optional[str] = ..., deployment_id: _Optional[str] = ..., is_azure: bool = ..., images: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., image_properties: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ..., reasoning_effort: _Optional[_Union[GenerativeOpenAI.ReasoningEffort, str]] = ..., verbosity: _Optional[_Union[GenerativeOpenAI.Verbosity, str]] = ...) -> None: ...
218245

219246
class GenerativeGoogle(_message.Message):
220247
__slots__ = ("frequency_penalty", "max_tokens", "model", "presence_penalty", "temperature", "top_k", "top_p", "stop_sequences", "api_endpoint", "project_id", "endpoint_id", "region", "images", "image_properties")

weaviate/proto/v1/v6300/v1/generative_pb2.py

Lines changed: 78 additions & 74 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)