diff --git a/server/src/adapters/registry.ts b/server/src/adapters/registry.ts index 0314c435..3db7cdf9 100644 --- a/server/src/adapters/registry.ts +++ b/server/src/adapters/registry.ts @@ -227,7 +227,7 @@ export function listServerAdapters(): ServerAdapterModule[] { export async function detectAdapterModel( type: string, -): Promise<{ model: string | null; provider: string | null; source: string | null } | null> { +): Promise<{ model: string; provider: string; source: string } | null> { const adapter = adaptersByType.get(type); if (!adapter?.detectModel) return null; const detected = await adapter.detectModel(); diff --git a/server/src/routes/agents.ts b/server/src/routes/agents.ts index e414fca6..b4964578 100644 --- a/server/src/routes/agents.ts +++ b/server/src/routes/agents.ts @@ -677,7 +677,7 @@ export function agentRoutes(db: Db) { const type = req.params.type as string; const detected = await detectAdapterModel(type); - res.json(detected ?? { model: null, provider: null, source: null }); + res.json(detected); }); router.post( diff --git a/ui/src/api/agents.ts b/ui/src/api/agents.ts index b81a59e9..ec090b43 100644 --- a/ui/src/api/agents.ts +++ b/ui/src/api/agents.ts @@ -28,9 +28,9 @@ export interface AdapterModel { } export interface DetectedAdapterModel { - model: string | null; - provider: string | null; - source: string | null; + model: string; + provider: string; + source: string; } export interface ClaudeLoginResult { @@ -166,7 +166,7 @@ export const agentsApi = { `/companies/${encodeURIComponent(companyId)}/adapters/${encodeURIComponent(type)}/models`, ), detectModel: (companyId: string, type: string) => - api.get( + api.get( `/companies/${encodeURIComponent(companyId)}/adapters/${encodeURIComponent(type)}/detect-model`, ), testEnvironment: ( diff --git a/ui/src/components/AgentConfigForm.tsx b/ui/src/components/AgentConfigForm.tsx index 3b586642..b9781a05 100644 --- a/ui/src/components/AgentConfigForm.tsx +++ b/ui/src/components/AgentConfigForm.tsx @@ -757,6 +757,7 @@ export function AgentConfigForm(props: AgentConfigFormProps) { return result.data?.model ?? null; } : undefined} + detectModelLabel={adapterType === "hermes_local" ? "Detect from Hermes config" : undefined} /> {fetchedModelsError && (

@@ -1341,6 +1342,7 @@ function ModelDropdown({ creatable, detectedModel, onDetectModel, + detectModelLabel, }: { models: AdapterModel[]; value: string; @@ -1353,6 +1355,7 @@ function ModelDropdown({ creatable?: boolean; detectedModel?: string | null; onDetectModel?: () => Promise; + detectModelLabel?: string; }) { const [modelSearch, setModelSearch] = useState(""); const [detectingModel, setDetectingModel] = useState(false); @@ -1440,6 +1443,7 @@ function ModelDropdown({ placeholder={creatable ? "Search models... (type to create)" : "Search models..."} value={modelSearch} onChange={(e) => setModelSearch(e.target.value)} + autoFocus /> {modelSearch && ( )} {value && !models.some((m) => m.id === value) && ( diff --git a/ui/src/pages/AgentDetail.tsx b/ui/src/pages/AgentDetail.tsx index e2800642..3e19d294 100644 --- a/ui/src/pages/AgentDetail.tsx +++ b/ui/src/pages/AgentDetail.tsx @@ -1086,7 +1086,7 @@ function LatestRunCard({ runs, agentId }: { runs: HeartbeatRun[]; agentId: strin .replace(/^#{1,6}\s+/gm, "") .split("\n") .map((l) => l.trim()) - .filter((l) => l.length > 0 && !l.startsWith("---") && !l.startsWith("|") && !l.startsWith("```")); + .filter((l) => l.length > 0 && !l.startsWith("---") && !l.startsWith("|") && !l.startsWith("```") && !/^[-*>]/.test(l) && !/^\d+\./.test(l)); const excerpt: string[] = []; let chars = 0; for (const line of lines) {