Skip to content
Open
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
35 changes: 35 additions & 0 deletions .logs/start/api-server.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
INFO: Started server process [69167]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:4242 (Press CTRL+C to quit)
================================================================================
EHTOOL ROUTER MODULE LOADED - VERSION: DEBUG v2
================================================================================
INFO: 127.0.0.1:60334 - "GET /health HTTP/1.1" 200 OK
INFO: 127.0.0.1:60379 - "GET /files?parent=root HTTP/1.1" 200 OK
INFO: 127.0.0.1:60383 - "GET /chat/conversations HTTP/1.1" 200 OK
INFO: 127.0.0.1:60383 - "GET /chat/conversations HTTP/1.1" 200 OK
INFO: 127.0.0.1:60383 - "OPTIONS /chat/conversations/1 HTTP/1.1" 200 OK
INFO: 127.0.0.1:60383 - "DELETE /chat/conversations/1 HTTP/1.1" 200 OK
INFO: 127.0.0.1:60389 - "OPTIONS /chat/query HTTP/1.1" 200 OK
[SEARCH] Loaded 7 docs for keyword search: ['MaskProofreading.md', 'FileManager.md', 'ModelInference.md', 'GettingStarted.md', 'ModelTraining.md', 'Visualization.md', 'Monitoring.md']
[TOOL] search_documentation(query='upload training data server PyTC Client upload training data to server') [call 1]
[TOOL] RAG → 2 chunks: ['GettingStarted.md', 'ModelTraining.md']
[TOOL] search_documentation(query='File Manager upload training data PyTC Client') [call 2]
[TOOL] RAG → 2 chunks: ['FileManager.md', 'ModelTraining.md']
INFO: 127.0.0.1:60389 - "POST /chat/query HTTP/1.1" 200 OK
INFO: 127.0.0.1:60389 - "GET /chat/conversations HTTP/1.1" 200 OK
[TOOL] search_documentation(query='training workflow what do I need to provide PyTC Client training new model') [call 1]
[TOOL] RAG → 2 chunks: ['GettingStarted.md', 'ModelInference.md']
[TOOL] search_documentation(query='Model Training page what inputs are required PyTC Client') [call 2]
[TOOL] RAG → 2 chunks: ['GettingStarted.md', 'ModelTraining.md']
INFO: 127.0.0.1:60389 - "POST /chat/query HTTP/1.1" 200 OK
INFO: 127.0.0.1:60389 - "GET /chat/conversations HTTP/1.1" 200 OK
[TOOL] search_documentation(query='monitor training progress real-time PyTC Client UI') [call 1]
[TOOL] RAG → 2 chunks: ['ModelTraining.md', 'GettingStarted.md']
INFO: 127.0.0.1:60502 - "POST /chat/query HTTP/1.1" 200 OK
INFO: 127.0.0.1:60502 - "GET /chat/conversations HTTP/1.1" 200 OK
INFO: Shutting down
INFO: Waiting for application shutdown.
INFO: Application shutdown complete.
INFO: Finished server process [69167]
1 change: 1 addition & 0 deletions .logs/start/data-server.log
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
127.0.0.1 - - [03/Apr/2026 15:13:18] "GET / HTTP/1.1" 200 -
21 changes: 21 additions & 0 deletions .logs/start/pytc-server.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
INFO: Started server process [69189]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:4243 (Press CTRL+C to quit)

================================================================================
SERVER_PYTC STARTING UP
Python executable: /Users/tizhang/Desktop/pytc-client/.venv/bin/python3
Working directory: /Users/tizhang/Desktop/pytc-client
================================================================================


================================================================================
SERVER_PYTC: Starting Uvicorn server on port 4243...
================================================================================

INFO: 127.0.0.1:60339 - "GET /hello HTTP/1.1" 200 OK
INFO: Shutting down
INFO: Waiting for application shutdown.
INFO: Application shutdown complete.
INFO: Finished server process [69189]
67 changes: 67 additions & 0 deletions .logs/start/react-build.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
npm warn Unknown user config "always-auth". This will stop working in the next major version of npm.
npm warn Unknown user config "always-auth" (//firelayers.jfrog.io/artifactory/api/npm/itc-npm-virtual/:always-auth). This will stop working in the next major version of npm.

> PyTC Client@0.1.0 build
> cross-env CI=false react-scripts build

[baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D`
Creating an optimized production build...
[baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D`
Compiled with warnings.

[eslint]
src/components/FilePickerModal.js
Line 102:35: Function declared in a loop contains unsafe references to variable(s) 'curr' no-loop-func
Line 124:35: Function declared in a loop contains unsafe references to variable(s) 'currParentId' no-loop-func
Line 243:15: The href attribute is required for an anchor to be keyboard accessible. Provide a valid, navigable address as the href value. If you cannot provide an href, but still need the element to resemble a link, use a button and change it with appropriate styles. Learn more: https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/HEAD/docs/rules/anchor-is-valid.md jsx-a11y/anchor-is-valid

src/components/YamlFileUploader.js
Line 347:6: React Hook useEffect has missing dependencies: 'getCurrentConfig' and 'syncYamlContext'. Either include them or remove the dependency array react-hooks/exhaustive-deps
Line 361:6: React Hook useEffect has missing dependencies: 'getCurrentConfig', 'setCurrentConfig', and 'updateInputSelectorInformation'. Either include them or remove the dependency array react-hooks/exhaustive-deps
Line 374:6: React Hook useMemo has a missing dependency: 'getCurrentConfig'. Either include it or remove the dependency array react-hooks/exhaustive-deps

src/views/EHTool.js
Line 25:6: React Hook useEffect has a missing dependency: 'sessionId'. Either include it or remove the dependency array react-hooks/exhaustive-deps

src/views/FilesManager.js
Line 81:31: Function declared in a loop contains unsafe references to variable(s) 'current' no-loop-func
Line 424:27: Function declared in a loop contains unsafe references to variable(s) 'curr' no-loop-func
Line 776:32: Function declared in a loop contains unsafe references to variable(s) 'descendantSizeKb', 'descendantSizeKb', 'descendantSizeKb', 'descendantSizeKb' no-loop-func
Line 1073:6: React Hook useEffect has missing dependencies: 'finishCreateFolder', 'finishRename', 'handleCopy', 'handleCut', 'handleDelete', and 'handlePaste'. Either include them or remove the dependency array react-hooks/exhaustive-deps

src/views/ehtool/DetectionWorkflow.js
Line 225:6: React Hook useEffect has a missing dependency: 'loadInstances'. Either include it or remove the dependency array react-hooks/exhaustive-deps
Line 274:20: The ref value 'schedulerRef.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'schedulerRef.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps
Line 314:6: React Hook useEffect has a missing dependency: 'loadInstanceView'. Either include it or remove the dependency array react-hooks/exhaustive-deps
Line 355:6: React Hook useEffect has a missing dependency: 'loadInstanceView'. Either include it or remove the dependency array react-hooks/exhaustive-deps
Line 416:6: React Hook useEffect has missing dependencies: 'goToNextInstance', 'goToPreviousInstance', 'handleAxisChange', and 'handleInstanceClassify'. Either include them or remove the dependency array react-hooks/exhaustive-deps
Line 524:6: React Hook useEffect has a missing dependency: 'clearFrameCaches'. Either include it or remove the dependency array react-hooks/exhaustive-deps

src/views/ehtool/ProofreadingEditor.js
Line 140:8: React Hook useEffect has a missing dependency: 'loadImages'. Either include it or remove the dependency array react-hooks/exhaustive-deps
Line 148:8: React Hook useEffect has missing dependencies: 'drawCanvas' and 'drawMinimap'. Either include them or remove the dependency array react-hooks/exhaustive-deps
Line 163:8: React Hook useEffect has missing dependencies: 'drawCanvas' and 'drawMinimap'. Either include them or remove the dependency array react-hooks/exhaustive-deps
Line 403:8: React Hook useEffect has a missing dependency: 'loadOverlayImage'. Either include it or remove the dependency array react-hooks/exhaustive-deps
Line 407:8: React Hook useEffect has a missing dependency: 'loadOverlayImage'. Either include it or remove the dependency array react-hooks/exhaustive-deps
Line 653:7: React Hook useMemo has a missing dependency: 'glasbeyColor'. Either include it or remove the dependency array react-hooks/exhaustive-deps
Line 662:8: React Hook useEffect has missing dependencies: 'drawCanvas' and 'drawMinimap'. Either include them or remove the dependency array react-hooks/exhaustive-deps
Line 899:9: Expected a default case default-case
Line 940:8: React Hook useEffect has missing dependencies: 'handleRedo', 'handleSave', and 'handleUndo'. Either include them or remove the dependency array react-hooks/exhaustive-deps

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.

File sizes after gzip:

481.63 kB build/static/js/main.ea9ff1f9.js
465 B build/static/css/main.40821645.css

The project was built assuming it is hosted at ./.
You can control this with the homepage field in your package.json.

The build folder is ready to be deployed.

Find out more about deployment here:

https://cra.link/deployment

23 changes: 23 additions & 0 deletions .logs/start/react-dev.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
npm warn Unknown user config "always-auth". This will stop working in the next major version of npm.
npm warn Unknown user config "always-auth" (//firelayers.jfrog.io/artifactory/api/npm/itc-npm-virtual/:always-auth). This will stop working in the next major version of npm.

> PyTC Client@0.1.0 start
> react-scripts start

[baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D`
(node:69273) [DEP_WEBPACK_DEV_SERVER_ON_AFTER_SETUP_MIDDLEWARE] DeprecationWarning: 'onAfterSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:69273) [DEP_WEBPACK_DEV_SERVER_ON_BEFORE_SETUP_MIDDLEWARE] DeprecationWarning: 'onBeforeSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option.
Starting the development server...

Compiled successfully!

You can now view PyTC Client in the browser.

Local: http://localhost:3000
On Your Network: http://192.168.99.154:3000

Note that the development build is not optimized.
To create a production build, use npm run build.

webpack compiled successfully
3 changes: 2 additions & 1 deletion client/preload.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ const { contextBridge, ipcRenderer } = require("electron");

contextBridge.exposeInMainWorld("electronAPI", {
isElectron: true,
openLocalFile: (options = {}) => ipcRenderer.invoke("open-local-file", options),
openLocalFile: (options = {}) =>
ipcRenderer.invoke("open-local-file", options),
revealInFinder: (targetPath) =>
ipcRenderer.invoke("reveal-in-finder", targetPath),
});
4 changes: 2 additions & 2 deletions client/src/components/RuntimeLogPanel.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ function RuntimeLogPanel({ title, runtime, onRefresh }) {
background: "#fff",
border: "1px solid #f0f0f0",
fontFamily:
'ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace',
"ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace",
fontSize: 12,
color: "#262626",
wordBreak: "break-word",
Expand All @@ -142,7 +142,7 @@ function RuntimeLogPanel({ title, runtime, onRefresh }) {
whiteSpace: "pre-wrap",
wordBreak: "break-word",
fontFamily:
'ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace',
"ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace",
}}
>
{text || "No runtime logs captured yet."}
Expand Down
12 changes: 10 additions & 2 deletions client/src/components/YamlFileUploader.js
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,11 @@ const YamlFileUploader = (props) => {
{yamlContent ? (
<Row>
{sliderData.map((param, index) => {
const sliderValue = getSliderValue(currentYamlData, type, param.key);
const sliderValue = getSliderValue(
currentYamlData,
type,
param.key,
);
const sliderSupported = isSliderSupported(
currentYamlData,
type,
Expand All @@ -507,7 +511,11 @@ const YamlFileUploader = (props) => {
min={param.min}
max={param.max}
marks={param.marks}
value={typeof sliderValue === "number" ? sliderValue : param.value}
value={
typeof sliderValue === "number"
? sliderValue
: param.value
}
disabled={!sliderSupported}
onChange={(newValue) =>
handleSliderChange(param.key, newValue)
Expand Down
60 changes: 36 additions & 24 deletions client/src/configSchema.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,14 +135,26 @@ export function setTrainingOutputPath(configObj, outputPath) {
}
const checkpointsPath = joinPath(outputPath, "checkpoints");
if (hasPath(configObj, ["train", "monitor", "checkpoint", "dirpath"])) {
setPathValue(configObj, ["train", "monitor", "checkpoint", "dirpath"], checkpointsPath);
setPathValue(
configObj,
["train", "monitor", "checkpoint", "dirpath"],
checkpointsPath,
);
return;
}
if (hasPath(configObj, ["monitor", "checkpoint", "dirpath"])) {
setPathValue(configObj, ["monitor", "checkpoint", "dirpath"], checkpointsPath);
setPathValue(
configObj,
["monitor", "checkpoint", "dirpath"],
checkpointsPath,
);
return;
}
setPathValue(configObj, ["monitor", "checkpoint", "dirpath"], checkpointsPath);
setPathValue(
configObj,
["monitor", "checkpoint", "dirpath"],
checkpointsPath,
);
}

export function setInferenceOutputPath(configObj, outputPath) {
Expand All @@ -152,7 +164,11 @@ export function setInferenceOutputPath(configObj, outputPath) {
setPathValue(configObj, ["INFERENCE", "OUTPUT_PATH"], outputPath);
return;
}
setPathValue(configObj, ["inference", "save_prediction", "output_path"], outputPath);
setPathValue(
configObj,
["inference", "save_prediction", "output_path"],
outputPath,
);
}

export function setInferenceExecutionDefaults(configObj) {
Expand Down Expand Up @@ -212,16 +228,14 @@ export function applyInputPaths(
}

if (mode === "training") {
const imagePath =
pickFirstExistingPath(configObj, [
["train", "data", "train", "image"],
["data", "train", "image"],
]) || ["train", "data", "train", "image"];
const labelPath =
pickFirstExistingPath(configObj, [
["train", "data", "train", "label"],
["data", "train", "label"],
]) || ["train", "data", "train", "label"];
const imagePath = pickFirstExistingPath(configObj, [
["train", "data", "train", "image"],
["data", "train", "image"],
]) || ["train", "data", "train", "image"];
const labelPath = pickFirstExistingPath(configObj, [
["train", "data", "train", "label"],
["data", "train", "label"],
]) || ["train", "data", "train", "label"];
setPathValue(configObj, imagePath, inputImagePath);
setPathValue(configObj, labelPath, inputLabelPath);
if (outputPath) {
Expand All @@ -230,16 +244,14 @@ export function applyInputPaths(
return;
}

const imagePath =
pickFirstExistingPath(configObj, [
["test", "data", "test", "image"],
["data", "test", "image"],
]) || ["test", "data", "test", "image"];
const labelPath =
pickFirstExistingPath(configObj, [
["test", "data", "test", "label"],
["data", "test", "label"],
]) || ["test", "data", "test", "label"];
const imagePath = pickFirstExistingPath(configObj, [
["test", "data", "test", "image"],
["data", "test", "image"],
]) || ["test", "data", "test", "image"];
const labelPath = pickFirstExistingPath(configObj, [
["test", "data", "test", "label"],
["data", "test", "label"],
]) || ["test", "data", "test", "label"];
setPathValue(configObj, imagePath, inputImagePath);
if (hasLabelPath) {
setPathValue(configObj, labelPath, inputLabelPath);
Expand Down
5 changes: 1 addition & 4 deletions client/src/configSchema.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import {
applyInputPaths,
setInferenceExecutionDefaults,
} from "./configSchema";
import { applyInputPaths, setInferenceExecutionDefaults } from "./configSchema";

describe("setInferenceExecutionDefaults", () => {
it("preserves existing legacy GPU values", () => {
Expand Down
25 changes: 5 additions & 20 deletions client/src/contexts/GlobalContext.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,25 +130,13 @@ export const ContextWrapper = (props) => {
const [inferenceConfigOriginPath, setInferenceConfigOriginPath] =
usePersistedState("inferenceConfigOriginPath", "");
const [trainingUploadedYamlFile, setTrainingUploadedYamlFile] =
usePersistedState(
"trainingUploadedYamlFile",
"",
);
usePersistedState("trainingUploadedYamlFile", "");
const [inferenceUploadedYamlFile, setInferenceUploadedYamlFile] =
usePersistedState(
"inferenceUploadedYamlFile",
"",
);
usePersistedState("inferenceUploadedYamlFile", "");
const [trainingSelectedYamlPreset, setTrainingSelectedYamlPreset] =
usePersistedState(
"trainingSelectedYamlPreset",
"",
);
usePersistedState("trainingSelectedYamlPreset", "");
const [inferenceSelectedYamlPreset, setInferenceSelectedYamlPreset] =
usePersistedState(
"inferenceSelectedYamlPreset",
"",
);
usePersistedState("inferenceSelectedYamlPreset", "");
const [imageFileList, setImageFileList] = usePersistedState(
"imageFileList",
[],
Expand All @@ -170,10 +158,7 @@ export const ContextWrapper = (props) => {
null,
);
const [inferenceCheckpointPath, setInferenceCheckpointPath] =
usePersistedState(
"inferenceCheckpointPath",
null,
);
usePersistedState("inferenceCheckpointPath", null);
const [currentImage, setCurrentImage] = usePersistedState(
"currentImage",
null,
Expand Down
Loading
Loading