physix / frontend /README.md
Pratyush-01's picture
Upload folder using huggingface_hub
0e24aff verified
# PhysiX-Live frontend
React + TypeScript + Tailwind UI for the PhysiX-Live demo. Two tabs:
- **Run with LLM** — drives a live episode via `POST /interactive/sessions/:id/llm-step`. Server calls a local Ollama daemon, parses the reply, scores it, returns the turn. The UI streams turn cards as they arrive.
- **Manual**`/interactive/sessions/:id/step`: you submit equations yourself.
## Stack
- React 18 with strict TypeScript (`exactOptionalPropertyTypes: true`).
- Tailwind CSS 3 (warm dark palette, custom tokens in `tailwind.config.js`).
- Vite 5 dev server / bundler.
- KaTeX for live equation rendering.
- Plain HTML5 canvas for trajectory plots — no chart library.
## Layout
```
src/
├── App.tsx # tab switch
├── main.tsx # ReactDOM root
├── components/
│ ├── HeroIntro.tsx # 3-step "Observe / Hypothesise / Verify"
│ ├── RunWithLlmPane.tsx # LLM-driven episode + turn-by-turn stream
│ ├── InteractivePane.tsx # manual equation submission
│ ├── EquationInput.tsx # textarea + KaTeX preview + starter chips
│ ├── EquationDisplay.tsx # KaTeX render of one equation
│ ├── TrajectoryCanvas.tsx # observed (cyan) + predicted (coral)
│ ├── RewardGauge.tsx # 4-bar breakdown with tooltips
│ └── Skeleton.tsx # loading shimmer
├── hooks/
│ ├── useInteractiveSession.ts # manual-mode session lifecycle
│ └── useLlmEpisodeRunner.ts # LLM run / pause / step-once orchestration
├── lib/
│ ├── interactiveClient.ts # typed fetch over /interactive/*
│ ├── trajectory.ts # canvas projection helpers
│ ├── format.ts # SymPy -> KaTeX
│ └── cn.ts # classnames joiner
└── types/physix.ts # mirrors the Pydantic wire schema
```
## Scripts
```bash
pnpm install # install deps
pnpm dev # vite dev server on http://localhost:5173
pnpm typecheck # strict tsc --noEmit
pnpm build # production build into dist/
pnpm preview # serve the production build locally
```
The UI expects `VITE_PHYSIX_API_URL` (default `http://localhost:8000`) to point at a running env server (`python -m physix.server.app`). For the LLM tab you also need `ollama serve` and the model tag pulled.