[docs]classAI21Base(BaseModel):"""Base class for AI21 models."""classConfig:arbitrary_types_allowed=Trueclient:Any=Field(default=None,exclude=True)#: :meta private:api_key:Optional[SecretStr]=None"""API key for AI21 API."""api_host:Optional[str]=None"""Host URL"""timeout_sec:Optional[float]=None"""Timeout in seconds. If not set, it will default to the value of the environment variable `AI21_TIMEOUT_SEC` or 300 seconds. """num_retries:Optional[int]=None"""Maximum number of retries for API requests before giving up."""@root_validator(pre=True)defvalidate_environment(cls,values:Dict)->Dict:api_key=convert_to_secret_str(values.get("api_key")oros.getenv("AI21_API_KEY")or"")values["api_key"]=api_keyapi_host=(values.get("api_host")oros.getenv("AI21_API_URL")or"https://api.ai21.com")values["api_host"]=api_hosttimeout_sec=values.get("timeout_sec")orfloat(os.getenv("AI21_TIMEOUT_SEC",_DEFAULT_TIMEOUT_SEC))values["timeout_sec"]=timeout_secreturnvalues@root_validator(pre=False,skip_on_failure=True)defpost_init(cls,values:Dict)->Dict:api_key=values["api_key"]api_host=values["api_host"]timeout_sec=values["timeout_sec"]ifvalues.get("client")isNone:values["client"]=AI21Client(api_key=api_key.get_secret_value(),api_host=api_host,timeout_sec=Noneiftimeout_secisNoneelsefloat(timeout_sec),via="langchain",)returnvalues