[docs]classDictPromptTemplate(RunnableSerializable[dict,dict]):"""Template represented by a dict. Recognizes variables in f-string or mustache formatted string dict values. Does NOT recognize variables in dict keys. Applies recursively. """template:dict[str,Any]template_format:Literal["f-string","mustache"]@propertydefinput_variables(self)->list[str]:"""Template input variables."""return_get_input_variables(self.template,self.template_format)
[docs]defformat(self,**kwargs:Any)->dict[str,Any]:"""Format the prompt with the inputs."""return_insert_input_variables(self.template,kwargs,self.template_format)
[docs]asyncdefaformat(self,**kwargs:Any)->dict[str,Any]:"""Format the prompt with the inputs."""returnself.format(**kwargs)
[docs]@overridedefinvoke(self,input:dict,config:Optional[RunnableConfig]=None,**kwargs:Any)->dict:"""Invoke the prompt."""returnself._call_with_config(lambdax:self.format(**x),input,ensure_config(config),run_type="prompt",serialized=self._serialized,**kwargs,)
@propertydef_prompt_type(self)->str:return"dict-prompt"@cached_propertydef_serialized(self)->dict[str,Any]:returndumpd(self)@classmethoddefis_lc_serializable(cls)->bool:"""Return whether or not the class is serializable. Returns: True. """returnTrue@classmethoddefget_lc_namespace(cls)->list[str]:"""Serialization namespace."""return["langchain_core","prompts","dict"]
[docs]defpretty_repr(self,*,html:bool=False)->str:"""Human-readable representation. Args: html: Whether to format as HTML. Defaults to False. Returns: Human-readable representation. """raiseNotImplementedError
def_get_input_variables(template:dict,template_format:Literal["f-string","mustache"])->list[str]:input_variables=[]forvintemplate.values():ifisinstance(v,str):input_variables+=get_template_variables(v,template_format)elifisinstance(v,dict):input_variables+=_get_input_variables(v,template_format)elifisinstance(v,(list,tuple)):forxinv:ifisinstance(x,str):input_variables+=get_template_variables(x,template_format)elifisinstance(x,dict):input_variables+=_get_input_variables(x,template_format)else:passreturnlist(set(input_variables))def_insert_input_variables(template:dict[str,Any],inputs:dict[str,Any],template_format:Literal["f-string","mustache"],)->dict[str,Any]:formatted={}formatter=DEFAULT_FORMATTER_MAPPING[template_format]fork,vintemplate.items():ifisinstance(v,str):formatted[k]=formatter(v,**inputs)elifisinstance(v,dict):ifk=="image_url"and"path"inv:msg=("Specifying image inputs via file path in environments with ""user-input paths is a security vulnerability. Out of an abundance ""of caution, the utility has been removed to prevent possible ""misuse.")warnings.warn(msg,stacklevel=2)formatted[k]=_insert_input_variables(v,inputs,template_format)elifisinstance(v,(list,tuple)):formatted_v=[]forxinv:ifisinstance(x,str):formatted_v.append(formatter(x,**inputs))elifisinstance(x,dict):formatted_v.append(_insert_input_variables(x,inputs,template_format))formatted[k]=type(v)(formatted_v)else:formatted[k]=vreturnformatted