diff --git a/docs/docs/integrations/llms/oci_generative_ai.ipynb b/docs/docs/integrations/llms/oci_generative_ai.ipynb index 3da80aef0e4ae0..6d0692742dc26b 100644 --- a/docs/docs/integrations/llms/oci_generative_ai.ipynb +++ b/docs/docs/integrations/llms/oci_generative_ai.ipynb @@ -135,6 +135,7 @@ " compartment_id=\"MY_OCID\",\n", " auth_type=\"SECURITY_TOKEN\",\n", " auth_profile=\"MY_PROFILE\", # replace with your profile name\n", + " auth_file_location=\"MY_CONFIG_FILE_LOCATION\", # replace with file location where profile name configs present\n", ")" ] }, @@ -159,6 +160,7 @@ " service_endpoint=\"https://inference.generativeai.us-chicago-1.oci.oraclecloud.com\",\n", " compartment_id=\"DEDICATED_COMPARTMENT_OCID\",\n", " auth_profile=\"MY_PROFILE\", # replace with your profile name,\n", + " auth_file_location=\"MY_CONFIG_FILE_LOCATION\", # replace with file location where profile name configs present\n", " provider=\"MODEL_PROVIDER\", # e.g., \"cohere\" or \"meta\"\n", " context_size=\"MODEL_CONTEXT_SIZE\", # e.g., 128000\n", ")" diff --git a/docs/docs/integrations/text_embedding/oci_generative_ai.ipynb b/docs/docs/integrations/text_embedding/oci_generative_ai.ipynb index c9fd205930d7af..2f198d3c2401c4 100755 --- a/docs/docs/integrations/text_embedding/oci_generative_ai.ipynb +++ b/docs/docs/integrations/text_embedding/oci_generative_ai.ipynb @@ -103,6 +103,7 @@ " compartment_id=\"MY_OCID\",\n", " auth_type=\"SECURITY_TOKEN\",\n", " auth_profile=\"MY_PROFILE\", # replace with your profile name\n", + " auth_file_location=\"MY_CONFIG_FILE_LOCATION\", # replace with file location where profile name configs present\n", ")\n", "\n", "\n", diff --git a/libs/community/langchain_community/chat_models/oci_generative_ai.py b/libs/community/langchain_community/chat_models/oci_generative_ai.py index 0c64592fb945f1..716766654d7cc6 100644 --- a/libs/community/langchain_community/chat_models/oci_generative_ai.py +++ b/libs/community/langchain_community/chat_models/oci_generative_ai.py @@ -539,6 +539,8 @@ class ChatOCIGenAI(BaseChatModel, OCIGenAIBase): The authentication type to use, e.g., API_KEY (default), SECURITY_TOKEN, INSTANCE_PRINCIPAL, RESOURCE_PRINCIPAL. auth_profile: Optional[str] The name of the profile in ~/.oci/config, if not specified , DEFAULT will be used. + auth_file_location: Optional[str] + Path to the config file, If not specified, ~/.oci/config will be used. provider: str Provider name of the model. Default to None, will try to be derived from the model_id otherwise, requires user input. See full list of supported init args and their descriptions in the params section. diff --git a/libs/community/langchain_community/embeddings/oci_generative_ai.py b/libs/community/langchain_community/embeddings/oci_generative_ai.py index 10bef6d441dfdf..0f730e6b6df44a 100644 --- a/libs/community/langchain_community/embeddings/oci_generative_ai.py +++ b/libs/community/langchain_community/embeddings/oci_generative_ai.py @@ -29,6 +29,9 @@ class OCIGenAIEmbeddings(BaseModel, Embeddings): Make sure you have the required policies (profile/roles) to access the OCI Generative AI service. If a specific config profile is used, you must pass the name of the profile (~/.oci/config) through auth_profile. + If a specific config file location is used, you must pass + the file location where profile name configs present + through auth_file_location To use, you must provide the compartment id along with the endpoint url, and model id @@ -66,6 +69,11 @@ class OCIGenAIEmbeddings(BaseModel, Embeddings): If not specified , DEFAULT will be used """ + auth_file_location: Optional[str] = "~/.oci/config" + """Path to the config file. + If not specified, ~/.oci/config will be used + """ + model_id: Optional[str] = None """Id of the model to call, e.g., cohere.embed-english-light-v2.0""" @@ -108,6 +116,7 @@ def validate_environment(cls, values: Dict) -> Dict: # pylint: disable=no-self- if values["auth_type"] == OCIAuthType(1).name: client_kwargs["config"] = oci.config.from_file( + file_location=values["auth_file_location"], profile_name=values["auth_profile"] ) client_kwargs.pop("signer", None) @@ -124,6 +133,7 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] return oci.auth.signers.SecurityTokenSigner(st_string, pk) client_kwargs["config"] = oci.config.from_file( + file_location=values["auth_file_location"], profile_name=values["auth_profile"] ) client_kwargs["signer"] = make_security_token_signer( @@ -151,11 +161,11 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] ) from ex except Exception as e: raise ValueError( - "Could not authenticate with OCI client. " - "Please check if ~/.oci/config exists. " - "If INSTANCE_PRINCIPLE or RESOURCE_PRINCIPLE is used, " - "Please check the specified " - "auth_profile and auth_type are valid." + """Could not authenticate with OCI client. + If INSTANCE_PRINCIPAL or RESOURCE_PRINCIPAL is used, + please check the specified + auth_profile, auth_file_location and auth_type are valid.""", + e, ) from e return values diff --git a/libs/community/langchain_community/llms/oci_generative_ai.py b/libs/community/langchain_community/llms/oci_generative_ai.py index a9f48a97528bab..411619b38765d2 100644 --- a/libs/community/langchain_community/llms/oci_generative_ai.py +++ b/libs/community/langchain_community/llms/oci_generative_ai.py @@ -79,6 +79,11 @@ class OCIGenAIBase(BaseModel, ABC): If not specified , DEFAULT will be used """ + auth_file_location: Optional[str] = "~/.oci/config" + """Path to the config file. + If not specified, ~/.oci/config will be used + """ + model_id: Optional[str] = None """Id of the model to call, e.g., cohere.command""" @@ -125,6 +130,7 @@ def validate_environment(cls, values: Dict) -> Dict: if values["auth_type"] == OCIAuthType(1).name: client_kwargs["config"] = oci.config.from_file( + file_location=values["auth_file_location"], profile_name=values["auth_profile"] ) client_kwargs.pop("signer", None) @@ -141,6 +147,7 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] return oci.auth.signers.SecurityTokenSigner(st_string, pk) client_kwargs["config"] = oci.config.from_file( + file_location=values["auth_file_location"], profile_name=values["auth_profile"] ) client_kwargs["signer"] = make_security_token_signer( @@ -171,11 +178,10 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] ) from ex except Exception as e: raise ValueError( - """Could not authenticate with OCI client. - Please check if ~/.oci/config exists. + """Could not authenticate with OCI client. If INSTANCE_PRINCIPAL or RESOURCE_PRINCIPAL is used, please check the specified - auth_profile and auth_type are valid.""", + auth_profile, auth_file_location and auth_type are valid.""", e, ) from e @@ -223,6 +229,9 @@ class OCIGenAI(LLM, OCIGenAIBase): access the OCI Generative AI service. If a specific config profile is used, you must pass the name of the profile (from ~/.oci/config) through auth_profile. + If a specific config file location is used, you must pass + the file location where profile name configs present + through auth_file_location To use, you must provide the compartment id along with the endpoint url, and model id