often don't.
    Finally, a SmartLLMChain assumes that each underlying LLM outputs exactly 1 result.
    """
[docs]    class SmartLLMChainHistory:
        question: str = ""
        ideas: List[str] = []
        critique: str = ""
        @property
        def n_ideas(self) -> int:
            return len(self.ideas)
[docs]        def ideation_prompt_inputs(self) -> Dict[str, Any]:
            return {"question": self.question}
[docs]        def critique_prompt_inputs(self) -> Dict[str, Any]:
            return {
                "question": self.question,
                **{f"idea_{i+1}": idea for i, idea in enumerate(self.ideas)},
            }
[docs]        def resolve_prompt_inputs(self) -> Dict[str, Any]:
            return {
                "question": self.question,
                **{f"idea_{i+1}": idea for i, idea in enumerate(self.ideas)},
                "critique": self.critique,
            }
    prompt: BasePromptTemplate
    """Prompt object to use."""
    ideation_llm: Optional[BaseLanguageModel] = None
    """LLM to use in ideation step. If None given, 'llm' will be used."""
    critique_llm: Optional[BaseLanguageModel] = None
    """LLM to use in critique step. If None given, 'llm' will be used."""
    resolver_llm: Optional[BaseLanguageModel] = None
    """LLM to use in resolve step. If None given, 'llm' will be used."""
    llm: Optional[BaseLanguageModel] = None