"""Pass input through a moderation endpoint."""fromtypingimportAny,Dict,List,Optionalfromlangchain_core.callbacksimport(AsyncCallbackManagerForChainRun,CallbackManagerForChainRun,)fromlangchain_core.utilsimportcheck_package_version,get_from_dict_or_envfrompydanticimportField,model_validatorfromlangchain.chains.baseimportChain
[docs]classOpenAIModerationChain(Chain):"""Pass input through a moderation endpoint. To use, you should have the ``openai`` python package installed, and the environment variable ``OPENAI_API_KEY`` set with your API key. Any parameters that are valid to be passed to the openai.create call can be passed in, even if not explicitly saved on this class. Example: .. code-block:: python from langchain.chains import OpenAIModerationChain moderation = OpenAIModerationChain() """client:Any=None#: :meta private:async_client:Any=None#: :meta private:model_name:Optional[str]=None"""Moderation model name to use."""error:bool=False"""Whether or not to error if bad content was found."""input_key:str="input"#: :meta private:output_key:str="output"#: :meta private:openai_api_key:Optional[str]=Noneopenai_organization:Optional[str]=Noneopenai_pre_1_0:bool=Field(default=False)@model_validator(mode="before")@classmethoddefvalidate_environment(cls,values:Dict)->Any:"""Validate that api key and python package exists in environment."""openai_api_key=get_from_dict_or_env(values,"openai_api_key","OPENAI_API_KEY")openai_organization=get_from_dict_or_env(values,"openai_organization","OPENAI_ORGANIZATION",default="",)try:importopenaiopenai.api_key=openai_api_keyifopenai_organization:openai.organization=openai_organizationvalues["openai_pre_1_0"]=Falsetry:check_package_version("openai",gte_version="1.0")exceptValueError:values["openai_pre_1_0"]=Trueifvalues["openai_pre_1_0"]:values["client"]=openai.Moderation# type: ignore[attr-defined]else:values["client"]=openai.OpenAI(api_key=openai_api_key)values["async_client"]=openai.AsyncOpenAI(api_key=openai_api_key)exceptImportError:raiseImportError("Could not import openai python package. ""Please install it with `pip install openai`.")returnvalues@propertydefinput_keys(self)->List[str]:"""Expect input key. :meta private: """return[self.input_key]@propertydefoutput_keys(self)->List[str]:"""Return output key. :meta private: """return[self.output_key]def_moderate(self,text:str,results:Any)->str:ifself.openai_pre_1_0:condition=results["flagged"]else:condition=results.flaggedifcondition:error_str="Text was found that violates OpenAI's content policy."ifself.error:raiseValueError(error_str)else:returnerror_strreturntextdef_call(self,inputs:Dict[str,Any],run_manager:Optional[CallbackManagerForChainRun]=None,)->Dict[str,Any]:text=inputs[self.input_key]ifself.openai_pre_1_0:results=self.client.create(text)output=self._moderate(text,results["results"][0])else:results=self.client.moderations.create(input=text)output=self._moderate(text,results.results[0])return{self.output_key:output}asyncdef_acall(self,inputs:Dict[str,Any],run_manager:Optional[AsyncCallbackManagerForChainRun]=None,)->Dict[str,Any]:ifself.openai_pre_1_0:returnawaitsuper()._acall(inputs,run_manager=run_manager)text=inputs[self.input_key]results=awaitself.async_client.moderations.create(input=text)output=self._moderate(text,results.results[0])return{self.output_key:output}