Skip to content

fix: link evaluator button to playground in trace drawer#4565

Open
GanJiaKouN16 wants to merge 5 commits into
Agenta-AI:mainfrom
GanJiaKouN16:fix/evaluator-registry-button-link
Open

fix: link evaluator button to playground in trace drawer#4565
GanJiaKouN16 wants to merge 5 commits into
Agenta-AI:mainfrom
GanJiaKouN16:fix/evaluator-registry-button-link

Conversation

@GanJiaKouN16
Copy link
Copy Markdown

Summary

Fixes #4535 — the "Open evaluator registry" button in the Trace Drawer linked to the wrong destination for human evaluators.

Root cause

useEvaluatorNavigation.ts had separate URL paths for human vs automatic evaluators:

  • Automatic: /evaluators/playground?revisions=... ✅ (correct)
  • Human: /evaluators?tab=human&openEvaluator=... ❌ (registry page, not playground)

The button text also always said "Open evaluator registry" regardless of where it actually navigated.

Fix

  • Unify both evaluator types to navigate to /evaluators/playground?revisions=..., consistent with how the rest of the codebase links to evaluators (EvaluatorSection.tsx, ConfigurationView.tsx)
  • Update button text from "Open evaluator registry" to "Open evaluator playground"
  • OnlineEvaluationDrawer.tsx is NOT changed — its "Open evaluator registry" link (line 651) correctly points to the registry page for adding new evaluators

Changes

File Change
useEvaluatorNavigation.ts Remove human evaluator branch; all evaluators navigate to /evaluators/playground?revisions=...
EvaluatorDetailsPopover.tsx Button text: "Open evaluator registry" → "Open evaluator playground"

Closes #4535

Wire the existing GenerateResetLinkModal and PasswordResetLinkModal
into the Actions dropdown in the workspace members table.

- Add 'Reset password' menu item for workspace members (not self)
- Add resetPassword API function in profile service
- Show confirmation dialog before generating the reset link
- Display the generated password reset link with copy functionality

Closes Agenta-AI#2572
Several tables with row-level click navigation were missing the
shouldIgnoreRowClick guard, causing clicks on interactive elements
(checkboxes, dropdowns, buttons) to accidentally trigger row navigation.

Changes:
- Consolidate shouldIgnoreRowClick with broader selector list (merges
  EvaluationRunsTablePOC's extra selectors: [role='button'],
  [role='menuitem'], [role='checkbox'], .ant-btn, etc.)
- Export INTERACTIVE_ROW_SELECTORS constant for reuse
- Add guard to ObservabilityTable (traces)
- Add guard to SessionsTable
- Add guard to PromptsPage
- Add guard to TestcasesTableShell
- Add guard to EntityTable
- Replace partial data-ivt-stop-row-click check in ScenarioListView
  with full shouldIgnoreRowClick
- Update useEntityTableState to use consolidated selectors
- Remove duplicate shouldIgnoreRowClick from navigationActions.ts
- Update EvaluationRunsTablePOC to import from shared utility

Closes Agenta-AI#3254
The evaluation table was showing a generic 'too many requests' message
instead of the actual provider error because:

1. executeViaFetch never checked for body-level errors on HTTP 200.
   The Python SDK can return HTTP 200 with a non-200 status.code
   embedded in the response body (WorkflowBatchResponse.status.code).
   This path was silently treated as success.

2. Error stacktrace/type/code were not propagated through the pipeline.
   Even when the HTTP error path was taken, only the message was
   extracted — the SDK's status.type, status.code, and status.stacktrace
   were dropped.

Changes:
- executeViaFetch: detect body-level errors on HTTP 200 by checking
  responseData.status.code !== 200 and return an error result
- executeViaFetch: extract stacktrace (coercing string[] to string),
  type, and code from both HTTP-error and body-error paths
- Add stacktrace and type to ExecutionResult, RunResult, and
  ExecuteWorkflowRevisionResult error shapes
- runInvocationAction: pass stacktrace and type through to
  upsertStepResultWithInvocation
- upsertStepResultWithInvocation: accept type field in error param

No UI changes needed — InvocationCell already renders stepError.message
and stepError.stacktrace when present; extractStepError already reads
error.code, error.type, error.stacktrace from persisted step data.

Closes Agenta-AI#3324
…iddleware

The vault middleware built env var names using f'{provider.upper()}_API_KEY'
which produces TOGETHER_AI_API_KEY for the 'together_ai' provider kind.
The actual env var is TOGETHERAI_API_KEY (no underscore), matching the
frontend (llmProviders.ts, transforms.ts), backend (env.py), and the
Daytona sandbox runner (daytona.py).

Add an explicit _PROVIDER_ENV_VAR_MAP dict (mirroring the Daytona runner
pattern) that maps each provider kind to its correct env var name, with
fallback to the original f-string pattern for any future providers.

Closes Agenta-AI#3659
… drawer

The 'Open evaluator registry' button in the Trace Drawer's
EvaluatorDetailsPopover navigated human evaluators to the registry
page (/evaluators?tab=human&openEvaluator=...) instead of the
evaluator playground. Automatic evaluators already linked correctly.

Unify both evaluator types to navigate to the playground
(/evaluators/playground?revisions=...), consistent with how other
parts of the codebase link to evaluators (EvaluatorSection,
ConfigurationView). Update button text to 'Open evaluator playground'.

Closes Agenta-AI#4535
@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 6, 2026

Someone is attempting to deploy a commit to the agenta projects Team on Vercel.

A member of the Team first needs to authorize it.

@dosubot dosubot Bot added size:L This PR changes 100-499 lines, ignoring generated files. Bug Report Something isn't working Frontend labels Jun 6, 2026
@CLAassistant
Copy link
Copy Markdown

CLAassistant commented Jun 6, 2026

CLA assistant check
All committers have signed the CLA.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 6, 2026

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 84b9f056-d95d-4a70-8fc7-8268f0ad467e

📥 Commits

Reviewing files that changed from the base of the PR and between 691f759 and 01a6e6d.

📒 Files selected for processing (22)
  • sdks/python/agenta/sdk/middlewares/running/vault.py
  • web/oss/src/components/EvalRunDetails/atoms/runInvocationAction.ts
  • web/oss/src/components/EvaluationRunsTablePOC/actions/navigationActions.ts
  • web/oss/src/components/EvaluationRunsTablePOC/components/EvaluationRunsTable/index.tsx
  • web/oss/src/components/InfiniteVirtualTable/hooks/useTableManager.tsx
  • web/oss/src/components/SharedDrawers/TraceDrawer/components/EvaluatorDetailsPopover.tsx
  • web/oss/src/components/SharedDrawers/TraceDrawer/hooks/useEvaluatorNavigation.ts
  • web/oss/src/components/TestcasesTableNew/components/TestcasesTableShell.tsx
  • web/oss/src/components/pages/observability/components/ObservabilityTable/index.tsx
  • web/oss/src/components/pages/observability/components/SessionsTable/index.tsx
  • web/oss/src/components/pages/prompts/PromptsPage.tsx
  • web/oss/src/components/pages/settings/WorkspaceManage/cellRenderers.tsx
  • web/oss/src/services/evaluations/invocations/api.ts
  • web/oss/src/services/profile/index.ts
  • web/packages/agenta-annotation-ui/src/components/AnnotationSession/ScenarioListView.tsx
  • web/packages/agenta-entities/src/runnable/types.ts
  • web/packages/agenta-entity-ui/src/shared/EntityTable.tsx
  • web/packages/agenta-playground/src/executeWorkflowRevision.ts
  • web/packages/agenta-playground/src/state/execution/executionRunner.ts
  • web/packages/agenta-playground/src/state/execution/types.ts
  • web/packages/agenta-ui/src/InfiniteVirtualTable/hooks/useEntityTableState.ts
  • web/packages/agenta-ui/src/InfiniteVirtualTable/hooks/useTableManager.tsx
💤 Files with no reviewable changes (1)
  • web/oss/src/components/EvaluationRunsTablePOC/actions/navigationActions.ts
✅ Files skipped from review due to trivial changes (3)
  • web/packages/agenta-entities/src/runnable/types.ts
  • web/oss/src/components/pages/prompts/PromptsPage.tsx
  • web/packages/agenta-annotation-ui/src/components/AnnotationSession/ScenarioListView.tsx
🚧 Files skipped from review as they are similar to previous changes (16)
  • web/oss/src/components/SharedDrawers/TraceDrawer/components/EvaluatorDetailsPopover.tsx
  • web/packages/agenta-ui/src/InfiniteVirtualTable/hooks/useEntityTableState.ts
  • web/oss/src/services/evaluations/invocations/api.ts
  • web/oss/src/components/SharedDrawers/TraceDrawer/hooks/useEvaluatorNavigation.ts
  • web/oss/src/components/InfiniteVirtualTable/hooks/useTableManager.tsx
  • web/oss/src/services/profile/index.ts
  • sdks/python/agenta/sdk/middlewares/running/vault.py
  • web/packages/agenta-playground/src/state/execution/types.ts
  • web/oss/src/components/pages/observability/components/ObservabilityTable/index.tsx
  • web/oss/src/components/EvalRunDetails/atoms/runInvocationAction.ts
  • web/packages/agenta-playground/src/state/execution/executionRunner.ts
  • web/oss/src/components/pages/observability/components/SessionsTable/index.tsx
  • web/oss/src/components/EvaluationRunsTablePOC/components/EvaluationRunsTable/index.tsx
  • web/packages/agenta-entity-ui/src/shared/EntityTable.tsx
  • web/oss/src/components/pages/settings/WorkspaceManage/cellRenderers.tsx
  • web/oss/src/components/TestcasesTableNew/components/TestcasesTableShell.tsx

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added password reset workflow for workspace members.
    • Exposed richer error details (type, stacktrace) across runs and playground results.
  • Bug Fixes

    • Prevented unintended row navigation by ignoring clicks on interactive elements.
  • Refactor

    • Consolidated interactive-element selector logic for consistent table behavior.
    • Unified evaluator navigation to the playground route.
    • Improved provider API key mapping for better key detection and local secrets handling.
    • Updated evaluator details button label.

Walkthrough

This PR enriches error shapes with optional type/stacktrace fields across types and runtime, centralizes row-click suppression selectors and logic, fixes evaluator playground routing and label, adds workspace password reset UI+API, and adds a provider-kind → env-var mapping in the Python vault middleware.

Changes

Error metadata enrichment across execution layers

Layer / File(s) Summary
Error type contracts
web/packages/agenta-entities/src/runnable/types.ts, web/packages/agenta-playground/src/executeWorkflowRevision.ts, web/packages/agenta-playground/src/state/execution/types.ts
Interfaces expand error objects to include optional type and stacktrace fields in addition to existing message and code.
Execution error extraction and enrichment
web/packages/agenta-playground/src/state/execution/executionRunner.ts
HTTP fetch execution enriches error payloads with structured fields (code, type, stacktrace); detects and handles body-level error status codes as failures with extracted error details.
Service API error parameter
web/oss/src/services/evaluations/invocations/api.ts
Public API function signature for step result upsert accepts optional type field alongside message and stacktrace in error parameter.
Consumer invocation error payload
web/oss/src/components/EvalRunDetails/atoms/runInvocationAction.ts
Invocation failure path passes enriched error object with optional stacktrace and type fields to result upsert instead of bare message.

Row click suppression refactoring and consolidation

Layer / File(s) Summary
Core interactive selector list and refactored logic
web/packages/agenta-ui/src/InfiniteVirtualTable/hooks/useTableManager.tsx, web/oss/src/components/InfiniteVirtualTable/hooks/useTableManager.tsx
New INTERACTIVE_ROW_SELECTORS constant consolidates interactive-element selectors into a single comma-separated string; shouldIgnoreRowClick uses closest() with that list instead of hardcoded per-selector checks.
Local selector consolidation
web/packages/agenta-ui/src/InfiniteVirtualTable/hooks/useEntityTableState.ts
Entity table state derives default interactive selectors from the consolidated selector string instead of a hardcoded array.
Legacy implementation removal and re-sourcing
web/oss/src/components/EvaluationRunsTablePOC/actions/navigationActions.ts, web/oss/src/components/EvaluationRunsTablePOC/components/EvaluationRunsTable/index.tsx
Removes legacy shouldIgnoreRowClick and updates the EvaluationRunsTable to import it from the shared InfiniteVirtualTable.
Consumer table component adoption
web/oss/src/components/TestcasesTableNew/components/TestcasesTableShell.tsx, web/oss/src/components/pages/observability/components/ObservabilityTable/index.tsx, web/oss/src/components/pages/observability/components/SessionsTable/index.tsx, web/oss/src/components/pages/prompts/PromptsPage.tsx, web/packages/agenta-annotation-ui/src/components/AnnotationSession/ScenarioListView.tsx, web/packages/agenta-entity-ui/src/shared/EntityTable.tsx
Multiple table components import and use shouldIgnoreRowClick to conditionally suppress row interactions; one file consolidates React imports.

Evaluator navigation consolidation and UI fix

Layer / File(s) Summary
Unified evaluator playground routing
web/oss/src/components/SharedDrawers/TraceDrawer/hooks/useEvaluatorNavigation.ts
buildEvaluatorTarget routes all evaluator navigations through /evaluators/playground?revisions=... URL, with type classification still based on isHumanEvaluator.
Button label clarity
web/oss/src/components/SharedDrawers/TraceDrawer/components/EvaluatorDetailsPopover.tsx
Button text changed from "Open evaluator registry" to "Open evaluator playground" to match navigation destination.

Workspace member password reset feature

Layer / File(s) Summary
Password reset service endpoint
web/oss/src/services/profile/index.ts
New resetPassword(userId) function calls POST api/profile/reset-password with user_id query parameter and returns generated reset link string.
Reset password UI and workflow
web/oss/src/components/pages/settings/WorkspaceManage/cellRenderers.tsx
Actions component adds state for reset modals and link, imports modal components, defines handleResetPassword async handler, adds "Reset password" menu item with Key icon for non-self members, and renders both modals wired to handlers and state.

Python SDK LLM provider environment variable mapping

Layer / File(s) Summary
Provider kind to environment variable mapping
sdks/python/agenta/sdk/middlewares/running/vault.py
Introduces _PROVIDER_ENV_VAR_MAP constant mapping provider kinds to environment variable names and updates local secret lookup to use the mapping with a fallback to {PROVIDER}_API_KEY.

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs:

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning Many file changes are unrelated to issue #4535; they refactor shouldIgnoreRowClick into a shared utility, update error types across multiple modules, and add password reset functionality. Review whether the row-click refactoring, error type updates, and password reset features belong in this PR or should be split into separate focused pull requests aligned with their respective issues.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: fixing the evaluator button link to point to the playground in the trace drawer.
Description check ✅ Passed The description clearly explains the bug, root cause, and the fix applied, all related to the changeset.
Linked Issues check ✅ Passed The PR fixes issue #4535 by updating useEvaluatorNavigation.ts and EvaluatorDetailsPopover.tsx to redirect both human and automatic evaluators to the playground URL and updating button text accordingly.
Docstring Coverage ✅ Passed Docstring coverage is 75.00% which is sufficient. The required threshold is 60.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (2)
web/packages/agenta-entities/src/runnable/types.ts (1)

207-208: ⚡ Quick win

Align stage/row error contracts with the enriched execution error shape.

ExecutionResult.error now includes type and stacktrace, but StageExecutionResult.error and RowExecutionResult.error still omit them. This creates a type-boundary mismatch for chain/row consumers.

Suggested contract alignment
 export interface StageExecutionResult {
@@
     error?: {
         message: string
         code?: string
+        type?: string
+        stacktrace?: string
     }
@@
 }

 export interface RowExecutionResult {
@@
     error?: {
         message: string
         code?: string
+        type?: string
+        stacktrace?: string
     }
@@
 }
web/oss/src/components/InfiniteVirtualTable/hooks/useTableManager.tsx (1)

33-50: ⚡ Quick win

Avoid maintaining a second selector registry here.

This selector list duplicates web/packages/agenta-ui/src/InfiniteVirtualTable/hooks/useTableManager.tsx, so future drift can reintroduce inconsistent row-click behavior across tables. Prefer a single shared source (or re-export) for INTERACTIVE_ROW_SELECTORS.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9c72e940-75ba-4967-89d8-53fa47845fb4

📥 Commits

Reviewing files that changed from the base of the PR and between 98b8a9d and 691f759.

📒 Files selected for processing (22)
  • sdks/python/agenta/sdk/middlewares/running/vault.py
  • web/oss/src/components/EvalRunDetails/atoms/runInvocationAction.ts
  • web/oss/src/components/EvaluationRunsTablePOC/actions/navigationActions.ts
  • web/oss/src/components/EvaluationRunsTablePOC/components/EvaluationRunsTable/index.tsx
  • web/oss/src/components/InfiniteVirtualTable/hooks/useTableManager.tsx
  • web/oss/src/components/SharedDrawers/TraceDrawer/components/EvaluatorDetailsPopover.tsx
  • web/oss/src/components/SharedDrawers/TraceDrawer/hooks/useEvaluatorNavigation.ts
  • web/oss/src/components/TestcasesTableNew/components/TestcasesTableShell.tsx
  • web/oss/src/components/pages/observability/components/ObservabilityTable/index.tsx
  • web/oss/src/components/pages/observability/components/SessionsTable/index.tsx
  • web/oss/src/components/pages/prompts/PromptsPage.tsx
  • web/oss/src/components/pages/settings/WorkspaceManage/cellRenderers.tsx
  • web/oss/src/services/evaluations/invocations/api.ts
  • web/oss/src/services/profile/index.ts
  • web/packages/agenta-annotation-ui/src/components/AnnotationSession/ScenarioListView.tsx
  • web/packages/agenta-entities/src/runnable/types.ts
  • web/packages/agenta-entity-ui/src/shared/EntityTable.tsx
  • web/packages/agenta-playground/src/executeWorkflowRevision.ts
  • web/packages/agenta-playground/src/state/execution/executionRunner.ts
  • web/packages/agenta-playground/src/state/execution/types.ts
  • web/packages/agenta-ui/src/InfiniteVirtualTable/hooks/useEntityTableState.ts
  • web/packages/agenta-ui/src/InfiniteVirtualTable/hooks/useTableManager.tsx
💤 Files with no reviewable changes (1)
  • web/oss/src/components/EvaluationRunsTablePOC/actions/navigationActions.ts

Comment on lines +207 to +213
<GenerateResetLinkModal
open={generateResetLinkOpen}
username={user.username}
onCancel={() => setGenerateResetLinkOpen(false)}
onOk={handleResetPassword}
confirmLoading={resetLoading}
/>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Generate-link modal closes before async completion

Line 211 wires async generation correctly, but the modal currently calls onOk and then immediately onCancel in GenerateResetLinkModal (web/oss/src/components/pages/settings/WorkspaceManage/Modals/GenerateResetLinkModal.tsx:7-12). That makes confirmLoading at Line 212 ineffective and forces users to reopen the modal after failures.

Suggested fix (in GenerateResetLinkModal.tsx)
-const onGenerateLink = () => {
-    props.onOk?.({} as any)
-    props.onCancel?.({} as any)
-}
+const onGenerateLink = async () => {
+    try {
+        await props.onOk?.({} as any)
+        props.onCancel?.({} as any)
+    } catch {
+        // keep modal open so user can retry
+    }
+}

Comment on lines +64 to +70
export const resetPassword = async (userId: string): Promise<string> => {
const base = getBaseUrl()
const url = new URL("api/profile/reset-password", base)
url.searchParams.set("user_id", userId)
const data = await fetchJson<string>(url, {
method: "POST",
})
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Route this new API call through the Fern SDK client

Line 64 introduces a new frontend API call, but it bypasses the Fern-generated client and manual URL/query handling is used instead. Please switch this to getAgentaSdkClient({host: getAgentaApiUrl()}), pass user_id via queryParams, and validate the response at the boundary with safeParseWithLogging.

Suggested direction
-export const resetPassword = async (userId: string): Promise<string> => {
-    const base = getBaseUrl()
-    const url = new URL("api/profile/reset-password", base)
-    url.searchParams.set("user_id", userId)
-    const data = await fetchJson<string>(url, {
-        method: "POST",
-    })
-    return data
-}
+export const resetPassword = async (userId: string): Promise<string> => {
+    const client = getAgentaSdkClient({host: getAgentaApiUrl()})
+    const raw = await client.users.resetUserPassword(
+        {user_id: userId},
+        {queryParams: {user_id: userId}},
+    )
+    const parsed = safeParseWithLogging(/* zod string schema */, raw, "resetPassword")
+    if (!parsed.success) throw new Error("Invalid reset-password response")
+    return parsed.data
+}

As per coding guidelines: “All new frontend API code must go through the Fern-generated client, not raw axios”, “Use getAgentaSdkClient({host: getAgentaApiUrl()})”, “Pass query params via {queryParams: {...}}”, and “Keep zod validation at the boundary of API calls using safeParseWithLogging”.

Source: Coding guidelines

Comment on lines +64 to +72
export const resetPassword = async (userId: string): Promise<string> => {
const base = getBaseUrl()
const url = new URL("api/profile/reset-password", base)
url.searchParams.set("user_id", userId)
const data = await fetchJson<string>(url, {
method: "POST",
})
return data
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Promise<string> overstates the reset-password response contract

Line 64 assumes a guaranteed string return, but upstream service behavior can return no link when Sendgrid is configured (api/oss/src/services/user_service.py:130-170). This makes the current type/flow unsafe and can surface an empty/invalid link downstream.

Please align contract explicitly: either make backend always return a link string, or change frontend type/UX to handle “email sent, no link returned” as a separate success path.

Comment on lines +718 to +731
if (bodyStatus && typeof bodyStatus === "object" && bodyStatus.code && bodyStatus.code !== 200) {
const traceId = extractTraceIdFromPayload(responseData)
const spanId = extractSpanIdFromPayload(responseData)
const st = bodyStatus.stacktrace
return {
executionId,
status: "error",
startedAt,
completedAt: new Date().toISOString(),
error: {
message: bodyStatus.message || "Invocation failed",
...(bodyStatus.code ? {code: bodyStatus.code.toString()} : {}),
...(bodyStatus.type ? {type: bodyStatus.type} : {}),
...(st ? {stacktrace: Array.isArray(st) ? st.join("\n") : st} : {}),
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Normalize status.code before comparing to 200.

The current check treats "200" as failure because it compares directly against numeric 200. That can incorrectly route successful responses into the error path.

Suggested fix
-        const bodyStatus = responseData?.status
-        if (bodyStatus && typeof bodyStatus === "object" && bodyStatus.code && bodyStatus.code !== 200) {
+        const bodyStatus = responseData?.status as
+            | {code?: number | string; message?: string; type?: string; stacktrace?: string | string[]}
+            | undefined
+        const statusCode =
+            typeof bodyStatus?.code === "string" ? Number(bodyStatus.code) : bodyStatus?.code
+        if (statusCode !== undefined && Number.isFinite(statusCode) && statusCode !== 200) {
@@
-                    ...(bodyStatus.code ? {code: bodyStatus.code.toString()} : {}),
+                    ...(statusCode !== undefined ? {code: String(statusCode)} : {}),

@GanJiaKouN16 GanJiaKouN16 force-pushed the fix/evaluator-registry-button-link branch from 691f759 to 01a6e6d Compare June 6, 2026 15:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Bug Report Something isn't working Frontend size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Open evaluator registry button links incorrectly

2 participants