/** * Optimization Panel (Feature 17 — Story 17.15) * * Main container for the Optimization tab in LLM Analytics. * Fetches enhanced recommendations and renders SavingsSummary + RecommendationCards. */ import React from 'react'; import { useApi } from '../../hooks/useApi'; import { request, toQueryString } from '../../api/core'; import type { EnhancedOptimizationResult } from '@agentkitai/agentlens-core'; import { SavingsSummary } from './SavingsSummary'; import { RecommendationCard } from './RecommendationCard'; interface OptimizationPanelProps { agentId?: string; } async function getEnhancedRecommendations(params?: { agentId?: string; period?: number; limit?: number; }): Promise { const qs = toQueryString({ enhanced: 'true', agentId: params?.agentId, period: params?.period, limit: params?.limit, }); return request(`/api/optimize/recommendations${qs}`); } export function OptimizationPanel({ agentId }: OptimizationPanelProps): React.ReactElement { const { data, loading, error, refetch } = useApi( () => getEnhancedRecommendations({ agentId, period: 30, limit: 20 }), [agentId], ); if (loading && !data) { return (
); } if (error) { return (
Error loading optimization data: {error}
); } if (!data || data.recommendations.length === 0) { return (

No recommendations

No cost optimization opportunities found. This could mean your LLM usage is already efficient, or there isn't enough data yet. Check back after more calls are recorded.

); } return (

Recommendations ({data.recommendations.length})

{data.recommendations.map((rec) => ( ))}
); }