Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Knowledge frontend #860

Merged
merged 71 commits into from
Jul 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
44c2adc
knowledge first cut
NishantBorthakur Jul 5, 2023
0a518ad
knowledge details
NishantBorthakur Jul 5, 2023
66a3a8e
knowledge add form
NishantBorthakur Jul 5, 2023
8e3783a
Merge branch 'knowledge_frontend' of github.com:TransformerOptimus/Su…
NishantBorthakur Jul 6, 2023
352deff
agent create knowledge select
NishantBorthakur Jul 6, 2023
ad1f1ba
add database part 1
NishantBorthakur Jul 6, 2023
8e1081f
add database part 2
NishantBorthakur Jul 6, 2023
06d18db
local storage fixes
NishantBorthakur Jul 6, 2023
e67c52e
database details
NishantBorthakur Jul 6, 2023
2d096ce
minor fix
NishantBorthakur Jul 6, 2023
f8f9db5
comments resolution
NishantBorthakur Jul 7, 2023
bb01346
knowledge details dropdown
NishantBorthakur Jul 7, 2023
c6a746b
knowledge form added
NishantBorthakur Jul 7, 2023
7db8cda
Merge branch 'knowledge_frontend' of github.com:TransformerOptimus/Su…
NishantBorthakur Jul 7, 2023
945e6b2
delete database
NishantBorthakur Jul 7, 2023
5f455d2
delete database modal
NishantBorthakur Jul 7, 2023
f633dee
delete database modal 2
NishantBorthakur Jul 7, 2023
06ab9bd
minorf ix
NishantBorthakur Jul 7, 2023
08e6741
marketplace for knowledge
NishantBorthakur Jul 7, 2023
4f9b0f4
update database changes
NishantBorthakur Jul 7, 2023
323dbbc
dropdown changes
NishantBorthakur Jul 7, 2023
7c1d531
uninstall knowledge in marketplace
NishantBorthakur Jul 10, 2023
93e9471
minor fixes
NishantBorthakur Jul 10, 2023
13257de
minor fixws
NishantBorthakur Jul 10, 2023
b4a0a8c
resolving conflcits against dev
NishantBorthakur Jul 10, 2023
e1999d1
api integration
NishantBorthakur Jul 12, 2023
cddb2b7
resolving conflicts
NishantBorthakur Jul 12, 2023
f9f5029
bug fixes on db connect
NishantBorthakur Jul 12, 2023
d07eb95
bug fix on deleting database
NishantBorthakur Jul 12, 2023
19b7632
knowledge dropdown fi
NishantBorthakur Jul 12, 2023
5151df7
resolving conflicts against dev
NishantBorthakur Jul 12, 2023
f3fefcc
model fixes
NishantBorthakur Jul 12, 2023
e50181c
minor fiox
NishantBorthakur Jul 12, 2023
9878014
remove tab fixes
NishantBorthakur Jul 12, 2023
90b6d77
minor fix
NishantBorthakur Jul 12, 2023
3c4667e
loading text fixes
NishantBorthakur Jul 12, 2023
39be087
index validation
NishantBorthakur Jul 12, 2023
30ac14c
resolving conflicts
NishantBorthakur Jul 12, 2023
05b792b
uninstall knowledge api
NishantBorthakur Jul 12, 2023
e765138
Merge branch 'knowledge_frontend' of github.com:TransformerOptimus/Su…
NishantBorthakur Jul 13, 2023
0dc74e5
minor fix
NishantBorthakur Jul 13, 2023
5a6b77f
minor time fix
NishantBorthakur Jul 13, 2023
3a0a619
code refactoring
NishantBorthakur Jul 13, 2023
dfc8037
knowledge id changed to knowledge name
NishantBorthakur Jul 13, 2023
ef67f6f
introduction and use cases added
NishantBorthakur Jul 13, 2023
a367da7
resolving conflicts
NishantBorthakur Jul 13, 2023
8501177
resolving conflicts against dev
NishantBorthakur Jul 13, 2023
b9d2af3
resolving conflicts against dev
NishantBorthakur Jul 16, 2023
fc580de
uninstall marketplace template by id
NishantBorthakur Jul 17, 2023
2ee69de
resolved conflicts
NishantBorthakur Jul 17, 2023
21ca2bc
minor fixes
NishantBorthakur Jul 17, 2023
5ae6954
Changes in API
Jul 17, 2023
3553496
Changea
Jul 18, 2023
2ab74d8
bug fixes where adding loader while installing, icon alignment, selec…
namansleeps2 Jul 19, 2023
bbdc455
minor bug fixes
namansleeps2 Jul 19, 2023
9a0a890
adding of installed state in the cards of knowledge marketplace
namansleeps2 Jul 19, 2023
b742103
install template condtion
namansleeps2 Jul 19, 2023
6168991
merging with dev of knowledge frontend
namansleeps2 Jul 19, 2023
e927faf
merging with dev of missed part
namansleeps2 Jul 19, 2023
561a544
install dropdown bug fix
NishantBorthakur Jul 20, 2023
3877180
select index validation
NishantBorthakur Jul 20, 2023
144aa45
delete db prompt change
NishantBorthakur Jul 20, 2023
ab22688
time issue fix
NishantBorthakur Jul 20, 2023
19697e5
connect db response handling
NishantBorthakur Jul 20, 2023
8ab077e
minor fix
NishantBorthakur Jul 20, 2023
2223239
final changes
NishantBorthakur Jul 20, 2023
a38d51d
resolving conflicts
NishantBorthakur Jul 20, 2023
456592c
resolving conflicts
NishantBorthakur Jul 25, 2023
15cddbe
minor fix
NishantBorthakur Jul 25, 2023
4477833
resolving conflcits
NishantBorthakur Jul 25, 2023
55a91d8
resolving conflicts
NishantBorthakur Jul 25, 2023
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
158 changes: 150 additions & 8 deletions gui/pages/Content/Agents/AgentCreate.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import React, {useState, useEffect, useRef} from 'react';
import Image from "next/image";
import {ToastContainer, toast} from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import styles from './Agents.module.css';
import {
createAgent,
editAgentTemplate,
Expand All @@ -20,10 +19,23 @@ import {
setLocalStorageArray, returnResourceIcon, getUserTimezone, createInternalId,preventDefault,excludedToolkits
} from "@/utils/utils";
import {EventBus} from "@/utils/eventBus";
import styles from "@/pages/Content/Agents/Agents.module.css";
import styles1 from "@/pages/Content/Knowledge/Knowledge.module.css";
import 'moment-timezone';
import AgentSchedule from "@/pages/Content/Agents/AgentSchedule";

export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgents, toolkits, organisationId, template, internalId, env}) {
export default function AgentCreate({
sendAgentData,
knowledge,
selectedProjectId,
fetchAgents,
toolkits,
organisationId,
template,
internalId,
sendKnowledgeData,
env
}) {
const [advancedOptions, setAdvancedOptions] = useState(false);
const [agentName, setAgentName] = useState("");
const [agentTemplateId, setAgentTemplateId] = useState(null);
Expand Down Expand Up @@ -71,6 +83,11 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
const rollingRef = useRef(null);
const [rollingDropdown, setRollingDropdown] = useState(false);

const [selectedKnowledge, setSelectedKnowledge] = useState('');
const [selectedKnowledgeId, setSelectedKnowledgeId] = useState(null);
const knowledgeRef = useRef(null);
const [knowledgeDropdown, setKnowledgeDropdown] = useState(false);

const databases = ["Pinecone"]
const [database, setDatabase] = useState(databases[0]);
const databaseRef = useRef(null);
Expand Down Expand Up @@ -185,6 +202,10 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
setRollingDropdown(false)
}

if (knowledgeRef.current && !knowledgeRef.current.contains(event.target)) {
setKnowledgeDropdown(false)
}

if (databaseRef.current && !databaseRef.current.contains(event.target)) {
setDatabaseDropdown(false)
}
Expand Down Expand Up @@ -252,6 +273,12 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
};


const handleKnowledgeSelect = (index) => {
setLocalStorageValue("agent_knowledge_" + String(internalId), knowledge[index].name, setSelectedKnowledge);
setLocalStorageValue("agent_knowledge_id_" + String(internalId), knowledge[index].id, setSelectedKnowledgeId);
setKnowledgeDropdown(false);
};

const handleStepChange = (event) => {
setLocalStorageValue("agent_step_time_" + String(internalId), event.target.value, setStepTime);
};
Expand Down Expand Up @@ -380,28 +407,40 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
toast.error("Agent name can't be blank", {autoClose: 1800});
return false;
}

if (agentDescription?.replace(/\s/g, '') === '') {
toast.error("Agent description can't be blank", {autoClose: 1800});
return false;
}

const isEmptyGoal = goals.some((goal) => goal.replace(/\s/g, '') === '');
if (isEmptyGoal) {
toast.error("Goal can't be empty", {autoClose: 1800});
return false;
}

if (selectedTools.length <= 0) {
toast.error("Add atleast one tool", {autoClose: 1800});
return false;
}

if(!modelsArray.includes(model)) {
toast.error("Your key does not have access to the selected model", {autoClose: 1800});
return false;
}

if (toolNames.includes('Knowledge Search') && !selectedKnowledge) {
toast.error("Add atleast one knowledge", {autoClose: 1800});
return;
}

return true;
}

const handleAddAgent = () => {
if (!validateAgentData(true)) return;
if (!validateAgentData(true)) {
return;
}

setCreateClickable(false);

Expand All @@ -427,7 +466,9 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
"permission_type": permission_type,
"LTM_DB": longTermMemory ? database : null,
"user_timezone": getUserTimezone(),
"knowledge" : toolNames.includes('Knowledge Search') ? selectedKnowledgeId : null,
};

const scheduleAgentData = {
"agent_config": agentData,
"schedule": scheduleData,
Expand Down Expand Up @@ -717,8 +758,18 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
setInput(JSON.parse(agent_files));
}
}

const agent_knowledge = localStorage.getItem("agent_knowledge_" + String(internalId));
if (agent_knowledge) {
setSelectedKnowledge(agent_knowledge);
}
}, [internalId])

function openMarketplace() {
openNewTab(-4, "Marketplace", "Marketplace", false);
localStorage.setItem('marketplace_tab', 'market_knowledge');
}

return (<>
<div className="row" style={{overflowY: 'scroll', height: 'calc(100vh - 92px)'}}>
<div className="col-3"></div>
Expand Down Expand Up @@ -748,7 +799,7 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
{goals.length > 1 && <div>
<button className="secondary_button" style={{marginLeft: '4px', padding: '5px'}}
onClick={() => handleGoalDelete(index)}>
<Image width={20} height={21} src="/images/close_light.svg" alt="close-icon"/>
<Image width={20} height={21} src="/images/close.svg" alt="close-icon"/>
</button>
</div>}
</div>))}
Expand All @@ -772,7 +823,7 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
{instructions.length > 1 && <div>
<button className="secondary_button" style={{marginLeft: '4px', padding: '5px'}}
onClick={() => handleInstructionDelete(index)}>
<Image width={20} height={21} src="/images/close_light.svg" alt="close-icon"/>
<Image width={20} height={21} src="/images/close.svg" alt="close-icon"/>
</button>
</div>}
</div>))}
Expand Down Expand Up @@ -871,6 +922,97 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
</div>
</div>
</div>
{toolNames.includes("Knowledge Search") && <div style={{marginTop: '5px'}}>
<label className={styles.form_label}>Add knowledge</label>
<div className="dropdown_container_search" style={{width: '100%'}}>
<div className="custom_select_container" onClick={() => setKnowledgeDropdown(!knowledgeDropdown)}
style={selectedKnowledge ? {width: '100%'} : {width: '100%', color: '#888888'}}>
{selectedKnowledge || 'Select knowledge'}<Image width={20} height={21}
src={!knowledgeDropdown ? '/images/dropdown_down.svg' : '/images/dropdown_up.svg'}
alt="expand-icon"/>
</div>
<div>
{knowledgeDropdown && knowledge && knowledge.length > 0 &&
<div className="custom_select_options" ref={knowledgeRef} style={{width: '100%'}}>
{knowledge.map((item, index) => (
<div key={index} className="custom_select_option" onClick={() => handleKnowledgeSelect(index)}
style={{padding: '12px 14px', maxWidth: '100%'}}>
{item.name}
</div>))}
<div className={styles1.knowledge_db}
style={{maxWidth: '100%', borderTop: '1px solid #3F3A4E'}}>
<div className="custom_select_option"
style={{padding: '12px 14px', maxWidth: '100%', borderRadius: '0'}}
onClick={() => sendKnowledgeData({
id: -6,
name: "new knowledge",
contentType: "Add_Knowledge",
internalId: createInternalId()
})}>
<Image width={15} height={15} src="/images/plus_symbol.svg" alt="add-icon"/>&nbsp;&nbsp;Add
new knowledge
</div>
</div>
<div className={styles1.knowledge_db}
style={{maxWidth: '100%', borderTop: '1px solid #3F3A4E'}}>
<div className="custom_select_option" style={{
padding: '12px 14px',
maxWidth: '100%',
borderTopLeftRadius: '0',
borderTopRightRadius: '0'
}}
onClick={openMarketplace}>
<Image width={15} height={15} src="/images/widgets.svg"
alt="marketplace"/>&nbsp;&nbsp;Browse knowledge from marketplace
</div>
</div>
</div>}
{knowledgeDropdown && knowledge && knowledge.length <= 0 &&
<div className="custom_select_options" ref={knowledgeRef}
style={{width: '100%', maxHeight: '400px'}}>
<div style={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
marginTop: '30px',
marginBottom: '20px',
width: '100%'
}}>
<Image width={150} height={60} src="/images/no_permissions.svg" alt="no-permissions"/>
<span className={styles.feed_title} style={{marginTop: '8px'}}>No knowledge found</span>
</div>
<div className={styles1.knowledge_db}
style={{maxWidth: '100%', borderTop: '1px solid #3F3A4E'}}>
<div className="custom_select_option"
style={{padding: '12px 14px', maxWidth: '100%', borderRadius: '0'}}
onClick={() => sendKnowledgeData({
id: -6,
name: "new knowledge",
contentType: "Add_Knowledge",
internalId: createInternalId()
})}>
<Image width={15} height={15} src="/images/plus_symbol.svg" alt="add-icon"/>&nbsp;&nbsp;Add
new knowledge
</div>
</div>
<div className={styles1.knowledge_db}
style={{maxWidth: '100%', borderTop: '1px solid #3F3A4E'}}>
<div className="custom_select_option" style={{
padding: '12px 14px',
maxWidth: '100%',
borderTopLeftRadius: '0',
borderTopRightRadius: '0'
}}
onClick={openMarketplace}>
<Image width={15} height={15} src="/images/widgets.svg"
alt="marketplace"/>&nbsp;&nbsp;Browse knowledge from marketplace
</div>
</div>
</div>}
</div>
</div>
</div>}
<div style={{marginTop: '15px'}}>
<button className="medium_toggle"
onClick={() => setLocalStorageValue("advanced_options_" + String(internalId), !advancedOptions, setAdvancedOptions)}
Expand Down Expand Up @@ -941,7 +1083,7 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
</div>
<div style={{cursor: 'pointer'}} onClick={() => removeFile(index)}><Image width={20}
height={20}
src='/images/close_light.svg'
src='/images/close.svg'
alt="close-icon"/>
</div>
</div>
Expand All @@ -950,7 +1092,7 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
</div>
</div>}
</div>
<div style={{marginTop: '5px'}}>
<div style={{marginTop: '15px'}}>
<div><label className={styles.form_label}>Constraints</label></div>
{constraints.map((constraint, index) => (<div key={index} style={{
marginBottom: '10px',
Expand All @@ -964,7 +1106,7 @@ export default function AgentCreate({sendAgentData, selectedProjectId, fetchAgen
<div>
<button className="secondary_button" style={{marginLeft: '4px', padding: '5px'}}
onClick={() => handleConstraintDelete(index)}>
<Image width={20} height={21} src="/images/close_light.svg" alt="close-icon"/>
<Image width={20} height={21} src="/images/close.svg" alt="close-icon"/>
</button>
</div>
</div>))}
Expand Down
15 changes: 13 additions & 2 deletions gui/pages/Content/Agents/AgentTemplatesList.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,17 @@ import {fetchAgentTemplateListLocal} from "@/pages/api/DashboardService";
import AgentCreate from "@/pages/Content/Agents/AgentCreate";
import {setLocalStorageValue, openNewTab} from "@/utils/utils";

export default function AgentTemplatesList({sendAgentData, selectedProjectId, fetchAgents, toolkits, organisationId, internalId, env}) {
export default function AgentTemplatesList({
sendAgentData,
knowledge,
selectedProjectId,
fetchAgents,
toolkits,
organisationId,
internalId,
sendKnowledgeData,
env
}) {
const [agentTemplates, setAgentTemplates] = useState([])
const [createAgentClicked, setCreateAgentClicked] = useState(false)
const [sendTemplate, setSendTemplate] = useState(null)
Expand Down Expand Up @@ -103,7 +113,8 @@ export default function AgentTemplatesList({sendAgentData, selectedProjectId, fe
</div>
</div>}
</div>
</div> : <AgentCreate internalId={internalId} organisationId={organisationId} sendAgentData={sendAgentData}
</div> : <AgentCreate sendKnowledgeData={sendKnowledgeData} knowledge={knowledge} internalId={internalId}
organisationId={organisationId} sendAgentData={sendAgentData}
selectedProjectId={selectedProjectId} fetchAgents={fetchAgents} toolkits={toolkits}
template={sendTemplate} env={env} />}
</div>
Expand Down
16 changes: 9 additions & 7 deletions gui/pages/Content/Agents/AgentWorkspace.js
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ export default function AgentWorkspace({env, agentId, agentName, selectedView, a
console.error('Error fetching agent data:', error);
});
}
};
}

function fetchExecutions(agentId, currentRun = null) {
getAgentExecutions(agentId)
Expand Down Expand Up @@ -280,6 +280,8 @@ export default function AgentWorkspace({env, agentId, agentName, selectedView, a
.catch((error) => {
console.error('Error saving agent as template:', error);
});

setDropdown(false);
}

useEffect(() => {
Expand Down Expand Up @@ -349,10 +351,10 @@ export default function AgentWorkspace({env, agentId, agentName, selectedView, a
<Image width={14} height={14} src="/images/run_icon.svg" alt="run-icon"/>&nbsp;New Run
</button>
</div>
{<button className="secondary_button" style={{padding: '8px', height: '31px'}}
onMouseEnter={() => setDropdown(true)} onMouseLeave={() => setDropdown(false)}>
<button className="secondary_button" style={{padding: '8px', height: '31px'}}
onMouseEnter={() => setDropdown(true)} onMouseLeave={() => setDropdown(false)}>
<Image width={14} height={14} src="/images/three_dots.svg" alt="run-icon"/>
</button>}
</button>
{dropdown && <div onMouseEnter={() => setDropdown(true)} onMouseLeave={() => setDropdown(false)}>
<ul className="dropdown_container" style={{marginTop: '31px', marginLeft: '-32px'}}>
<li className="dropdown_item" onClick={() => saveAgentTemplate()}>Save as Template</li>
Expand Down Expand Up @@ -492,7 +494,7 @@ export default function AgentWorkspace({env, agentId, agentName, selectedView, a
{goals.length > 1 && <div>
<button className="secondary_button" style={{marginLeft: '4px', padding: '5px'}}
onClick={() => handleGoalDelete(index)}>
<Image width={20} height={21} src="/images/close_light.svg" alt="close-icon"/>
<Image width={20} height={21} src="/images/close.svg" alt="close-icon"/>
</button>
</div>}
</div>))}
Expand All @@ -515,7 +517,7 @@ export default function AgentWorkspace({env, agentId, agentName, selectedView, a
{instructions.length > 1 && <div>
<button className="secondary_button" style={{marginLeft: '4px', padding: '5px'}}
onClick={() => handleInstructionDelete(index)}>
<Image width={20} height={21} src="/images/close_light.svg" alt="close-icon"/>
<Image width={20} height={21} src="/images/close.svg" alt="close-icon"/>
</button>
</div>}
</div>))}
Expand Down Expand Up @@ -558,4 +560,4 @@ export default function AgentWorkspace({env, agentId, agentName, selectedView, a
</div>
<ToastContainer/>
</>);
}
}
4 changes: 4 additions & 0 deletions gui/pages/Content/Agents/Details.js
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,10 @@ export default function Details({agentDetails, runCount, goals, instructions, ag
<div><Image width={15} height={15} src="/images/fact_check.svg" alt="queue-icon"/></div>
<div style={info_text}>{agentDetails?.agent_type || ''}</div>
</div>
<div className={styles.agent_info_box}>
<div><Image width={15} height={15} src="/images/books.svg" alt="book-icon"/></div>
<div style={info_text}>knowledge name</div>
</div>
<div className={styles.agent_info_box}>
<div><Image width={15} height={15} src="/images/deployed_code.svg" alt="model-icon"/></div>
<div style={info_text}>{agentDetails?.model || ''}</div>
Expand Down
Loading