diff --git a/apps/opik-frontend/src/plugins/comet/AssistantSidebar.tsx b/apps/opik-frontend/src/plugins/comet/AssistantSidebar.tsx index f4705a60a23..37a002dc59a 100644 --- a/apps/opik-frontend/src/plugins/comet/AssistantSidebar.tsx +++ b/apps/opik-frontend/src/plugins/comet/AssistantSidebar.tsx @@ -27,9 +27,11 @@ import useRunnerBridgeSync from "@/hooks/useRunnerBridgeSync"; import { BASE_API_URL } from "@/api/api"; import { Spinner } from "@/ui/spinner"; import AssistantErrorState from "@/plugins/comet/AssistantErrorState"; +import { + ASSISTANT_DEV_BASE_URL, + IS_ASSISTANT_DEV, +} from "@/plugins/comet/constants/assistant"; -const DEV_BASE_URL = import.meta.env.VITE_ASSISTANT_SIDEBAR_BASE_URL; -const IS_DEV = import.meta.env.DEV; const BRIDGE_PROTOCOL_VERSION = 1; const LOADER_DEFAULT_WIDTH = 400; @@ -219,7 +221,7 @@ const createBridge = (refs: BridgeRefs): AssistantSidebarBridge => ({ ); break; default: - if (IS_DEV) { + if (IS_ASSISTANT_DEV) { console.warn( `[AssistantBridge] Unhandled sidebar event: "${event}"`, data, @@ -298,7 +300,7 @@ interface AssistantMeta { } function resolveManifestUrl(backendUrl: string | null): string | null { - if (DEV_BASE_URL) return `${DEV_BASE_URL}/manifest.json`; + if (ASSISTANT_DEV_BASE_URL) return `${ASSISTANT_DEV_BASE_URL}/manifest.json`; if (backendUrl) return `${backendUrl}/console/manifest.json`; return null; } @@ -326,16 +328,16 @@ function useAssistantMeta(backendUrl: string | null): AssistantMeta | null { return { scriptUrl: `${manifestBase}/${manifest.js}`, cssUrl: manifest.css ? `${manifestBase}/${manifest.css}` : undefined, - shellUrl: `${manifestBase}/${manifest.shell}`, + shellUrl: `/assistant/${manifest.shell}`, version: manifest.ver, }; }, - enabled: !(IS_DEV && DEV_BASE_URL) && !!manifestUrl, + enabled: !IS_ASSISTANT_DEV && !!manifestUrl, staleTime: Infinity, retry: 1, }); - if (IS_DEV && DEV_BASE_URL) return DEV_META; + if (IS_ASSISTANT_DEV) return DEV_META; return data ?? null; } diff --git a/apps/opik-frontend/src/plugins/comet/constants/assistant.ts b/apps/opik-frontend/src/plugins/comet/constants/assistant.ts new file mode 100644 index 00000000000..89b61154abf --- /dev/null +++ b/apps/opik-frontend/src/plugins/comet/constants/assistant.ts @@ -0,0 +1,4 @@ +export const ASSISTANT_DEV_BASE_URL = + (import.meta.env.VITE_ASSISTANT_SIDEBAR_BASE_URL as string) ?? ""; + +export const IS_ASSISTANT_DEV = ASSISTANT_DEV_BASE_URL !== ""; diff --git a/apps/opik-frontend/src/plugins/comet/useAssistantBackend.ts b/apps/opik-frontend/src/plugins/comet/useAssistantBackend.ts index c9150b2df8e..26cf5dee293 100644 --- a/apps/opik-frontend/src/plugins/comet/useAssistantBackend.ts +++ b/apps/opik-frontend/src/plugins/comet/useAssistantBackend.ts @@ -2,8 +2,8 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import cometApi from "@/plugins/comet/api"; import { useActiveWorkspaceName } from "@/store/AppStore"; +import { IS_ASSISTANT_DEV } from "@/plugins/comet/constants/assistant"; -const IS_DEV = import.meta.env.DEV; const HEALTH_POLL_INTERVAL_MS = 5000; const HEALTH_POLL_TIMEOUT_MS = 2 * 60 * 1000; // 2 minutes const HEALTH_KEEPALIVE_MS = 30_000; // 30s keepalive after ready @@ -92,14 +92,14 @@ export default function useAssistantBackend( ); return { baseUrl, enabled: true }; }, - enabled: !IS_DEV && configEnabled && !!workspaceName, + enabled: !IS_ASSISTANT_DEV && configEnabled && !!workspaceName, staleTime: Infinity, retry: 2, }); const baseUrl = computeResult?.baseUrl ?? null; const computeEnabled = computeResult?.enabled ?? false; - const shouldPollHealth = !IS_DEV && !!baseUrl && computeEnabled; + const shouldPollHealth = !IS_ASSISTANT_DEV && !!baseUrl && computeEnabled; // Track when health polling started — only reset when baseUrl changes // (not on transient shouldPollHealth flickers) @@ -218,8 +218,8 @@ export default function useAssistantBackend( queueMicrotask(() => resetBackend()); } - // Dev mode — static URL, no network calls (queries are disabled via enabled: !IS_DEV) - if (IS_DEV) return DEV_RESULT; + // Dev mode or local override — static URL, no network calls + if (IS_ASSISTANT_DEV) return DEV_RESULT; if (computeResult && !computeResult.enabled) return notReadyResult(null, "disabled", retry, retryCount);