import requests from requests.auth import HTTPBasicAuth from langflow.base.models.openai_constants import OPENAI_MODEL_NAMES from langflow.custom import Component from langflow.inputs import DropdownInput, SecretStrInput, StrInput from langflow.io import MessageTextInput, Output from langflow.schema import Data from langflow.schema.message import Message class CombinatorialReasonerComponent(Component): display_name = "Combinatorial Reasoner" description = "Uses Combinatorial Optimization to construct an optimal prompt with embedded reasons. Sign up here:\nhttps://forms.gle/oWNv2NKjBNaqqvCx6" icon = "Icosa" name = "Combinatorial Reasoner" inputs = [ MessageTextInput(name="prompt", display_name="Prompt"), SecretStrInput( name="openai_api_key", display_name="OpenAI API Key", info="The OpenAI API Key to use for the OpenAI model.", advanced=False, value="OPENAI_API_KEY", ), StrInput( name="username", display_name="Username", info="Username to authenticate access to Icosa CR API", advanced=False, ), SecretStrInput( name="password", display_name="Password", info="Password to authenticate access to Icosa CR API.", advanced=False, ), DropdownInput( name="model_name", display_name="Model Name", advanced=False, options=OPENAI_MODEL_NAMES, value=OPENAI_MODEL_NAMES[0], ), ] outputs = [ Output( display_name="Optimized Prompt", name="optimized_prompt", method="build_prompt", ), Output(display_name="Selected Reasons", name="reasons", method="build_reasons"), ] def build_prompt(self) -> Message: params = { "prompt": self.prompt, "apiKey": self.openai_api_key, "model": self.model_name, } creds = HTTPBasicAuth(self.username, password=self.password) response = requests.post( "https://cr-api.icosacomputing.com/cr/langflow", json=params, auth=creds, timeout=100, ) response.raise_for_status() prompt = response.json()["prompt"] self.reasons = response.json()["finalReasons"] return prompt def build_reasons(self) -> Data: # list of selected reasons final_reasons = [reason[0] for reason in self.reasons] return Data(value=final_reasons)