Bound model retries/timeouts, detect non-answers, add NVIDIA provider - #86
Conversation
…oops Break large files (settings, account, stats, select, job-detail) into smaller components and extracted utils/variants files (e.g. metrics-grid-charts, provider-list, select-panel/select-trigger, badge-variants, button-variants, diff-file-panel-utils, job-chip-utils). Replace filter/map/sort chains with plain for-loops and toSorted in a few server files (catalog, model-chain-progress, model.ts), and rename settings-support.tsx to .ts since it has no JSX.
…ghten 429 retry logic
…und chain timeouts and retries
…jection retry rung for Gemini 400s
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Codra Review
Here are some automated review suggestions for this pull request.
Reviewed commit: dfeeba1f2f
ℹ️ About Codra in GitHub
Your team has set up Codra to review pull requests in this repo. Reviews are triggered when you:
- Open a pull request for review
- Mark a draft as ready
- Comment "@codra-app review"
If Codra has suggestions, it will comment; otherwise it will react with 👍.
Codra can also answer questions or update the PR. Try commenting "@codra-app address that feedback".
| const isDark = useIsDarkMode(); | ||
|
|
||
| // Downloads the lazy chart chunk in parallel with the first stats fetch rather than after it. | ||
| useEffect(prefetchMetricsCharts, []); |
There was a problem hiding this comment.
Async effect return value in useEffect
The prefetchMetricsCharts function is asynchronous. Passing it directly to useEffect causes it to return a Promise, which React warns about as it might be interpreted as a cleanup function. You should wrap the call in a function to ignore the return value.
| useEffect(prefetchMetricsCharts, []); | |
| useEffect(() => { void prefetchMetricsCharts(); }, []); |
| // Without this the book is invocation-scoped: every job continuation re-paid a full-prompt 429 to | ||
| // re-learn a cool-off the previous invocation had already been told about. | ||
| private hydrate(): Promise<void> { | ||
| this.hydrated ??= (async () => { |
There was a problem hiding this comment.
Permanent failure caching on initialization error
Caching the promise from an async IIFE in this.hydrated without resetting it on failure causes any transient error in loadCooldowns() to permanently reject all future calls to hydrate() and skipReason, locking out rate-limit checks for the entire lifetime of the ModelRateLimitBook instance.
| this.hydrated ??= (async () => { | |
| this.hydrated ??= (async () => { try { ... } catch (err) { this.hydrated = null; throw err; } })(); |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Description
Closes #78 #40
Type of change
How Has This Been Tested?
Checklist: