Source code for langchain_community.utilities.dalle_image_generator
"""Utility that calls OpenAI's Dall-E Image Generator."""importloggingfromtypingimportAny,Dict,Mapping,Optional,Tuple,Unionfromlangchain_core.utilsimport(from_env,get_pydantic_field_names,secret_from_env,)frompydanticimportBaseModel,ConfigDict,Field,SecretStr,model_validatorfromtyping_extensionsimportSelffromlangchain_community.utils.openaiimportis_openai_v1logger=logging.getLogger(__name__)
[docs]classDallEAPIWrapper(BaseModel):"""Wrapper for OpenAI's DALL-E Image Generator. https://platform.openai.com/docs/guides/images/generations?context=node Usage instructions: 1. `pip install openai` 2. save your OPENAI_API_KEY in an environment variable """client:Any=None#: :meta private:async_client:Any=Field(default=None,exclude=True)#: :meta private:model_name:str=Field(default="dall-e-2",alias="model")model_kwargs:Dict[str,Any]=Field(default_factory=dict)openai_api_key:Optional[SecretStr]=Field(alias="api_key",default_factory=secret_from_env("OPENAI_API_KEY",default=None,),)"""Automatically inferred from env var `OPENAI_API_KEY` if not provided."""openai_api_base:Optional[str]=Field(alias="base_url",default_factory=from_env("OPENAI_API_BASE",default=None))"""Base URL path for API requests, leave blank if not using a proxy or service emulator."""openai_organization:Optional[str]=Field(alias="organization",default_factory=from_env(["OPENAI_ORG_ID","OPENAI_ORGANIZATION"],default=None),)"""Automatically inferred from env var `OPENAI_ORG_ID` if not provided."""# to support explicit proxy for OpenAIopenai_proxy:str=Field(default_factory=from_env("OPENAI_PROXY",default=""))request_timeout:Union[float,Tuple[float,float],Any,None]=Field(default=None,alias="timeout")n:int=1"""Number of images to generate"""size:str="1024x1024""""Size of image to generate"""separator:str="\n""""Separator to use when multiple URLs are returned."""quality:Optional[str]="standard""""Quality of the image that will be generated"""max_retries:int=2"""Maximum number of retries to make when generating."""default_headers:Union[Mapping[str,str],None]=Nonedefault_query:Union[Mapping[str,object],None]=None# Configure a custom httpx client. See the# [httpx documentation](https://www.python-httpx.org/api/#client) for more details.http_client:Union[Any,None]=None"""Optional httpx.Client."""model_config=ConfigDict(extra="forbid",protected_namespaces=())@model_validator(mode="before")@classmethoddefbuild_extra(cls,values:Dict[str,Any])->Any:"""Build extra kwargs from additional params that were passed in."""all_required_field_names=get_pydantic_field_names(cls)extra=values.get("model_kwargs",{})forfield_nameinlist(values):iffield_nameinextra:raiseValueError(f"Found {field_name} supplied twice.")iffield_namenotinall_required_field_names:logger.warning(f"""WARNING! {field_name} is not default parameter.{field_name} was transferred to model_kwargs. Please confirm that {field_name} is what you intended.""")extra[field_name]=values.pop(field_name)invalid_model_kwargs=all_required_field_names.intersection(extra.keys())ifinvalid_model_kwargs:raiseValueError(f"Parameters {invalid_model_kwargs} should be specified explicitly. "f"Instead they were passed in as part of `model_kwargs` parameter.")values["model_kwargs"]=extrareturnvalues@model_validator(mode="after")defvalidate_environment(self)->Self:"""Validate that api key and python package exists in environment."""try:importopenaiexceptImportError:raiseImportError("Could not import openai python package. ""Please install it with `pip install openai`.")ifis_openai_v1():client_params={"api_key":self.openai_api_key.get_secret_value()ifself.openai_api_keyelseNone,"organization":self.openai_organization,"base_url":self.openai_api_base,"timeout":self.request_timeout,"max_retries":self.max_retries,"default_headers":self.default_headers,"default_query":self.default_query,"http_client":self.http_client,}ifnotself.client:self.client=openai.OpenAI(**client_params).images# type: ignore[arg-type, arg-type, arg-type, arg-type, arg-type, arg-type, arg-type, arg-type]ifnotself.async_client:self.async_client=openai.AsyncOpenAI(**client_params).images# type: ignore[arg-type, arg-type, arg-type, arg-type, arg-type, arg-type, arg-type, arg-type]elifnotself.client:self.client=openai.Image# type: ignore[attr-defined]else:passreturnself
[docs]defrun(self,query:str)->str:"""Run query through OpenAI and parse result."""ifis_openai_v1():response=self.client.generate(prompt=query,n=self.n,size=self.size,model=self.model_name,quality=self.quality,)image_urls=self.separator.join([item.urlforiteminresponse.data])else:response=self.client.create(prompt=query,n=self.n,size=self.size,model=self.model_name)image_urls=self.separator.join([item["url"]foriteminresponse["data"]])returnimage_urlsifimage_urlselse"No image was generated"