diff --git a/package.json b/package.json index c083b1041..34293406e 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "react-slick": "^0.30.2", "react-star-rating-component": "^1.4.1", "react-swipeable-views": "^0.14.0", + "recharts": "^2.13.3", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "singularitynet-platform-contracts": "^1.0.4", diff --git a/src/Redux/actionCreators/DatasetActions.js b/src/Redux/actionCreators/DatasetActions.js new file mode 100644 index 000000000..92acfb48d --- /dev/null +++ b/src/Redux/actionCreators/DatasetActions.js @@ -0,0 +1,100 @@ +import { DatasetClient, DatasetEndpoints } from "../../config/DatasetClient"; + +export const SET_MAIN_DATASET = "SET_MAIN_DATASET"; +export const SET_MERGE_DATASET = "SET_MERGE_DATASET"; +export const SET_EXAMPLE_DATASETS = "SET_EXAMPLE_DATASETS"; +export const CLEAR_EXAMPLE_DATASETS = "CLEAR_EXAMPLE_DATASETS"; +export const ADD_RECENT_DATASET = "ADD_RECENT_DATASET"; +export const UPDATE_RECENT_DATASET = "UPDATE_RECENT_DATASET"; +export const CLEAR_RECENT_DATASETS = "CLEAR_RECENT_DATASETS"; + +export const setMainDataset = (dataset) => (dispatch) => { + dispatch({ + type: SET_MAIN_DATASET, + payload: dataset, + }); +}; + +export const setMergeDataset = (dataset) => (dispatch) => { + dispatch({ + type: SET_MERGE_DATASET, + payload: dataset, + }); +}; + +export const setExampleDatasets = (datasetList) => (dispatch) => { + dispatch({ + type: SET_EXAMPLE_DATASETS, + payload: datasetList, + }); +}; + +export const clearExampleDatasets = () => (dispatch) => { + dispatch({ + type: CLEAR_EXAMPLE_DATASETS, + }); +}; + +export const addRecentDataset = (dataset) => (dispatch) => { + dispatch({ + type: ADD_RECENT_DATASET, + payload: dataset, + }); +}; + +export const updateRecentDataset = (datasetKey, additionalInfo) => (dispatch) => { + dispatch({ + type: UPDATE_RECENT_DATASET, + payload: { datasetKey, additionalInfo }, + }); +}; + +export const clearRecentDatasets = () => (dispatch) => { + dispatch({ + type: CLEAR_RECENT_DATASETS, + }); +}; + +export const getDatasetStatistic = (datasetKey) => async (dispatch) => { + const params = new URLSearchParams([["dataset_key", datasetKey]]); + return DatasetClient.get(DatasetEndpoints.VALIDATE_AND_ANALIZE, { params }); +}; + +export const improveDataset = (datasetKey, improveOptionsList) => async (dispatch) => { + const params = { + dataset_key: datasetKey, + improve_options: improveOptionsList.reduce((acc, field) => { + acc[field] = true; + return acc; + }, {}), + }; + return DatasetClient.post(DatasetEndpoints.IMPROVE, params); +}; + +export const mergeDatasets = (mainDataset, mergeDataset) => async (dispatch) => { + const params = { + dataset_key_base: mainDataset, + dataset_key_additional: mergeDataset, + }; + return DatasetClient.post(DatasetEndpoints.VALIDATE_MERGE, params) + .then((response) => { + return response.data; + }) + .catch((error) => { + console.error("mergeDatasets Error:", error); + }); +}; + +export const validateMergeDatasets = (mainDataset, mergeDataset) => async (dispatch) => { + const params = { + dataset_key_base: mainDataset, + dataset_key_additional: mergeDataset, + }; + return DatasetClient.post(DatasetEndpoints.MERGE, params) + .then((response) => { + return response.data; + }) + .catch((error) => { + console.error("validateMergeDatasets Error:", error); + }); +}; diff --git a/src/Redux/actionCreators/ServiceDetailsActions.js b/src/Redux/actionCreators/ServiceDetailsActions.js index 747fe01f2..748950453 100644 --- a/src/Redux/actionCreators/ServiceDetailsActions.js +++ b/src/Redux/actionCreators/ServiceDetailsActions.js @@ -96,7 +96,7 @@ export const getIsTrainingAvailable = (detailsTraining, isLoggedIn) => { return false; } - if (!Object.prototype.hasOwnProperty.call(detailsTraining, "trainingMethods")) { + if (!Object.prototype.hasOwnProperty.call(detailsTraining, "trainingMethods") || !detailsTraining?.trainingMethods) { return false; } diff --git a/src/Redux/actionCreators/ServiceTrainingActions.js b/src/Redux/actionCreators/ServiceTrainingActions.js index 9644a735e..916dba218 100644 --- a/src/Redux/actionCreators/ServiceTrainingActions.js +++ b/src/Redux/actionCreators/ServiceTrainingActions.js @@ -2,8 +2,10 @@ import axios from "axios"; import { LoaderContent } from "../../utility/constants/LoaderContent"; import { startAppLoader, stopAppLoader } from "./LoaderActions"; import { getServiceClient } from "./SDKActions"; -import { updateMetamaskWallet } from "./UserActions"; +import { fetchAuthenticatedUser, updateMetamaskWallet } from "./UserActions"; import { modelStatus } from "../reducers/ServiceTrainingReducer"; +import { DatafactoryInstanceS3, DatasetS3Endpoints, TrainingInstanceS3 } from "../../config/DatasetS3Client"; +// import { userActions } from "."; export const SET_MODEL_DETAILS = "SET_MODEL_DETAILS"; export const SET_MODELS_LIST = "SET_MODELS_LIST"; export const RESET_MODEL_DETAILS = "RESET_MODEL_DETAILS"; @@ -189,21 +191,47 @@ const modelStatusByNumber = { 4: "DELETED", }; -export const publishDatasetToS3 = async (fileBlob, name) => { +export const publishDatasetForTraining = (fileBlob, name) => async (dispatch) => { try { - const fileKey = Date.now() + "_" + name; - const url = `https://xim5yugo7g.execute-api.us-east-1.amazonaws.com/default/upload?key=${fileKey}`; + const linkAndKeyDataset = await dispatch(publishDatasetToS3(fileBlob, name, TrainingInstanceS3)); + return linkAndKeyDataset; + } catch (error) { + console.log("publishing Dataset For Training error: ", error); + } +}; - let instance = axios.create({ - headers: { - Authorization: "S1kDjcub9k78JFAyrLPsfS0yQoQ4mgmmpeWKlIoVvYsk6JVq5v4HHKvKQgZ0VdI7", - }, - }); +export const publishDatasetForImproving = (fileBlob, name) => async (dispatch) => { + try { + const linkAndKeyDataset = await dispatch(publishDatasetToS3(fileBlob, name, DatafactoryInstanceS3)); + return linkAndKeyDataset; + } catch (error) { + console.log("publishing Dataset For Improving error: ", error); + } +}; + +export const publishDatasetToS3 = (fileBlob, name, S3Instance) => async (dispatch) => { + const { email } = await dispatch(fetchAuthenticatedUser()); - const response = await instance.get(url); + try { + const baseUrl = S3Instance.getUri(); + const fileKey = name + "_" + email + "_" + Date.now(); + const response = await S3Instance.get(DatasetS3Endpoints.UPLOAD, { params: { key: fileKey } }); await axios.put(response.data.uploadURL, fileBlob); - return `https://xim5yugo7g.execute-api.us-east-1.amazonaws.com/default/download?key=${fileKey}`; + return { + url: `${baseUrl}/download?key=${fileKey}`, + datasetKey: fileKey, + }; } catch (err) { throw new Error(err); } }; + +export const getDatasetSizeFromS3 = async (fileKey, S3instance) => { + return S3instance.get(DatasetS3Endpoints.DOWNLOAD, { params: { key: fileKey, action: "getsize" } }) + .then((response) => { + return response.data.fileSize; + }) + .catch((error) => { + console.error("mergeDatasets Error:", error); + }); +}; diff --git a/src/Redux/actionCreators/index.js b/src/Redux/actionCreators/index.js index 70d354a53..c59269693 100644 --- a/src/Redux/actionCreators/index.js +++ b/src/Redux/actionCreators/index.js @@ -8,6 +8,7 @@ import * as stylesActions from "./StylesActions"; import * as paymentActions from "./PaymentActions"; import * as uiContentActions from "./UiContentActions"; import * as sdkActions from "./SDKActions"; +import * as datasetActions from "./DatasetActions"; export { sdkActions, @@ -20,4 +21,5 @@ export { stylesActions, paymentActions, uiContentActions, + datasetActions, }; diff --git a/src/Redux/reducers/DatasetReducer.js b/src/Redux/reducers/DatasetReducer.js new file mode 100644 index 000000000..02f050c20 --- /dev/null +++ b/src/Redux/reducers/DatasetReducer.js @@ -0,0 +1,45 @@ +import { datasetActions } from "../actionCreators"; + +const initialState = { + mainDataset: null, + mergeDataset: null, + exampleDatasets: [ + { + datasetKey: "data_instruct_llm_1000_base_clean.zip_fospipakno@gufum.com_1733235148125", + name: "DataSet 1: Training data for text translation", + size: 287028, + tag: "Text", + }, + ], + recentDatasets: [], +}; + +const datasetReducer = (state = initialState, action) => { + switch (action.type) { + case datasetActions.SET_MAIN_DATASET: + return { ...state, mainDataset: action.payload }; + case datasetActions.SET_MERGE_DATASET: + return { ...state, mergeDataset: action.payload }; + case datasetActions.SET_EXAMPLE_DATASETS: + return { ...state, exampleDatasets: action.payload }; + case datasetActions.CLEAR_EXAMPLE_DATASETS: + return { ...state, exampleDatasets: [] }; + case datasetActions.ADD_RECENT_DATASET: + return { ...state, recentDatasets: [action.payload, ...state.recentDatasets] }; + case datasetActions.UPDATE_RECENT_DATASET: + return { + ...state, + recentDatasets: state.recentDatasets.map((dataset) => + dataset.datasetKey === action.payload.datasetKey + ? { ...dataset, additionalInfo: action.payload.additionalInfo } // Update the matched user + : dataset + ), + }; + case datasetActions.CLEAR_RECENT_DATASETS: + return { ...state, recentDatasets: [] }; + default: + return state; + } +}; + +export default datasetReducer; diff --git a/src/Redux/reducers/index.js b/src/Redux/reducers/index.js index b481343a2..23b2af416 100644 --- a/src/Redux/reducers/index.js +++ b/src/Redux/reducers/index.js @@ -9,6 +9,7 @@ import stylesReducer from "./StylesReducer"; import paymentReducer from "./PaymentReducer"; import uiContentReducer from "./UiContentReducer"; import sdkReducer from "./SDKReducer"; +import datasetReducer from "./DatasetReducer"; const rootReducer = combineReducers({ userReducer, @@ -21,6 +22,7 @@ const rootReducer = combineReducers({ paymentReducer, uiContentReducer, sdkReducer, + datasetReducer, }); export default rootReducer; diff --git a/src/components/ServiceDetails/AboutService/ServiceOverview.js b/src/components/ServiceDetails/AboutService/ServiceOverview.js index 805048b57..d2f35306d 100644 --- a/src/components/ServiceDetails/AboutService/ServiceOverview.js +++ b/src/components/ServiceDetails/AboutService/ServiceOverview.js @@ -41,7 +41,7 @@ const ServiceOverview = ({ classes, description, tags, isTrainingAvailable }) =>
For this service you can create your own training model!
{/* //TODO */} - + Try now!{graph.displayed_name}
+ {graphByType(graph?.data?.children, graph.type)} ++ {cellData} + | + ))} +
---|
+ {cellData} + | + ))} +
Dataset info
+{datasetParameter.title}
+ {datasetParameter?.additionalInfo && ( + <> +{datasetParameter.value}
+ )} +Drag & Drop or Select File
+Add one more file for merge this
+Upload your dataset
-
Please add a new address that will have access to use, update and delete your model! You do not need to enter
your address
diff --git a/src/components/ServiceDetails/TrainingModels/CreateModel/ModelInfo/index.js b/src/components/ServiceDetails/TrainingModels/CreateModel/ModelInfo/index.js
index b7cc4bfa8..534c3db96 100644
--- a/src/components/ServiceDetails/TrainingModels/CreateModel/ModelInfo/index.js
+++ b/src/components/ServiceDetails/TrainingModels/CreateModel/ModelInfo/index.js
@@ -3,7 +3,6 @@ import { useDispatch, useSelector } from "react-redux";
// import FormControlLabel from "@mui/material/FormControlLabel";
// import Switch from "@mui/material/Switch";
-import StyledDropdown from "../../../../common/StyledDropdown";
import StyledTextField from "../../../../common/StyledTextField";
import StyledButton from "../../../../common/StyledButton";
@@ -24,20 +23,21 @@ const ModelInfo = ({ classes, cancelEditModel }) => {
const { currentModel } = useSelector((state) => state.serviceTrainingReducer);
const { org_id, service_id } = useSelector((state) => currentServiceDetails(state));
+ // const [trainingMethod, setTrainingMethod] = useState(currentModel ? currentModel.methodName : undefined);
//eslint-disable-next-line
const [isRestrictAccessModel, setIsRestrictAccessModel] = useState(
true
// currentModel && currentModel.publicAccess ? true : false
);
const [accessAddresses, setAccessAddresses] = useState(currentModel ? currentModel.addressList : []);
- const [trainingMethod, setTrainingMethod] = useState(currentModel ? currentModel.methodName : undefined);
const [trainingModelName, setTrainingServiceName] = useState(currentModel ? currentModel.modelName : "");
const [trainingModelDescription, setTrainingModelDescription] = useState(
currentModel ? currentModel.description : ""
);
- const [trainingDataLink, setTrainingDataLink] = useState(currentModel ? currentModel.dataLink : "");
+ const [trainingDataset, setTrainingDataset] = useState(currentModel ? currentModel.dataset : "");
const [alert, setAlert] = useState({});
+ const trainingMethod = detailsTraining?.trainingMethods[0];
// const onUpdate = async () => {
// const updateModelParams = {
// trainingModelName,
@@ -74,7 +74,7 @@ const ModelInfo = ({ classes, cancelEditModel }) => {
trainingModelDescription,
accessAddresses,
isRestrictAccessModel,
- dataLink: trainingDataLink,
+ dataLink: trainingDataset.link,
};
await dispatch(createModel(org_id, service_id, newModelParams));
dispatch(loaderActions.stopAppLoader());
@@ -91,19 +91,19 @@ const ModelInfo = ({ classes, cancelEditModel }) => {
// setIsRestrictAccessModel(!isRestrictAccessModel);
// };
- const trainingModelAccess = detailsTraining?.trainingMethods || [];
+ // const trainingModelAccess = detailsTraining?.trainingMethods || [];
- const trainingDropDownObject = trainingModelAccess.map((e) => ({
- value: e,
- label: e,
- }));
+ // const trainingDropDownObject = trainingModelAccess.map((e) => ({
+ // value: e,
+ // label: e,d
+ // }));
- const trainingMethodDropDownBox = (event) => {
- const { value } = event.target;
- if (value !== "default") {
- setTrainingMethod(value);
- }
- };
+ // const trainingMethodDropDownBox = (event) => {
+ // const { value } = event.target;
+ // if (value !== "default") {
+ // setTrainingMethod(value);
+ // }
+ // };
const handleModelServiceName = (event) => {
setTrainingServiceName(event.target.value);
@@ -113,7 +113,7 @@ const ModelInfo = ({ classes, cancelEditModel }) => {
setTrainingModelDescription(event.target.value);
};
- const isCreatingAvailable = trainingMethod && trainingModelName && trainingModelDescription && trainingDataLink;
+ const isCreatingAvailable = trainingMethod && trainingModelName && trainingModelDescription && trainingDataset?.link;
const CreateModelButtonGroup = () => {
return