Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions test/collection/test_classes_generative.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,31 @@ def test_generative_parameters_images_parsing(
),
),
),
(
GenerativeConfig.deepseek(
base_url="http://localhost:8080",
model="deepseek-chat",
temperature=0.5,
max_tokens=100,
frequency_penalty=0.1,
presence_penalty=0.2,
top_p=0.9,
stop=["\n"],
)._to_grpc(_GenerativeConfigRuntimeOptions(return_metadata=True)),
generative_pb2.GenerativeProvider(
return_metadata=True,
deepseek=generative_pb2.GenerativeDeepseek(
base_url="http://localhost:8080",
model="deepseek-chat",
temperature=0.5,
max_tokens=100,
frequency_penalty=0.1,
presence_penalty=0.2,
top_p=0.9,
stop=base_pb2.TextArray(values=["\n"]),
),
),
),
(
GenerativeConfig.dummy()._to_grpc(
_GenerativeConfigRuntimeOptions(return_metadata=True)
Expand Down
24 changes: 24 additions & 0 deletions test/collection/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -1104,6 +1104,30 @@ def test_config_with_vectorizer_and_properties(
}
},
),
(
Configure.Generative.deepseek(
model="deepseek-chat",
max_tokens=100,
temperature=0.5,
frequency_penalty=0.1,
presence_penalty=0.2,
top_p=0.9,
base_url="https://api.deepseek.com",
stop=["\n"],
),
{
"generative-deepseek": {
"model": "deepseek-chat",
"maxTokens": 100,
"temperature": 0.5,
"frequencyPenalty": 0.1,
"presencePenalty": 0.2,
"topP": 0.9,
"baseURL": "https://api.deepseek.com",
"stop": ["\n"],
}
},
),
(
Configure.Generative.xai(
model="grok-2-latest",
Expand Down
51 changes: 51 additions & 0 deletions weaviate/collections/classes/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ class GenerativeSearches(str, BaseEnum):
COHERE: Weaviate module backed by Cohere generative models.
CONTEXTUALAI: Weaviate module backed by ContextualAI generative models.
DATABRICKS: Weaviate module backed by Databricks generative models.
DEEPSEEK: Weaviate module backed by DeepSeek generative models.
FRIENDLIAI: Weaviate module backed by FriendliAI generative models.
MISTRAL: Weaviate module backed by Mistral generative models.
NVIDIA: Weaviate module backed by NVIDIA generative models.
Expand All @@ -228,6 +229,7 @@ class GenerativeSearches(str, BaseEnum):
COHERE = "generative-cohere"
CONTEXTUALAI = "generative-contextualai"
DATABRICKS = "generative-databricks"
DEEPSEEK = "generative-deepseek"
DUMMY = "generative-dummy"
FRIENDLIAI = "generative-friendliai"
MISTRAL = "generative-mistral"
Expand Down Expand Up @@ -443,6 +445,20 @@ class _GenerativeDatabricks(_GenerativeProvider):
topP: Optional[float]


class _GenerativeDeepseek(_GenerativeProvider):
generative: Union[GenerativeSearches, _EnumLikeStr] = Field(
default=GenerativeSearches.DEEPSEEK, frozen=True, exclude=True
)
model: Optional[str]
temperature: Optional[float]
maxTokens: Optional[int]
frequencyPenalty: Optional[float]
presencePenalty: Optional[float]
topP: Optional[float]
baseURL: Optional[str]
stop: Optional[List[str]]


class _GenerativeMistral(_GenerativeProvider):
generative: Union[GenerativeSearches, _EnumLikeStr] = Field(
default=GenerativeSearches.MISTRAL, frozen=True, exclude=True
Expand Down Expand Up @@ -753,6 +769,41 @@ def databricks(
topP=top_p,
)

@staticmethod
def deepseek(
*,
base_url: Optional[str] = None,
model: Optional[str] = None,
temperature: Optional[float] = None,
max_tokens: Optional[int] = None,
frequency_penalty: Optional[float] = None,
presence_penalty: Optional[float] = None,
top_p: Optional[float] = None,
stop: Optional[List[str]] = None,
) -> _GenerativeProvider:
"""Create a `_GenerativeDeepseek` object for use when performing AI generation using the `generative-deepseek` module.

Args:
base_url: The base URL where the API request should go. Defaults to `None`, which uses the server-defined default
model: The model to use. Defaults to `None`, which uses the server-defined default
temperature: The temperature to use. Defaults to `None`, which uses the server-defined default
max_tokens: The maximum number of tokens to generate. Defaults to `None`, which uses the server-defined default
frequency_penalty: The frequency penalty to use. Defaults to `None`, which uses the server-defined default
presence_penalty: The presence penalty to use. Defaults to `None`, which uses the server-defined default
top_p: The top P value to use. Defaults to `None`, which uses the server-defined default
stop: The stop sequences to use. Defaults to `None`, which uses the server-defined default
"""
return _GenerativeDeepseek(
model=model,
temperature=temperature,
maxTokens=max_tokens,
frequencyPenalty=frequency_penalty,
presencePenalty=presence_penalty,
topP=top_p,
baseURL=base_url,
stop=stop,
)

@staticmethod
def friendliai(
*,
Expand Down
67 changes: 67 additions & 0 deletions weaviate/collections/classes/generative.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,36 @@ def _to_grpc(self, opts: _GenerativeConfigRuntimeOptions) -> generative_pb2.Gene
)


class _GenerativeDeepseek(_GenerativeConfigRuntime):
generative: Union[GenerativeSearches, _EnumLikeStr] = Field(
default=GenerativeSearches.DEEPSEEK, frozen=True, exclude=True
)
base_url: Optional[AnyHttpUrl]
model: Optional[str]
temperature: Optional[float]
max_tokens: Optional[int]
frequency_penalty: Optional[float]
presence_penalty: Optional[float]
top_p: Optional[float]
stop: Optional[List[str]]

def _to_grpc(self, opts: _GenerativeConfigRuntimeOptions) -> generative_pb2.GenerativeProvider:
self._validate_multi_modal(opts)
return generative_pb2.GenerativeProvider(
return_metadata=opts.return_metadata,
deepseek=generative_pb2.GenerativeDeepseek(
base_url=_parse_anyhttpurl(self.base_url),
model=self.model,
temperature=self.temperature,
max_tokens=self.max_tokens,
frequency_penalty=self.frequency_penalty,
presence_penalty=self.presence_penalty,
top_p=self.top_p,
stop=_to_text_array(self.stop),
),
)


class _GenerativeDummy(_GenerativeConfigRuntime):
generative: Union[GenerativeSearches, _EnumLikeStr] = Field(
default=GenerativeSearches.DUMMY, frozen=True, exclude=True
Expand Down Expand Up @@ -793,6 +823,43 @@ def databricks(
top_p=top_p,
)

@staticmethod
def deepseek(
*,
base_url: Optional[str] = None,
model: Optional[str] = None,
temperature: Optional[float] = None,
max_tokens: Optional[int] = None,
frequency_penalty: Optional[float] = None,
presence_penalty: Optional[float] = None,
top_p: Optional[float] = None,
stop: Optional[List[str]] = None,
) -> _GenerativeConfigRuntime:
"""Create a `_GenerativeDeepseek` object for use when performing AI generation using the `generative-deepseek` module.

Args:
base_url: The base URL where the API request should go. Defaults to `None`, which uses the server-defined default
model: The model to use. Defaults to `None`, which uses the server-defined default
temperature: The temperature to use. Defaults to `None`, which uses the server-defined default
max_tokens: The maximum number of tokens to generate. Defaults to `None`, which uses the server-defined default
frequency_penalty: The frequency penalty to use. Defaults to `None`, which uses the server-defined default
presence_penalty: The presence penalty to use. Defaults to `None`, which uses the server-defined default
top_p: The top P value to use. Defaults to `None`, which uses the server-defined default
stop: The stop sequences to use. Defaults to `None`, which uses the server-defined default
"""
return _GenerativeDeepseek(
base_url=TypeAdapter(AnyHttpUrl).validate_python(base_url)
if base_url is not None
else None,
model=model,
temperature=temperature,
max_tokens=max_tokens,
frequency_penalty=frequency_penalty,
presence_penalty=presence_penalty,
top_p=top_p,
stop=stop,
)

@staticmethod
def dummy() -> _GenerativeConfigRuntime:
"""Create a `_GenerativeDummy` object for use when performing AI generation using the `generative-dummy` module."""
Expand Down
198 changes: 102 additions & 96 deletions weaviate/proto/v1/v4216/v1/generative_pb2.py

Large diffs are not rendered by default.

47 changes: 43 additions & 4 deletions weaviate/proto/v1/v4216/v1/generative_pb2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class GenerativeSearch(_message.Message):
def __init__(self, single_response_prompt: _Optional[str] = ..., grouped_response_task: _Optional[str] = ..., grouped_properties: _Optional[_Iterable[str]] = ..., single: _Optional[_Union[GenerativeSearch.Single, _Mapping]] = ..., grouped: _Optional[_Union[GenerativeSearch.Grouped, _Mapping]] = ...) -> None: ...

class GenerativeProvider(_message.Message):
__slots__ = ["return_metadata", "anthropic", "anyscale", "aws", "cohere", "dummy", "mistral", "ollama", "openai", "google", "databricks", "friendliai", "nvidia", "xai", "contextualai"]
__slots__ = ["return_metadata", "anthropic", "anyscale", "aws", "cohere", "dummy", "mistral", "ollama", "openai", "google", "databricks", "friendliai", "nvidia", "xai", "contextualai", "deepseek"]
RETURN_METADATA_FIELD_NUMBER: _ClassVar[int]
ANTHROPIC_FIELD_NUMBER: _ClassVar[int]
ANYSCALE_FIELD_NUMBER: _ClassVar[int]
Expand All @@ -58,6 +58,7 @@ class GenerativeProvider(_message.Message):
NVIDIA_FIELD_NUMBER: _ClassVar[int]
XAI_FIELD_NUMBER: _ClassVar[int]
CONTEXTUALAI_FIELD_NUMBER: _ClassVar[int]
DEEPSEEK_FIELD_NUMBER: _ClassVar[int]
return_metadata: bool
anthropic: GenerativeAnthropic
anyscale: GenerativeAnyscale
Expand All @@ -73,7 +74,8 @@ class GenerativeProvider(_message.Message):
nvidia: GenerativeNvidia
xai: GenerativeXAI
contextualai: GenerativeContextualAI
def __init__(self, return_metadata: bool = ..., anthropic: _Optional[_Union[GenerativeAnthropic, _Mapping]] = ..., anyscale: _Optional[_Union[GenerativeAnyscale, _Mapping]] = ..., aws: _Optional[_Union[GenerativeAWS, _Mapping]] = ..., cohere: _Optional[_Union[GenerativeCohere, _Mapping]] = ..., dummy: _Optional[_Union[GenerativeDummy, _Mapping]] = ..., mistral: _Optional[_Union[GenerativeMistral, _Mapping]] = ..., ollama: _Optional[_Union[GenerativeOllama, _Mapping]] = ..., openai: _Optional[_Union[GenerativeOpenAI, _Mapping]] = ..., google: _Optional[_Union[GenerativeGoogle, _Mapping]] = ..., databricks: _Optional[_Union[GenerativeDatabricks, _Mapping]] = ..., friendliai: _Optional[_Union[GenerativeFriendliAI, _Mapping]] = ..., nvidia: _Optional[_Union[GenerativeNvidia, _Mapping]] = ..., xai: _Optional[_Union[GenerativeXAI, _Mapping]] = ..., contextualai: _Optional[_Union[GenerativeContextualAI, _Mapping]] = ...) -> None: ...
deepseek: GenerativeDeepseek
def __init__(self, return_metadata: bool = ..., anthropic: _Optional[_Union[GenerativeAnthropic, _Mapping]] = ..., anyscale: _Optional[_Union[GenerativeAnyscale, _Mapping]] = ..., aws: _Optional[_Union[GenerativeAWS, _Mapping]] = ..., cohere: _Optional[_Union[GenerativeCohere, _Mapping]] = ..., dummy: _Optional[_Union[GenerativeDummy, _Mapping]] = ..., mistral: _Optional[_Union[GenerativeMistral, _Mapping]] = ..., ollama: _Optional[_Union[GenerativeOllama, _Mapping]] = ..., openai: _Optional[_Union[GenerativeOpenAI, _Mapping]] = ..., google: _Optional[_Union[GenerativeGoogle, _Mapping]] = ..., databricks: _Optional[_Union[GenerativeDatabricks, _Mapping]] = ..., friendliai: _Optional[_Union[GenerativeFriendliAI, _Mapping]] = ..., nvidia: _Optional[_Union[GenerativeNvidia, _Mapping]] = ..., xai: _Optional[_Union[GenerativeXAI, _Mapping]] = ..., contextualai: _Optional[_Union[GenerativeContextualAI, _Mapping]] = ..., deepseek: _Optional[_Union[GenerativeDeepseek, _Mapping]] = ...) -> None: ...

class GenerativeAnthropic(_message.Message):
__slots__ = ["base_url", "max_tokens", "model", "temperature", "top_k", "top_p", "stop_sequences", "images", "image_properties"]
Expand Down Expand Up @@ -375,6 +377,26 @@ class GenerativeContextualAI(_message.Message):
knowledge: _base_pb2.TextArray
def __init__(self, model: _Optional[str] = ..., temperature: _Optional[float] = ..., top_p: _Optional[float] = ..., max_new_tokens: _Optional[int] = ..., system_prompt: _Optional[str] = ..., avoid_commentary: bool = ..., knowledge: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ...) -> None: ...

class GenerativeDeepseek(_message.Message):
__slots__ = ["base_url", "model", "temperature", "max_tokens", "frequency_penalty", "presence_penalty", "top_p", "stop"]
BASE_URL_FIELD_NUMBER: _ClassVar[int]
MODEL_FIELD_NUMBER: _ClassVar[int]
TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
MAX_TOKENS_FIELD_NUMBER: _ClassVar[int]
FREQUENCY_PENALTY_FIELD_NUMBER: _ClassVar[int]
PRESENCE_PENALTY_FIELD_NUMBER: _ClassVar[int]
TOP_P_FIELD_NUMBER: _ClassVar[int]
STOP_FIELD_NUMBER: _ClassVar[int]
base_url: str
model: str
temperature: float
max_tokens: int
frequency_penalty: float
presence_penalty: float
top_p: float
stop: _base_pb2.TextArray
def __init__(self, base_url: _Optional[str] = ..., model: _Optional[str] = ..., temperature: _Optional[float] = ..., max_tokens: _Optional[int] = ..., frequency_penalty: _Optional[float] = ..., presence_penalty: _Optional[float] = ..., top_p: _Optional[float] = ..., stop: _Optional[_Union[_base_pb2.TextArray, _Mapping]] = ...) -> None: ...

class GenerativeAnthropicMetadata(_message.Message):
__slots__ = ["usage"]
class Usage(_message.Message):
Expand Down Expand Up @@ -569,8 +591,23 @@ class GenerativeXAIMetadata(_message.Message):
usage: GenerativeXAIMetadata.Usage
def __init__(self, usage: _Optional[_Union[GenerativeXAIMetadata.Usage, _Mapping]] = ...) -> None: ...

class GenerativeDeepseekMetadata(_message.Message):
__slots__ = ["usage"]
class Usage(_message.Message):
__slots__ = ["prompt_tokens", "completion_tokens", "total_tokens"]
PROMPT_TOKENS_FIELD_NUMBER: _ClassVar[int]
COMPLETION_TOKENS_FIELD_NUMBER: _ClassVar[int]
TOTAL_TOKENS_FIELD_NUMBER: _ClassVar[int]
prompt_tokens: int
completion_tokens: int
total_tokens: int
def __init__(self, prompt_tokens: _Optional[int] = ..., completion_tokens: _Optional[int] = ..., total_tokens: _Optional[int] = ...) -> None: ...
USAGE_FIELD_NUMBER: _ClassVar[int]
usage: GenerativeDeepseekMetadata.Usage
def __init__(self, usage: _Optional[_Union[GenerativeDeepseekMetadata.Usage, _Mapping]] = ...) -> None: ...

class GenerativeMetadata(_message.Message):
__slots__ = ["anthropic", "anyscale", "aws", "cohere", "dummy", "mistral", "ollama", "openai", "google", "databricks", "friendliai", "nvidia", "xai"]
__slots__ = ["anthropic", "anyscale", "aws", "cohere", "dummy", "mistral", "ollama", "openai", "google", "databricks", "friendliai", "nvidia", "xai", "deepseek"]
ANTHROPIC_FIELD_NUMBER: _ClassVar[int]
ANYSCALE_FIELD_NUMBER: _ClassVar[int]
AWS_FIELD_NUMBER: _ClassVar[int]
Expand All @@ -584,6 +621,7 @@ class GenerativeMetadata(_message.Message):
FRIENDLIAI_FIELD_NUMBER: _ClassVar[int]
NVIDIA_FIELD_NUMBER: _ClassVar[int]
XAI_FIELD_NUMBER: _ClassVar[int]
DEEPSEEK_FIELD_NUMBER: _ClassVar[int]
anthropic: GenerativeAnthropicMetadata
anyscale: GenerativeAnyscaleMetadata
aws: GenerativeAWSMetadata
Expand All @@ -597,7 +635,8 @@ class GenerativeMetadata(_message.Message):
friendliai: GenerativeFriendliAIMetadata
nvidia: GenerativeNvidiaMetadata
xai: GenerativeXAIMetadata
def __init__(self, anthropic: _Optional[_Union[GenerativeAnthropicMetadata, _Mapping]] = ..., anyscale: _Optional[_Union[GenerativeAnyscaleMetadata, _Mapping]] = ..., aws: _Optional[_Union[GenerativeAWSMetadata, _Mapping]] = ..., cohere: _Optional[_Union[GenerativeCohereMetadata, _Mapping]] = ..., dummy: _Optional[_Union[GenerativeDummyMetadata, _Mapping]] = ..., mistral: _Optional[_Union[GenerativeMistralMetadata, _Mapping]] = ..., ollama: _Optional[_Union[GenerativeOllamaMetadata, _Mapping]] = ..., openai: _Optional[_Union[GenerativeOpenAIMetadata, _Mapping]] = ..., google: _Optional[_Union[GenerativeGoogleMetadata, _Mapping]] = ..., databricks: _Optional[_Union[GenerativeDatabricksMetadata, _Mapping]] = ..., friendliai: _Optional[_Union[GenerativeFriendliAIMetadata, _Mapping]] = ..., nvidia: _Optional[_Union[GenerativeNvidiaMetadata, _Mapping]] = ..., xai: _Optional[_Union[GenerativeXAIMetadata, _Mapping]] = ...) -> None: ...
deepseek: GenerativeDeepseekMetadata
def __init__(self, anthropic: _Optional[_Union[GenerativeAnthropicMetadata, _Mapping]] = ..., anyscale: _Optional[_Union[GenerativeAnyscaleMetadata, _Mapping]] = ..., aws: _Optional[_Union[GenerativeAWSMetadata, _Mapping]] = ..., cohere: _Optional[_Union[GenerativeCohereMetadata, _Mapping]] = ..., dummy: _Optional[_Union[GenerativeDummyMetadata, _Mapping]] = ..., mistral: _Optional[_Union[GenerativeMistralMetadata, _Mapping]] = ..., ollama: _Optional[_Union[GenerativeOllamaMetadata, _Mapping]] = ..., openai: _Optional[_Union[GenerativeOpenAIMetadata, _Mapping]] = ..., google: _Optional[_Union[GenerativeGoogleMetadata, _Mapping]] = ..., databricks: _Optional[_Union[GenerativeDatabricksMetadata, _Mapping]] = ..., friendliai: _Optional[_Union[GenerativeFriendliAIMetadata, _Mapping]] = ..., nvidia: _Optional[_Union[GenerativeNvidiaMetadata, _Mapping]] = ..., xai: _Optional[_Union[GenerativeXAIMetadata, _Mapping]] = ..., deepseek: _Optional[_Union[GenerativeDeepseekMetadata, _Mapping]] = ...) -> None: ...

class GenerativeReply(_message.Message):
__slots__ = ["result", "debug", "metadata"]
Expand Down
198 changes: 102 additions & 96 deletions weaviate/proto/v1/v5261/v1/generative_pb2.py

Large diffs are not rendered by default.

Loading