Source code for langchain_community.embeddings.naver
importloggingfromtypingimportAny,Dict,List,Optional,castimporthttpxfromlangchain_core.embeddingsimportEmbeddingsfromlangchain_core.utilsimportconvert_to_secret_str,get_from_envfrompydanticimport(AliasChoices,BaseModel,ConfigDict,Field,SecretStr,model_validator,)fromtyping_extensionsimportSelf_DEFAULT_BASE_URL="https://clovastudio.apigw.ntruss.com"_DEFAULT_BASE_URL_ON_NEW_API_KEY="https://clovastudio.stream.ntruss.com"logger=logging.getLogger(__name__)def_raise_on_error(response:httpx.Response)->None:"""Raise an error if the response is an error."""ifhttpx.codes.is_error(response.status_code):error_message=response.read().decode("utf-8")raisehttpx.HTTPStatusError(f"Error response {response.status_code} "f"while fetching {response.url}: {error_message}",request=response.request,response=response,)asyncdef_araise_on_error(response:httpx.Response)->None:"""Raise an error if the response is an error."""ifhttpx.codes.is_error(response.status_code):error_message=(awaitresponse.aread()).decode("utf-8")raisehttpx.HTTPStatusError(f"Error response {response.status_code} "f"while fetching {response.url}: {error_message}",request=response.request,response=response,)
[docs]classClovaXEmbeddings(BaseModel,Embeddings):"""`NCP ClovaStudio` Embedding API. following environment variables set or passed in constructor in lower case: - ``NCP_CLOVASTUDIO_API_KEY`` - ``NCP_APIGW_API_KEY`` - ``NCP_CLOVASTUDIO_APP_ID`` Example: .. code-block:: python from langchain_community import ClovaXEmbeddings model = ClovaXEmbeddings(model="clir-emb-dolphin") output = embedding.embed_documents(documents) """# noqa: E501client:Optional[httpx.Client]=Field(default=None)#: :meta private:async_client:Optional[httpx.AsyncClient]=Field(default=None)#: :meta private:ncp_clovastudio_api_key:Optional[SecretStr]=Field(default=None,alias="api_key")"""Automatically inferred from env are `NCP_CLOVASTUDIO_API_KEY` if not provided."""ncp_apigw_api_key:Optional[SecretStr]=Field(default=None,alias="apigw_api_key")"""Automatically inferred from env are `NCP_APIGW_API_KEY` if not provided."""base_url:Optional[str]=Field(default=None,alias="base_url")""" Automatically inferred from env are `NCP_CLOVASTUDIO_API_BASE_URL` if not provided. """app_id:Optional[str]=Field(default=None)service_app:bool=Field(default=False,description="false: use testapp, true: use service app on NCP Clova Studio",)model_name:str=Field(default="clir-emb-dolphin",validation_alias=AliasChoices("model_name","model"),description="NCP ClovaStudio embedding model name",)timeout:int=Field(gt=0,default=60)model_config=ConfigDict(arbitrary_types_allowed=True,protected_namespaces=())@propertydeflc_secrets(self)->Dict[str,str]:ifnotself._is_new_api_key():return{"ncp_clovastudio_api_key":"NCP_CLOVASTUDIO_API_KEY",}else:return{"ncp_clovastudio_api_key":"NCP_CLOVASTUDIO_API_KEY","ncp_apigw_api_key":"NCP_APIGW_API_KEY",}@propertydef_api_url(self)->str:"""GET embedding api url"""app_type="serviceapp"ifself.service_appelse"testapp"model_name=self.model_nameifself.model_name!="bge-m3"else"v2"ifself._is_new_api_key():returnf"{self.base_url}/{app_type}/v1/api-tools/embedding/{model_name}"else:return(f"{self.base_url}/{app_type}"f"/v1/api-tools/embedding/{model_name}/{self.app_id}")@model_validator(mode="after")defvalidate_model_after(self)->Self:ifnotself.ncp_clovastudio_api_key:self.ncp_clovastudio_api_key=convert_to_secret_str(get_from_env("ncp_clovastudio_api_key","NCP_CLOVASTUDIO_API_KEY"))ifself._is_new_api_key():self._init_fields_on_new_api_key()else:self._init_fields_on_old_api_key()ifnotself.base_url:raiseValueError("base_url dose not exist.")ifnotself.client:self.client=httpx.Client(base_url=self.base_url,headers=self.default_headers(),timeout=self.timeout,)ifnotself.async_clientandself.base_url:self.async_client=httpx.AsyncClient(base_url=self.base_url,headers=self.default_headers(),timeout=self.timeout,)returnselfdef_is_new_api_key(self)->bool:ifself.ncp_clovastudio_api_key:returnself.ncp_clovastudio_api_key.get_secret_value().startswith("nv-")else:returnFalsedef_init_fields_on_new_api_key(self)->None:ifnotself.base_url:self.base_url=get_from_env("base_url","NCP_CLOVASTUDIO_API_BASE_URL",_DEFAULT_BASE_URL_ON_NEW_API_KEY,)def_init_fields_on_old_api_key(self)->None:ifnotself.ncp_apigw_api_key:self.ncp_apigw_api_key=convert_to_secret_str(get_from_env("ncp_apigw_api_key","NCP_APIGW_API_KEY",""))ifnotself.base_url:self.base_url=get_from_env("base_url","NCP_CLOVASTUDIO_API_BASE_URL",_DEFAULT_BASE_URL)ifnotself.app_id:self.app_id=get_from_env("app_id","NCP_CLOVASTUDIO_APP_ID")
[docs]defdefault_headers(self)->Dict[str,Any]:headers={"Content-Type":"application/json","Accept":"application/json",}clovastudio_api_key=(self.ncp_clovastudio_api_key.get_secret_value()ifself.ncp_clovastudio_api_keyelseNone)ifself._is_new_api_key():### headers on new api keyheaders["Authorization"]=f"Bearer {clovastudio_api_key}"else:### headers on old api keyifclovastudio_api_key:headers["X-NCP-CLOVASTUDIO-API-KEY"]=clovastudio_api_keyapigw_api_key=(self.ncp_apigw_api_key.get_secret_value()ifself.ncp_apigw_api_keyelseNone)ifapigw_api_key:headers["X-NCP-APIGW-API-KEY"]=apigw_api_keyreturnheaders