From 8018c6edb52530b2647ffc062c2b2aee1238c91d Mon Sep 17 00:00:00 2001 From: Qiu Qin Date: Tue, 12 Aug 2025 11:28:44 -0400 Subject: [PATCH 1/5] Use MetaProvider for xai and openai models. --- libs/oci/langchain_oci/chat_models/oci_generative_ai.py | 2 ++ libs/oci/langchain_oci/llms/oci_generative_ai.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py index a219511..7c63359 100644 --- a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py +++ b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py @@ -1018,6 +1018,8 @@ def _provider_map(self) -> Mapping[str, Provider]: return { "cohere": CohereProvider(), "meta": MetaProvider(), + "xai": MetaProvider(), + "openai": MetaProvider(), } @property diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index 8f67d04..fecd689 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -269,6 +269,8 @@ def _provider_map(self) -> Mapping[str, Any]: return { "cohere": CohereProvider(), "meta": MetaProvider(), + "xai": MetaProvider(), + "openai": MetaProvider(), } @property From bede79660de5cb6153670f7439407939cf78ae15 Mon Sep 17 00:00:00 2001 From: Qiu Qin Date: Tue, 12 Aug 2025 14:23:17 -0400 Subject: [PATCH 2/5] Add GenericProvider as default provider for models. --- .../chat_models/oci_generative_ai.py | 21 ++++++++++++---- .../langchain_oci/llms/oci_generative_ai.py | 25 +++++++++++++++---- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py index 7c63359..9986fdd 100644 --- a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py +++ b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py @@ -545,8 +545,8 @@ def process_stream_tool_calls( return tool_call_chunks -class MetaProvider(Provider): - """Provider implementation for Meta.""" +class GenericProvider(Provider): + """Provider for models using generic API spec.""" stop_sequence_key: str = "stop" @@ -934,6 +934,11 @@ def process_stream_tool_calls( return tool_call_chunks +class MetaProvider(GenericProvider): + """Provider for Meta models. This provider is for backward compatibility.""" + pass + + class ChatOCIGenAI(BaseChatModel, OCIGenAIBase): """ChatOCIGenAI chat model integration. @@ -1011,6 +1016,11 @@ class ChatOCIGenAI(BaseChatModel, OCIGenAIBase): def _llm_type(self) -> str: """Return the type of the language model.""" return "oci_generative_ai_chat" + + @property + def _default_provider(self) -> Provider: + """Default provider for the chat model.""" + return GenericProvider() @property def _provider_map(self) -> Mapping[str, Provider]: @@ -1018,14 +1028,15 @@ def _provider_map(self) -> Mapping[str, Provider]: return { "cohere": CohereProvider(), "meta": MetaProvider(), - "xai": MetaProvider(), - "openai": MetaProvider(), } @property def _provider(self) -> Any: """Get the internal provider object""" - return self._get_provider(provider_map=self._provider_map) + return self._get_provider( + provider_map=self._provider_map, + default=self._default_provider + ) def _prepare_request( self, diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index fecd689..319f5f1 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -40,7 +40,8 @@ def completion_response_to_text(self, response: Any) -> str: return response.data.inference_response.generated_texts[0].text -class MetaProvider(Provider): +class GenericProvider(Provider): + """Provider for models using generic API spec.""" stop_sequence_key: str = "stop" def __init__(self) -> None: @@ -50,6 +51,11 @@ def __init__(self) -> None: def completion_response_to_text(self, response: Any) -> str: return response.data.inference_response.choices[0].text + + +class MetaProvider(GenericProvider): + """Provider for Meta models. This provider is for backward compatibility.""" + pass class OCIAuthType(Enum): @@ -199,7 +205,7 @@ def _identifying_params(self) -> Mapping[str, Any]: **{"model_kwargs": _model_kwargs}, } - def _get_provider(self, provider_map: Mapping[str, Any]) -> Any: + def _get_provider(self, provider_map: Mapping[str, Any], default: Provider) -> Any: if self.provider is not None: provider = self.provider else: @@ -212,11 +218,14 @@ def _get_provider(self, provider_map: Mapping[str, Any]) -> Any: provider = self.model_id.split(".")[0].lower() if provider not in provider_map: + if default: + return default raise ValueError( f"Invalid provider derived from model_id: {self.model_id} " "Please explicitly pass in the supported provider " "when using custom endpoint" ) + return GenericProvider() return provider_map[provider] @@ -262,6 +271,11 @@ class OCIGenAI(LLM, OCIGenAIBase): def _llm_type(self) -> str: """Return type of llm.""" return "oci_generative_ai_completion" + + @property + def _default_provider(self) -> Provider: + """Default provider for the llm model.""" + return GenericProvider() @property def _provider_map(self) -> Mapping[str, Any]: @@ -269,14 +283,15 @@ def _provider_map(self) -> Mapping[str, Any]: return { "cohere": CohereProvider(), "meta": MetaProvider(), - "xai": MetaProvider(), - "openai": MetaProvider(), } @property def _provider(self) -> Any: """Get the internal provider object""" - return self._get_provider(provider_map=self._provider_map) + return self._get_provider( + provider_map=self._provider_map, + default=self._default_provider + ) def _prepare_invocation_object( self, prompt: str, stop: Optional[List[str]], kwargs: Dict[str, Any] From 761f153f17e26d944727724ed3a4e1f3a6259eb5 Mon Sep 17 00:00:00 2001 From: Qiu Qin Date: Tue, 12 Aug 2025 16:19:22 -0400 Subject: [PATCH 3/5] Use generic provider as default only if the model_id is not custom endpoint. --- .../chat_models/oci_generative_ai.py | 6 ++---- libs/oci/langchain_oci/llms/oci_generative_ai.py | 15 ++++++--------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py index 9986fdd..4d343ff 100644 --- a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py +++ b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py @@ -1028,15 +1028,13 @@ def _provider_map(self) -> Mapping[str, Provider]: return { "cohere": CohereProvider(), "meta": MetaProvider(), + "generic": GenericProvider(), } @property def _provider(self) -> Any: """Get the internal provider object""" - return self._get_provider( - provider_map=self._provider_map, - default=self._default_provider - ) + return self._get_provider(provider_map=self._provider_map) def _prepare_request( self, diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index 319f5f1..de14dc6 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -205,9 +205,11 @@ def _identifying_params(self) -> Mapping[str, Any]: **{"model_kwargs": _model_kwargs}, } - def _get_provider(self, provider_map: Mapping[str, Any], default: Provider) -> Any: + def _get_provider(self, provider_map: Mapping[str, Any]) -> Any: if self.provider is not None: provider = self.provider + elif self.model_id.startswith(CUSTOM_ENDPOINT_PREFIX): + raise ValueError("provider is required for custom endpoints.") else: if self.model_id is None: raise ValueError( @@ -215,17 +217,14 @@ def _get_provider(self, provider_map: Mapping[str, Any], default: Provider) -> A "please provide the provider explicitly or specify " "the model_id to derive the provider." ) - provider = self.model_id.split(".")[0].lower() + provider = provider_map.get(self.model_id.split(".")[0].lower(), "generic") if provider not in provider_map: - if default: - return default raise ValueError( f"Invalid provider derived from model_id: {self.model_id} " "Please explicitly pass in the supported provider " "when using custom endpoint" ) - return GenericProvider() return provider_map[provider] @@ -283,15 +282,13 @@ def _provider_map(self) -> Mapping[str, Any]: return { "cohere": CohereProvider(), "meta": MetaProvider(), + "generic": GenericProvider(), } @property def _provider(self) -> Any: """Get the internal provider object""" - return self._get_provider( - provider_map=self._provider_map, - default=self._default_provider - ) + return self._get_provider(provider_map=self._provider_map) def _prepare_invocation_object( self, prompt: str, stop: Optional[List[str]], kwargs: Dict[str, Any] From abc8be1eae97eaa308612384cdc71ae7f250ff6e Mon Sep 17 00:00:00 2001 From: Qiu Qin Date: Tue, 12 Aug 2025 16:26:36 -0400 Subject: [PATCH 4/5] Remove default_provider property. --- libs/oci/langchain_oci/chat_models/oci_generative_ai.py | 5 ----- libs/oci/langchain_oci/llms/oci_generative_ai.py | 5 ----- 2 files changed, 10 deletions(-) diff --git a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py index 4d343ff..670076b 100644 --- a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py +++ b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py @@ -1016,11 +1016,6 @@ class ChatOCIGenAI(BaseChatModel, OCIGenAIBase): def _llm_type(self) -> str: """Return the type of the language model.""" return "oci_generative_ai_chat" - - @property - def _default_provider(self) -> Provider: - """Default provider for the chat model.""" - return GenericProvider() @property def _provider_map(self) -> Mapping[str, Provider]: diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index de14dc6..e8364cc 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -270,11 +270,6 @@ class OCIGenAI(LLM, OCIGenAIBase): def _llm_type(self) -> str: """Return type of llm.""" return "oci_generative_ai_completion" - - @property - def _default_provider(self) -> Provider: - """Default provider for the llm model.""" - return GenericProvider() @property def _provider_map(self) -> Mapping[str, Any]: From f639f282784f7c880770606b05eba642e52ef7d2 Mon Sep 17 00:00:00 2001 From: Qiu Qin Date: Tue, 12 Aug 2025 18:26:10 -0400 Subject: [PATCH 5/5] Update the logic for checking model_id in get_provider(). --- libs/oci/langchain_oci/llms/oci_generative_ai.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index e8364cc..240598c 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -208,15 +208,16 @@ def _identifying_params(self) -> Mapping[str, Any]: def _get_provider(self, provider_map: Mapping[str, Any]) -> Any: if self.provider is not None: provider = self.provider + elif self.model_id is None: + raise ValueError( + "model_id is required to derive the provider, " + "please provide the provider explicitly or specify " + "the model_id to derive the provider." + ) elif self.model_id.startswith(CUSTOM_ENDPOINT_PREFIX): raise ValueError("provider is required for custom endpoints.") else: - if self.model_id is None: - raise ValueError( - "model_id is required to derive the provider, " - "please provide the provider explicitly or specify " - "the model_id to derive the provider." - ) + provider = provider_map.get(self.model_id.split(".")[0].lower(), "generic") if provider not in provider_map: