diff --git a/docs/docs/Components/components-tools.md b/docs/docs/Components/components-tools.md index a838a9b3e..0a6d95a51 100644 --- a/docs/docs/Components/components-tools.md +++ b/docs/docs/Components/components-tools.md @@ -44,6 +44,28 @@ This component creates a tool for performing basic arithmetic operations on a gi This component allows you to evaluate basic arithmetic expressions. It supports addition, subtraction, multiplication, division, and exponentiation. The tool uses a secure evaluation method that prevents the execution of arbitrary Python code. +## Combinatorial Reasoner + +This component runs Icosa's Combinatorial Reasoning (CR) pipeline on an input to create an optimized prompt with embedded reasons. Sign up for access here: https://forms.gle/oWNv2NKjBNaqqvCx6 + +### Parameters + +#### Inputs +| Name | Display Name | Description | +|------------------------|--------------|---------------------------------------| +| prompt | Prompt | Input to run CR on | +| openai_api_key | OpenAI API Key | OpenAI API key for authentication | +| username | Username | Username for Icosa API authentication | +| password | Password | Password for Icosa API authentication | +| model_name | Model Name | OpenAI LLM to use for reason generation| + +#### Outputs + +| Name | Display Name | Description | +|---------|-----------|--------------------------------------| +| optimized_prompt | Optimized Prompt| A message object containing the optimized prompt | +| reasons | Selected Reasons| A list of the selected reasons that are embedded in the optimized prompt| + ## Glean Search API This component allows you to call the Glean Search API. diff --git a/pyproject.toml b/pyproject.toml index e5cb771c0..43b57dcd0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,3 @@ - - [tool.uv.sources] langflow-base = { workspace = true } langflow = { workspace = true } diff --git a/src/backend/base/langflow/components/icosacomputing/__init__.py b/src/backend/base/langflow/components/icosacomputing/__init__.py new file mode 100644 index 000000000..c161af652 --- /dev/null +++ b/src/backend/base/langflow/components/icosacomputing/__init__.py @@ -0,0 +1,5 @@ +from .combinatorial_reasoner import CombinatorialReasonerComponent + +__all__ = [ + "CombinatorialReasonerComponent", +] diff --git a/src/backend/base/langflow/components/icosacomputing/combinatorial_reasoner.py b/src/backend/base/langflow/components/icosacomputing/combinatorial_reasoner.py new file mode 100644 index 000000000..217bfb318 --- /dev/null +++ b/src/backend/base/langflow/components/icosacomputing/combinatorial_reasoner.py @@ -0,0 +1,81 @@ +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) diff --git a/src/frontend/src/icons/Icosa/Icosa.jsx b/src/frontend/src/icons/Icosa/Icosa.jsx new file mode 100644 index 000000000..b985fc1f5 --- /dev/null +++ b/src/frontend/src/icons/Icosa/Icosa.jsx @@ -0,0 +1,41 @@ +const SvgIcosa = ({ ...props }) => ( + + + + + + + + + + +); +export default SvgIcosa; diff --git a/src/frontend/src/icons/Icosa/Icosa.svg b/src/frontend/src/icons/Icosa/Icosa.svg new file mode 100644 index 000000000..3d16a1341 --- /dev/null +++ b/src/frontend/src/icons/Icosa/Icosa.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + diff --git a/src/frontend/src/icons/Icosa/index.tsx b/src/frontend/src/icons/Icosa/index.tsx new file mode 100644 index 000000000..4d29d0027 --- /dev/null +++ b/src/frontend/src/icons/Icosa/index.tsx @@ -0,0 +1,8 @@ +import React, { forwardRef } from "react"; +import SvgIcosa from "./Icosa"; + +export const IcosaIcon = forwardRef>( + (props, ref) => { + return ; + }, +); diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index c0d8b53fa..49fe972ab 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -263,6 +263,7 @@ import { GroqIcon } from "../icons/Groq"; import { HCDIcon } from "../icons/HCD"; import { HuggingFaceIcon } from "../icons/HuggingFace"; import { IFixIcon } from "../icons/IFixIt"; +import { IcosaIcon } from "../icons/Icosa"; import { LMStudioIcon } from "../icons/LMStudio"; import { LangChainIcon } from "../icons/LangChain"; import { MaritalkIcon } from "../icons/Maritalk"; @@ -506,6 +507,7 @@ export const SIDEBAR_BUNDLES = [ { display_name: "Notion", name: "Notion", icon: "Notion" }, { display_name: "NVIDIA", name: "nvidia", icon: "NVIDIA" }, { display_name: "Vectara", name: "vectara", icon: "Vectara" }, + { display_name: "Icosa Computing", name: "icosacomputing", icon: "Icosa" }, { display_name: "Google", name: "google", icon: "Google" }, { display_name: "CrewAI", name: "crewai", icon: "CrewAI" }, { display_name: "NotDiamond", name: "notdiamond", icon: "NotDiamond" }, @@ -633,6 +635,7 @@ export const nodeIconsLucide: iconsType = { HuggingFaceHub: HuggingFaceIcon, HuggingFace: HuggingFaceIcon, HuggingFaceEmbeddings: HuggingFaceIcon, + Icosa: IcosaIcon, IFixitLoader: IFixIcon, CrewAI: CrewAiIcon, NotDiamond: NotDiamondIcon,