Add comprehensive API deployment for the TransportTrackerAgent (Agent 2): - GET/POST /api/agents/transport-tracker - Agent status and control (start/stop/run/pause/resume) - GET /api/agents/transport-tracker/analytics - Network stats and user-specific analytics - GET /api/agents/transport-tracker/patterns - Detected inefficiency patterns with filtering - GET /api/agents/transport-tracker/savings - Carbon savings vs conventional logistics Features: - Real-time agent status and metrics monitoring - User transport analysis with efficiency ratings - Pattern detection for high-carbon events and cold chain breaks - Carbon savings calculator with environmental equivalents
110 lines
4 KiB
TypeScript
110 lines
4 KiB
TypeScript
/**
|
|
* API Route: TransportTrackerAgent Pattern Detection
|
|
* GET /api/agents/transport-tracker/patterns - Get detected inefficiency patterns
|
|
*/
|
|
|
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
import { getTransportTrackerAgent } from '../../../../lib/agents/TransportTrackerAgent';
|
|
|
|
export default async function handler(
|
|
req: NextApiRequest,
|
|
res: NextApiResponse
|
|
) {
|
|
if (req.method !== 'GET') {
|
|
return res.status(405).json({ success: false, error: 'Method not allowed' });
|
|
}
|
|
|
|
try {
|
|
const agent = getTransportTrackerAgent();
|
|
const { severity, type } = req.query;
|
|
|
|
let patterns = agent.getPatterns();
|
|
|
|
// Filter by severity if provided
|
|
if (severity && typeof severity === 'string') {
|
|
const validSeverities = ['low', 'medium', 'high'];
|
|
if (!validSeverities.includes(severity)) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
error: `Invalid severity. Valid values: ${validSeverities.join(', ')}`
|
|
});
|
|
}
|
|
patterns = patterns.filter(p => p.severity === severity);
|
|
}
|
|
|
|
// Filter by type if provided
|
|
if (type && typeof type === 'string') {
|
|
const validTypes = ['inefficient_route', 'high_carbon', 'excessive_handling', 'cold_chain_break'];
|
|
if (!validTypes.includes(type)) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
error: `Invalid type. Valid values: ${validTypes.join(', ')}`
|
|
});
|
|
}
|
|
patterns = patterns.filter(p => p.type === type);
|
|
}
|
|
|
|
// Calculate summary statistics
|
|
const summary = {
|
|
total: patterns.length,
|
|
bySeverity: {
|
|
high: patterns.filter(p => p.severity === 'high').length,
|
|
medium: patterns.filter(p => p.severity === 'medium').length,
|
|
low: patterns.filter(p => p.severity === 'low').length
|
|
},
|
|
byType: {
|
|
inefficient_route: patterns.filter(p => p.type === 'inefficient_route').length,
|
|
high_carbon: patterns.filter(p => p.type === 'high_carbon').length,
|
|
excessive_handling: patterns.filter(p => p.type === 'excessive_handling').length,
|
|
cold_chain_break: patterns.filter(p => p.type === 'cold_chain_break').length
|
|
},
|
|
totalPotentialSavingsKg: patterns.reduce((sum, p) => sum + p.potentialSavingsKg, 0)
|
|
};
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: {
|
|
patterns,
|
|
summary,
|
|
recommendations: generatePatternRecommendations(patterns)
|
|
}
|
|
});
|
|
} catch (error: any) {
|
|
console.error('Error fetching transport patterns:', error);
|
|
res.status(500).json({ success: false, error: error.message || 'Internal server error' });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Generate actionable recommendations based on detected patterns
|
|
*/
|
|
function generatePatternRecommendations(patterns: any[]): string[] {
|
|
const recommendations: string[] = [];
|
|
|
|
const highCarbonCount = patterns.filter(p => p.type === 'high_carbon').length;
|
|
const excessiveHandlingCount = patterns.filter(p => p.type === 'excessive_handling').length;
|
|
const coldChainBreaks = patterns.filter(p => p.type === 'cold_chain_break').length;
|
|
|
|
if (highCarbonCount > 3) {
|
|
recommendations.push('Multiple high-carbon transport events detected. Consider implementing a fleet electrification program or partnering with eco-friendly logistics providers.');
|
|
}
|
|
|
|
if (excessiveHandlingCount > 2) {
|
|
recommendations.push('Products are being handled too many times. Review supply chain to consolidate shipments and reduce touchpoints.');
|
|
}
|
|
|
|
if (coldChainBreaks > 0) {
|
|
recommendations.push('Cold chain integrity issues detected. Implement temperature monitoring IoT devices and establish clear handoff protocols.');
|
|
}
|
|
|
|
const totalSavings = patterns.reduce((sum, p) => sum + p.potentialSavingsKg, 0);
|
|
if (totalSavings > 100) {
|
|
recommendations.push(`Addressing detected patterns could save approximately ${totalSavings.toFixed(1)} kg of CO2 emissions.`);
|
|
}
|
|
|
|
if (recommendations.length === 0) {
|
|
recommendations.push('Transport patterns look healthy. Continue monitoring for optimization opportunities.');
|
|
}
|
|
|
|
return recommendations;
|
|
}
|