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
99 changes: 53 additions & 46 deletions backend/score.py

Large diffs are not rendered by default.

38 changes: 38 additions & 0 deletions frontend/src/API/Index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,45 @@
import axios from 'axios';
import { url } from '../utils/Utils';
import { UserCredentials } from '../types';

const api = axios.create({
baseURL: url(),
data: {},
});

export const createDefaultFormData = (userCredentials: UserCredentials) => {
const formData = new FormData();
formData.append('uri', userCredentials?.uri ?? '');
formData.append('database', userCredentials?.database ?? '');
formData.append('userName', userCredentials?.userName ?? '');
formData.append('password', userCredentials?.password ?? '');
formData.append('email', userCredentials?.email ?? '');
api.interceptors.request.use(
(config) => {
if (config.data instanceof FormData) {
for (const [key, value] of formData.entries()) {
if (!config.data.has(key)) {
config.data.append(key, value);
}
}
} else {
const formData = new FormData();
for (const [key, value] of formData.entries()) {
formData.append(key, value);
}
for (const [key, value] of Object.entries(config.data || {})) {
formData.append(key, value as any);
}
config.data = formData;
}

return config;
},
(error) => {
return Promise.reject(error);
}
);
return formData;
};

export default api;
2 changes: 2 additions & 0 deletions frontend/src/components/ChatBot/ChatOnlyComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ const ChatContent: React.FC<ChatProps> = ({ chatMessages }) => {
const encodedPassword = urlParams.get('password');
const database = urlParams.get('database');
const port = urlParams.get('port');
const email = urlParams.get('email');
const openModal = urlParams.get('open') === 'true';
if (openModal || !(uri && user && encodedPassword && database && port)) {
setOpenConnection((prev) => ({ ...prev, openPopUp: true }));
Expand All @@ -42,6 +43,7 @@ const ChatContent: React.FC<ChatProps> = ({ chatMessages }) => {
password: atob(atob(encodedPassword)),
database,
port,
email: email ?? '',
};
setShowBackButton();
setUserCredentials(credentialsForAPI);
Expand Down
4 changes: 0 additions & 4 deletions frontend/src/components/ChatBot/Chatbot.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,10 @@ import {
ExtendedRelationship,
Messages,
ResponseMode,
UserCredentials,
metricstate,
multimodelmetric,
nodeDetailsProps,
} from '../../types';
import { useCredentials } from '../../context/UserCredentials';
import { chatBotAPI } from '../../services/QnaAPI';
import { v4 as uuidv4 } from 'uuid';
import { useFileContext } from '../../context/UsersFiles';
Expand Down Expand Up @@ -63,7 +61,6 @@ const Chatbot: FC<ChatbotProps> = (props) => {
} = props;
const [inputMessage, setInputMessage] = useState('');
const [loading, setLoading] = useState<boolean>(isLoading);
const { userCredentials } = useCredentials();
const { model, chatModes, selectedRows, filesData } = useFileContext();
const messagesEndRef = useRef<HTMLDivElement>(null);
const [showInfoModal, setShowInfoModal] = useState<boolean>(false);
Expand Down Expand Up @@ -215,7 +212,6 @@ const Chatbot: FC<ChatbotProps> = (props) => {
try {
const apiCalls = chatModes.map((mode) =>
chatBotAPI(
userCredentials as UserCredentials,
inputMessage,
sessionId,
model,
Expand Down
5 changes: 1 addition & 4 deletions frontend/src/components/ChatBot/ChunkInfo.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { FC, useContext, useState } from 'react';
import { ChunkProps, UserCredentials } from '../../types';
import { ChunkProps } from '../../types';
import { LoadingSpinner, TextLink, Typography } from '@neo4j-ndl/react';
import { DocumentTextIconOutline, GlobeAltIconOutline } from '@neo4j-ndl/react/icons';
import wikipedialogo from '../../assets/images/wikipedia.svg';
Expand All @@ -10,13 +10,11 @@ import ReactMarkdown from 'react-markdown';
import { generateYouTubeLink, getLogo, isAllowedHost } from '../../utils/Utils';
import { ThemeWrapperContext } from '../../context/ThemeWrapper';
import { chatModeLables } from '../../utils/Constants';
import { useCredentials } from '../../context/UserCredentials';
import GraphViewModal from '../Graph/GraphViewModal';
import { handleGraphNodeClick } from './chatInfo';

const ChunkInfo: FC<ChunkProps> = ({ loading, chunks, mode }) => {
const themeUtils = useContext(ThemeWrapperContext);
const { userCredentials } = useCredentials();
const [neoNodes, setNeoNodes] = useState<any[]>([]);
const [neoRels, setNeoRels] = useState<any[]>([]);
const [openGraphView, setOpenGraphView] = useState(false);
Expand All @@ -25,7 +23,6 @@ const ChunkInfo: FC<ChunkProps> = ({ loading, chunks, mode }) => {

const handleChunkClick = (elementId: string, viewMode: string) => {
handleGraphNodeClick(
userCredentials as UserCredentials,
elementId,
viewMode,
setNeoNodes,
Expand Down
5 changes: 1 addition & 4 deletions frontend/src/components/ChatBot/CommunitiesInfo.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import { LoadingSpinner, Flex, Typography, TextLink } from '@neo4j-ndl/react';
import { FC, useState } from 'react';
import ReactMarkdown from 'react-markdown';
import { CommunitiesProps, UserCredentials } from '../../types';
import { CommunitiesProps } from '../../types';
import { chatModeLables } from '../../utils/Constants';
import { useCredentials } from '../../context/UserCredentials';
import GraphViewModal from '../Graph/GraphViewModal';
import { handleGraphNodeClick } from './chatInfo';

const CommunitiesInfo: FC<CommunitiesProps> = ({ loading, communities, mode }) => {
const { userCredentials } = useCredentials();
const [neoNodes, setNeoNodes] = useState<any[]>([]);
const [neoRels, setNeoRels] = useState<any[]>([]);
const [openGraphView, setOpenGraphView] = useState(false);
Expand All @@ -17,7 +15,6 @@ const CommunitiesInfo: FC<CommunitiesProps> = ({ loading, communities, mode }) =

const handleCommunityClick = (elementId: string, viewMode: string) => {
handleGraphNodeClick(
userCredentials as UserCredentials,
elementId,
viewMode,
setNeoNodes,
Expand Down
5 changes: 1 addition & 4 deletions frontend/src/components/ChatBot/EntitiesInfo.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { GraphLabel, LoadingSpinner, TextLink, Typography } from '@neo4j-ndl/react';
import { FC, useMemo, useState } from 'react';
import { EntitiesProps, GroupedEntity, UserCredentials } from '../../types';
import { EntitiesProps, GroupedEntity } from '../../types';
import { calcWordColor } from '@neo4j-devtools/word-color';
import { graphLabels } from '../../utils/Constants';
import { parseEntity } from '../../utils/Utils';
import { useCredentials } from '../../context/UserCredentials';
import GraphViewModal from '../Graph/GraphViewModal';
import { handleGraphNodeClick } from './chatInfo';

const EntitiesInfo: FC<EntitiesProps> = ({ loading, mode, graphonly_entities, infoEntities }) => {
const { userCredentials } = useCredentials();
const [neoNodes, setNeoNodes] = useState<any[]>([]);
const [neoRels, setNeoRels] = useState<any[]>([]);
const [openGraphView, setOpenGraphView] = useState(false);
Expand Down Expand Up @@ -45,7 +43,6 @@ const EntitiesInfo: FC<EntitiesProps> = ({ loading, mode, graphonly_entities, in

const handleEntityClick = (elementId: string, viewMode: string) => {
handleGraphNodeClick(
userCredentials as UserCredentials,
elementId,
viewMode,
setNeoNodes,
Expand Down
5 changes: 2 additions & 3 deletions frontend/src/components/ChatBot/chatInfo.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { getNeighbors } from '../../services/GraphQuery';
import { NeoNode, NeoRelationship, UserCredentials } from '../../types';
import { NeoNode, NeoRelationship } from '../../types';
import { showNormalToast } from '../../utils/toasts';

export const handleGraphNodeClick = async (
userCredentials: UserCredentials,
elementId: string,
viewMode: string,
setNeoNodes: React.Dispatch<React.SetStateAction<NeoNode[]>>,
Expand All @@ -16,7 +15,7 @@ export const handleGraphNodeClick = async (
setLoadingGraphView(true);
}
try {
const result = await getNeighbors(userCredentials, elementId);
const result = await getNeighbors(elementId);
if (result && result.data.data.nodes.length > 0) {
let { nodes } = result.data.data;
if (viewMode === 'Chunk') {
Expand Down
83 changes: 36 additions & 47 deletions frontend/src/components/Content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,7 @@ import { Button, Typography, Flex, StatusIndicator, useMediaQuery } from '@neo4j
import { useCredentials } from '../context/UserCredentials';
import { useFileContext } from '../context/UsersFiles';
import { extractAPI } from '../utils/FileAPI';
import {
BannerAlertProps,
ContentProps,
CustomFile,
OptionType,
UserCredentials,
chunkdata,
FileTableHandle,
} from '../types';
import { BannerAlertProps, ContentProps, CustomFile, OptionType, chunkdata, FileTableHandle } from '../types';
import deleteAPI from '../services/DeleteFiles';
import { postProcessing } from '../services/PostProcessing';
import { triggerStatusUpdateAPI } from '../services/ServerSideStatusUpdateAPI';
Expand Down Expand Up @@ -157,34 +149,36 @@ const Content: React.FC<ContentProps> = ({
(task) => task !== 'graph_schema_consolidation' && task !== 'enable_communities'
)
: postProcessingTasks.filter((task) => task !== 'enable_communities');
const response = await postProcessing(userCredentials as UserCredentials, payload);
if (response.data.status === 'Success') {
const communityfiles = response.data?.data;
if (Array.isArray(communityfiles) && communityfiles.length) {
communityfiles?.forEach((c: any) => {
setFilesData((prev) => {
return prev.map((f) => {
if (f.name === c.filename) {
return {
...f,
chunkNodeCount: c.chunkNodeCount ?? 0,
entityNodeCount: c.entityNodeCount ?? 0,
communityNodeCount: c.communityNodeCount ?? 0,
chunkRelCount: c.chunkRelCount ?? 0,
entityEntityRelCount: c.entityEntityRelCount ?? 0,
communityRelCount: c.communityRelCount ?? 0,
nodesCount: c.nodeCount,
relationshipsCount: c.relationshipCount,
};
}
return f;
if (payload.length) {
const response = await postProcessing(payload);
if (response.data.status === 'Success') {
const communityfiles = response.data?.data;
if (Array.isArray(communityfiles) && communityfiles.length) {
communityfiles?.forEach((c: any) => {
setFilesData((prev) => {
return prev.map((f) => {
if (f.name === c.filename) {
return {
...f,
chunkNodeCount: c.chunkNodeCount ?? 0,
entityNodeCount: c.entityNodeCount ?? 0,
communityNodeCount: c.communityNodeCount ?? 0,
chunkRelCount: c.chunkRelCount ?? 0,
entityEntityRelCount: c.entityEntityRelCount ?? 0,
communityRelCount: c.communityRelCount ?? 0,
nodesCount: c.nodeCount,
relationshipsCount: c.relationshipCount,
};
}
return f;
});
});
});
});
}
showSuccessToast('All Q&A functionality is available now.');
} else {
throw new Error(response.data.error);
}
showSuccessToast('All Q&A functionality is available now.');
} else {
throw new Error(response.data.error);
}
} catch (error) {
if (error instanceof Error) {
Expand Down Expand Up @@ -220,7 +214,7 @@ const Content: React.FC<ContentProps> = ({
};
const getChunks = async (name: string, pageNo: number) => {
toggleChunksLoading();
const response = await getChunkText(userCredentials as UserCredentials, name, pageNo);
const response = await getChunkText(name, pageNo);
setTextChunks(response.data.data.pageitems);
if (!totalPageCount) {
setTotalPageCount(response.data.data.total_pages);
Expand Down Expand Up @@ -281,7 +275,6 @@ const Content: React.FC<ContentProps> = ({

const apiResponse = await extractAPI(
fileItem.model,
userCredentials as UserCredentials,
fileItem.fileSource,
fileItem.retryOption ?? '',
fileItem.sourceUrl,
Expand Down Expand Up @@ -384,7 +377,7 @@ const Content: React.FC<ContentProps> = ({
};

const addFilesToQueue = async (remainingFiles: CustomFile[]) => {
if (!remainingFiles.length) {
if (!remainingFiles.length && postProcessingTasks.length) {
showNormalToast(
<PostProcessingToast
isGdsActive={isGdsActive}
Expand All @@ -393,7 +386,7 @@ const Content: React.FC<ContentProps> = ({
/>
);
try {
const response = await postProcessing(userCredentials as UserCredentials, postProcessingTasks);
const response = await postProcessing(postProcessingTasks);
if (response.data.status === 'Success') {
const communityfiles = response.data?.data;
if (Array.isArray(communityfiles) && communityfiles.length) {
Expand Down Expand Up @@ -561,7 +554,7 @@ const Content: React.FC<ContentProps> = ({
setConnectionStatus(false);
localStorage.removeItem('password');
localStorage.removeItem('selectedModel');
setUserCredentials({ uri: '', password: '', userName: '', database: '' });
setUserCredentials({ uri: '', password: '', userName: '', database: '', email: '' });
setSelectedNodes([]);
setSelectedRels([]);
localStorage.removeItem('instructions');
Expand All @@ -586,7 +579,7 @@ const Content: React.FC<ContentProps> = ({
const retryHandler = async (filename: string, retryoption: string) => {
try {
setRetryLoading(true);
const response = await retry(userCredentials as UserCredentials, filename, retryoption);
const response = await retry(filename, retryoption);
setRetryLoading(false);
if (response.data.status === 'Failure') {
throw new Error(response.data.error);
Expand Down Expand Up @@ -677,11 +670,7 @@ const Content: React.FC<ContentProps> = ({
const handleDeleteFiles = async (deleteEntities: boolean) => {
try {
setIsDeleteLoading(true);
const response = await deleteAPI(
userCredentials as UserCredentials,
childRef.current?.getSelectedRows() as CustomFile[],
deleteEntities
);
const response = await deleteAPI(childRef.current?.getSelectedRows() as CustomFile[], deleteEntities);
queue.clear();
setProcessedCount(0);
setRowSelection({});
Expand Down Expand Up @@ -716,7 +705,7 @@ const Content: React.FC<ContentProps> = ({
const selectedRows = childRef.current?.getSelectedRows();
if (selectedRows?.length) {
const expiredFilesExists = selectedRows.some(
(c) => c.status !== 'Ready to Reprocess' && isExpired((c?.createdAt as Date) ?? new Date())
(c) => isFileReadyToProcess(c, true) && isExpired((c?.createdAt as Date) ?? new Date())
);
const largeFileExists = selectedRows.some(
(c) => isFileReadyToProcess(c, true) && typeof c.size === 'number' && c.size > largeFileSize
Expand All @@ -729,7 +718,7 @@ const Content: React.FC<ContentProps> = ({
handleGenerateGraph(selectedRows.filter((f) => isFileReadyToProcess(f, false)));
}
} else if (filesData.length) {
const expiredFileExists = filesData.some((c) => isExpired(c?.createdAt as Date));
const expiredFileExists = filesData.some((c) => isFileReadyToProcess(c, true) && isExpired(c?.createdAt as Date));
const largeFileExists = filesData.some(
(c) => isFileReadyToProcess(c, true) && typeof c.size === 'number' && c.size > largeFileSize
);
Expand Down
5 changes: 1 addition & 4 deletions frontend/src/components/DataSources/AWS/S3Modal.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { TextInput } from '@neo4j-ndl/react';
import React, { useState } from 'react';
import { CustomFile, CustomFileBase, S3File, S3ModalProps, UserCredentials } from '../../../types';
import { CustomFile, CustomFileBase, S3File, S3ModalProps } from '../../../types';
import { urlScanAPI } from '../../../services/URLScan';
import { useCredentials } from '../../../context/UserCredentials';
import { validation } from '../../../utils/Utils';
import { useFileContext } from '../../../context/UsersFiles';
import { v4 as uuidv4 } from 'uuid';
Expand All @@ -17,7 +16,6 @@ const S3Modal: React.FC<S3ModalProps> = ({ hideModal, open }) => {
const [statusMessage, setStatusMessage] = useState<string>('');
const [isFocused, setIsFocused] = useState<boolean>(false);
const [isValid, setValid] = useState<boolean>(false);
const { userCredentials } = useCredentials();
const { setFilesData, model, filesData } = useFileContext();

const reset = () => {
Expand Down Expand Up @@ -62,7 +60,6 @@ const S3Modal: React.FC<S3ModalProps> = ({ hideModal, open }) => {
setStatusMessage('Scanning...');
const apiResponse = await urlScanAPI({
urlParam: url.trim(),
userCredentials: userCredentials as UserCredentials,
model: model,
accessKey: accessKey.trim(),
secretKey: secretKey.trim(),
Expand Down
Loading
Loading