# web Next.js frontend: chat UI, citation/evidence panel, drug autocomplete, persistent clinical disclaimer banner. **Current call path: browser → this app's own route handlers → `ai-service`.** `api-gateway` is not built yet (its directory holds a `README.md` and a `package.json`), so requests go through `app/api/` and on to `ai-service` (`API_GATEWAY_URL ?? AI_SERVICE_URL`, set to `http://ai-service:8000` in production). There is no authentication layer in this path today. When the gateway and auth services are built, this is the seam that changes. `app/api/chat/route.ts` is more than a proxy: it maps `ai-service`'s abstain `reason` codes to the Vietnamese text the user reads. A reason code with no entry there falls back to wording that reads as "no data in the formulary", which would misrepresent an outage or a timeout — so a new backend reason code needs an entry here in the same change. Timeouts: `_components/ChatPanel.tsx` aborts a request at 65s, derived from the backend's ceiling (a 40s request budget that can overrun by one in-flight model call). A lower value can cut off answers the server has successfully produced, so keep it above that ceiling if it is ever revisited. ## Running ```powershell pnpm install pnpm --filter web dev # http://localhost:3000, expects ai-service on :8079 ``` ## Tests There are none, and no test runner is configured. Verify changes by driving the real UI in a browser; `pytest` passing in `apps/ai-service` says nothing about this app.