Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions backend/adapter_processor/adapter_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ def set_default_triad(default_triad: dict[str, str], user: User) -> None:
adapter_type = AdapterTypes.EMBEDDING.name
elif key == AdapterKeys.VECTOR_DB_DEFAULT:
adapter_type = AdapterTypes.VECTOR_DB.name
elif key == AdapterKeys.X2TEXT_DEFAULT:
adapter_type = AdapterTypes.X2TEXT.name

filter_params["adapter_type"] = adapter_type
filter_params["is_default"] = True
Expand Down
1 change: 1 addition & 0 deletions backend/adapter_processor/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class AdapterKeys:
LLM_DEFAULT = "llm_default"
VECTOR_DB_DEFAULT = "vector_db_default"
EMBEDDING_DEFAULT = "embedding_default"
X2TEXT_DEFAULT = "x2text_default"
ADAPTER_NAME_EXISTS = (
"Configuration with this ID already exists. "
"Please try with a different ID"
Expand Down
34 changes: 28 additions & 6 deletions frontend/src/components/agency/actions/Actions.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,28 @@ function Actions({ statusBarMsg, initializeWfComp, stepLoader }) {
setExecutionId("");
};

const isIncompleteWorkflow = () => {
if (details?.tool_instances.length === 0) {
return true;
}
};

// Disable Run & Step execution -
// when NO tool present in the workflow
// When source OR destination is NOT configured
const disableAction = () => {
if (isIncompleteWorkflow()) {
return true;
}
if (
source?.connection_type === "API" &&
destination?.connection_type === "API"
) {
return false;
}
return !source?.connector_instance || !destination?.connector_instance;
};

const createDeployment = (type) => {
const workflowId = details?.id;
if (!workflowId) {
Expand Down Expand Up @@ -361,7 +383,7 @@ function Actions({ statusBarMsg, initializeWfComp, stepLoader }) {
? getInputFile(true, false, 4)
: handleWfExecution(true, false, 4)
}
disabled={handleDisable(4)}
disabled={disableAction() || handleDisable(4)}
loading={execType === "NORMAL"}
>
<PlayCircleOutlined />
Expand All @@ -375,7 +397,7 @@ function Actions({ statusBarMsg, initializeWfComp, stepLoader }) {
? getInputFile(true, true, 0)
: handleWfExecution(true, true, 0)
}
disabled={handleDisable(0)}
disabled={disableAction() || handleDisable(0)}
loading={execType === "STEP"}
>
<StepIcon className="step-icon" />
Expand Down Expand Up @@ -414,31 +436,31 @@ function Actions({ statusBarMsg, initializeWfComp, stepLoader }) {
<ClearOutlined />
</Button>
</Tooltip>
<Tooltip title="Clear File Marker">
<Tooltip title="Clear Processed File History">
<Button disabled={isLoading} onClick={handleClearFileMarker}>
<HistoryOutlined />
</Button>
</Tooltip>
<Divider type="vertical" />
<Tooltip title="Deploy as API">
<Button
disabled={!apiOpsPresent}
disabled={isIncompleteWorkflow() || !apiOpsPresent}
onClick={() => createDeployment("API")}
>
<ApiOutlined />
</Button>
</Tooltip>
<Tooltip title="Deploy as ETL Pipeline">
<Button
disabled={!canAddETLPipeline}
disabled={isIncompleteWorkflow() || !canAddETLPipeline}
onClick={() => createDeployment("ETL")}
>
<DeploymentUnitOutlined />
</Button>
</Tooltip>
<Tooltip title="Deploy as Task Pipeline">
<Button
disabled={!canAddTaskPipeline}
disabled={isIncompleteWorkflow() || !canAddTaskPipeline}
onClick={() => createDeployment("TASK")}
>
<ApiOutlined />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ const DisplayCode = ({ isDialogOpen, setDialogOpen, url }) => {
headers = {
'Authorization': 'Bearer REPLACE_WITH_API_KEY'
}
response = requests.request("GET", api_url, headers=headers, data=payload)
response = requests.request("GET", api_url, headers=headers)
{{/if}}
print('Response:', response.json())
`;
Expand Down Expand Up @@ -127,12 +127,12 @@ const DisplayCode = ({ isDialogOpen, setDialogOpen, url }) => {
const TAB_ITEMS = [
{
key: "POST",
label: "POST",
label: "POST Document",
children: <CodeSnippet code={code} />,
},
{
key: "GET",
label: "GET",
label: "GET Status",
children: <CodeSnippet code={code} />,
},
];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ function Pipelines({ type }) {
<HighlightOutlined />
</div>
<div>
<Typography.Text>Clear File Marker</Typography.Text>
<Typography.Text>Clear Processed File History</Typography.Text>
</div>
</Space>
),
Expand Down
197 changes: 81 additions & 116 deletions frontend/src/components/settings/default-triad/DefaultTriad.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,69 +21,72 @@ function DefaultTriad() {
const { setAlertDetails } = useAlertStore();
const handleException = useExceptionHandler();

const [adaptorsList, setAdaptorsList] = useState([]);
const [currentLLMDefault, setCurrentLLMDefault] = useState();
const [currentVECTORDefault, setCurrentVECTORDefault] = useState();
const [currentEMBDefault, setCurrentEMBDefault] = useState();
const [dropdownData, setDropdownData] = useState([]);
const [selectedValues, setSelectedValues] = useState({});
const [isSubmitEnabled, setIsSubmitEnabled] = useState(false);

const [selectedLLMDefault, setSelectedLLMDefault] = useState();
const [selectedVECTORDefault, setSelectedVECTORDefault] = useState();
const [selectedEMBDefault, setSelectedEMBDefault] = useState();
const desiredOrder = ["LLM", "EMBEDDING", "VECTOR_DB", "X2TEXT"];

useEffect(() => {
const fetchData = async () => {
try {
const res = await axiosPrivate.get(
`/api/v1/unstract/${sessionDetails?.orgId}/adapter/`
);
setAdaptorsList(res.data);
} catch (error) {
console.error("Error fetching data:", error);
const labelMap = {
LLM: "Default LLM",
EMBEDDING: "Default Embeddings",
VECTOR_DB: "Default Vector DB",
X2TEXT: "Default X2Text",
};

const updateDropdownData = (data) => {
const updatedData = data.map((entry) => {
if (entry.is_default) {
return {
...entry,
adapter_name: `${entry.adapter_name} (current default)`,
};
}
};
return entry;
});

fetchData();
}, []);
// Update the state with the modified data
setDropdownData(updatedData);
};

useEffect(() => {
setCurrentLLMDefault(
adaptorsList.find(
(item) => item.adapter_type === "LLM" && item.is_default
)?.id
);
setCurrentVECTORDefault(
adaptorsList.find(
(item) => item.adapter_type === "VECTOR_DB" && item.is_default
)?.id
);
setCurrentEMBDefault(
adaptorsList.find(
(item) => item.adapter_type === "EMBEDDING" && item.is_default
)?.id
);
setSelectedLLMDefault(currentLLMDefault);
setSelectedEMBDefault(currentEMBDefault);
setSelectedVECTORDefault(currentVECTORDefault);
}, [adaptorsList.length > 0]);

const onSubmit = async () => {
if (
currentLLMDefault === selectedLLMDefault &&
currentEMBDefault === selectedEMBDefault &&
currentVECTORDefault === selectedVECTORDefault
) {
setAlertDetails({
type: "warning",
content: "Nothing new to save/update",
const fetchData = async () => {
try {
const response = await axiosPrivate.get(
`/api/v1/unstract/${sessionDetails?.orgId}/adapter/`
);
updateDropdownData(response?.data);
const defaultValues = {};
response?.data.forEach((item) => {
if (item.is_default) {
defaultValues[item.adapter_type] = item.id;
}
});
return;
setSelectedValues(defaultValues);
} catch (error) {
setAlertDetails(handleException(error, "Failed to fetch Default Triads"));
}
};

useEffect(() => {
fetchData();
}, []);

const handleDropdownChange = (adapterType, selectedValue) => {
setSelectedValues((prevValues) => ({
...prevValues,
[adapterType]: selectedValue,
}));
setIsSubmitEnabled(true);
};

// Handler for form submission
const handleSubmit = async () => {
try {
const body = {
llm_default: selectedLLMDefault,
vector_db_default: selectedVECTORDefault,
embedding_default: selectedEMBDefault,
llm_default: selectedValues[desiredOrder[0]],
embedding_default: selectedValues[desiredOrder[1]],
vector_db_default: selectedValues[desiredOrder[2]],
x2text_default: selectedValues[desiredOrder[3]],
};

await axiosPrivate.post(
Expand All @@ -101,10 +104,8 @@ function DefaultTriad() {
type: "success",
content: "Default triad setting saved successfully",
});

setCurrentEMBDefault(selectedEMBDefault);
setCurrentLLMDefault(selectedLLMDefault);
setCurrentVECTORDefault(selectedVECTORDefault);
fetchData();
setIsSubmitEnabled(false);
} catch (error) {
setAlertDetails(handleException(error, "Failed to generate the key"));
}
Expand All @@ -123,68 +124,32 @@ function DefaultTriad() {
<div className="plt-set-layout">
<IslandLayout>
<div className="plt-set-layout-2 form-width">
<SpaceWrapper>
<Typography className="triad-select">Default LLM</Typography>
<Select
placeholder="Select LLM default"
onChange={setSelectedLLMDefault}
value={selectedLLMDefault}
style={{ width: "100%" }}
>
{adaptorsList
.filter((item) => item.adapter_type === "LLM")
.map((item) => (
<Option key={item.id} value={item.id}>
{item.adapter_name}
{currentLLMDefault === item.id && " (current default)"}
</Option>
))}
</Select>
</SpaceWrapper>
<SpaceWrapper>
<Typography className="triad-select">
Default Embeddings
</Typography>
<Select
placeholder="Select Embeddings default"
onChange={setSelectedEMBDefault}
value={selectedEMBDefault}
style={{ width: "100%" }}
>
{adaptorsList
.filter((item) => item.adapter_type === "EMBEDDING")
.map((item) => (
<Option key={item.id} value={item.id}>
{item.adapter_name}
{currentEMBDefault === item.id && " (current default)"}
</Option>
))}
</Select>
</SpaceWrapper>
<SpaceWrapper>
<Typography className="triad-select">
Default Vector DB
</Typography>
<Select
placeholder="Select VECTOR DB default"
onChange={setSelectedVECTORDefault}
value={selectedVECTORDefault}
style={{ width: "100%" }}
>
{adaptorsList
.filter((item) => item.adapter_type === "VECTOR_DB")
.map((item) => (
<Option key={item.id} value={item.id}>
{item.adapter_name}
{currentVECTORDefault === item.id && " (current default)"}
</Option>
))}
</Select>
</SpaceWrapper>
{desiredOrder.map((type) => (
<SpaceWrapper key={type}>
<Typography className="triad-select">
{labelMap[type]}
</Typography>
<Select
placeholder={`Select ${labelMap[type]}`}
value={selectedValues[type] || undefined}
onChange={(value) => handleDropdownChange(type, value)}
style={{ width: "100%" }}
>
{dropdownData
.filter((data) => data.adapter_type === type)
.map((data) => (
<Option key={data.id} value={data.id}>
{data.adapter_name}
</Option>
))}
</Select>
</SpaceWrapper>
))}
<CustomButton
type="primary"
className="triad-select"
onClick={onSubmit}
onClick={handleSubmit}
disabled={!isSubmitEnabled}
>
Save
</CustomButton>
Expand Down