Skip to main content

Overview

Logistics operations assistant integrating with multiple shipping carrier APIs (UPS, FedEx, USPS) for unified package tracking. What it does:
  • Track packages across all carriers
  • Get delivery estimates
  • Schedule pickups
  • Compare shipping rates
  • Handle delivery exceptions
APIs used: UPS API, FedEx API, USPS API (all external)

Complete Implementation

src/index.ts

import { LuaAgent, LuaSkill } from "lua-cli";
import {
  TrackPackageTool,
  CompareRatesTool,
  SchedulePickupTool
} from "./tools/LogisticsTools";

// Logistics operations skill
const logisticsSkill = new LuaSkill({
  name: "logistics-operations",
  description: "Multi-carrier shipping and tracking operations",
  context: `
    This skill helps track shipments across multiple carriers.
    
    - track_package: Track package across UPS, FedEx, or USPS
    - compare_rates: Compare shipping rates between carriers
    - schedule_pickup: Schedule package pickup
    
    Auto-detect carrier from tracking number when possible.
    Provide detailed tracking history.
    Alert for delivery exceptions.
  `,
  tools: [
    new TrackPackageTool(),
    new CompareRatesTool(),
    new SchedulePickupTool()
  ]
});

// Configure agent (v3.0.0)
export const agent = new LuaAgent({
  name: "logistics-operations-assistant",
  
  persona: `You are an efficient logistics operations specialist.
  
Your role:
- Track packages across multiple carriers
- Provide shipping status updates
- Compare carrier rates
- Schedule pickups
- Handle delivery exceptions

Communication style:
- Clear and concise
- Proactive with updates
- Detail-oriented
- Responsive to urgent requests

Best practices:
- Auto-detect carrier from tracking numbers
- Provide estimated delivery dates
- Alert for delivery exceptions or delays
- Offer alternative carriers for better rates
- Include tracking history details
- Suggest optimal shipping methods

Carrier knowledge:
- UPS: Express, Ground, International
- FedEx: Overnight, 2-Day, Ground
- USPS: Priority, First-Class, Media Mail
- Delivery timeframes and coverage

When to escalate:
- Lost or damaged packages
- International customs issues
- High-value shipments
- Complex routing requirements`,

  
  skills: [logisticsSkill]
});
v3.0.0 Pattern: This demo now uses LuaAgent to configure the agent’s persona, welcome message, and skills.

src/tools/LogisticsTools.ts

import { LuaTool, env } from "lua-cli";
import { z } from "zod";

// 1. Track Package (Multi-Carrier)
export class TrackPackageTool implements LuaTool {
  name = "track_package";
  description = "Track package across UPS, FedEx, or USPS";
  
  inputSchema = z.object({
    trackingNumber: z.string(),
    carrier: z.enum(['ups', 'fedex', 'usps', 'auto']).default('auto')
  });

  async execute(input: z.infer<typeof this.inputSchema>) {
    // Auto-detect carrier if not specified
    const carrier = input.carrier === 'auto' 
      ? this.detectCarrier(input.trackingNumber)
      : input.carrier;
    
    switch (carrier) {
      case 'ups':
        return await this.trackUPS(input.trackingNumber);
      case 'fedex':
        return await this.trackFedEx(input.trackingNumber);
      case 'usps':
        return await this.trackUSPS(input.trackingNumber);
      default:
        throw new Error('Unable to detect carrier');
    }
  }
  
  private detectCarrier(trackingNumber: string): string {
    // UPS: 1Z followed by 16 alphanumeric
    if (/^1Z[0-9A-Z]{16}$/i.test(trackingNumber)) return 'ups';
    
    // FedEx: 12 or 14 digits
    if (/^\d{12}$|^\d{14}$/.test(trackingNumber)) return 'fedex';
    
    // USPS: 20-22 digits
    if (/^\d{20,22}$/.test(trackingNumber)) return 'usps';
    
    return 'auto';
  }
  
  private async trackUPS(trackingNumber: string) {
    const upsKey = env('UPS_API_KEY');
    
    const response = await fetch('https://onlinetools.ups.com/api/track/v1/details/' + trackingNumber, {
      headers: {
        'Authorization': `Bearer ${upsKey}`,
        'Accept': 'application/json'
      }
    });
    
    const data = await response.json();
    const shipment = data.trackResponse.shipment[0];
    
    return {
      carrier: 'UPS',
      trackingNumber,
      status: shipment.package[0].currentStatus.description,
      location: shipment.package[0].currentStatus.location,
      estimatedDelivery: shipment.package[0].deliveryDate[0].date,
      events: shipment.package[0].activity.map(a => ({
        date: a.date,
        time: a.time,
        status: a.status.description,
        location: a.location?.address?.city
      }))
    };
  }
  
  private async trackFedEx(trackingNumber: string) {
    const fedexKey = env('FEDEX_API_KEY');
    
    const response = await fetch('https://apis.fedex.com/track/v1/trackingnumbers', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${fedexKey}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        trackingInfo: [{
          trackingNumberInfo: { trackingNumber }
        }],
        includeDetailedScans: true
      })
    });
    
    const data = await response.json();
    const trackInfo = data.output.completeTrackResults[0].trackResults[0];
    
    return {
      carrier: 'FedEx',
      trackingNumber,
      status: trackInfo.latestStatusDetail.description,
      location: trackInfo.latestStatusDetail.scanLocation?.city,
      estimatedDelivery: trackInfo.estimatedDeliveryTime,
      events: trackInfo.scanEvents.map(e => ({
        date: e.date,
        status: e.eventDescription,
        location: e.scanLocation?.city
      }))
    };
  }
  
  private async trackUSPS(trackingNumber: string) {
    const uspsKey = env('USPS_USER_ID');
    
    const xml = `<TrackRequest USERID="${uspsKey}"><TrackID ID="${trackingNumber}"></TrackID></TrackRequest>`;
    
    const response = await fetch(
      `https://secure.shippingapis.com/ShippingAPI.dll?API=TrackV2&XML=${encodeURIComponent(xml)}`
    );
    
    const text = await response.text();
    // Parse XML response
    const parser = new DOMParser();
    const doc = parser.parseFromString(text, 'text/xml');
    
    return {
      carrier: 'USPS',
      trackingNumber,
      status: doc.querySelector('Status')?.textContent,
      location: doc.querySelector('EventCity')?.textContent,
      estimatedDelivery: doc.querySelector('ExpectedDeliveryDate')?.textContent
    };
  }
}

// 2. Compare Shipping Rates
export class CompareRatesTool implements LuaTool {
  name = "compare_shipping_rates";
  description = "Compare shipping rates across carriers";
  
  inputSchema = z.object({
    originZip: z.string(),
    destinationZip: z.string(),
    weight: z.number().describe("Weight in pounds"),
    dimensions: z.object({
      length: z.number(),
      width: z.number(),
      height: z.number()
    })
  });

  async execute(input: z.infer<typeof this.inputSchema>) {
    // Get rates from all carriers
    const upsRate = await this.getUPSRate(input);
    const fedexRate = await this.getFedExRate(input);
    const uspsRate = await this.getUSPSRate(input);
    
    const rates = [upsRate, fedexRate, uspsRate].sort((a, b) => a.cost - b.cost);
    
    return {
      rates: rates.map(r => ({
        carrier: r.carrier,
        service: r.service,
        cost: `$${r.cost.toFixed(2)}`,
        estimatedDays: r.estimatedDays,
        delivery: r.estimatedDelivery
      })),
      cheapest: rates[0].carrier,
      fastest: rates.reduce((prev, curr) => 
        curr.estimatedDays < prev.estimatedDays ? curr : prev
      ).carrier
    };
  }
  
  private async getUPSRate(input: any) {
    // UPS Rating API call
    return {
      carrier: 'UPS',
      service: 'Ground',
      cost: 12.50,
      estimatedDays: 5,
      estimatedDelivery: new Date(Date.now() + 5 * 24 * 60 * 60 * 1000).toISOString().split('T')[0]
    };
  }
  
  private async getFedExRate(input: any) {
    // FedEx Rating API call
    return {
      carrier: 'FedEx',
      service: 'Home Delivery',
      cost: 14.25,
      estimatedDays: 4,
      estimatedDelivery: new Date(Date.now() + 4 * 24 * 60 * 60 * 1000).toISOString().split('T')[0]
    };
  }
  
  private async getUSPSRate(input: any) {
    // USPS Rating API call
    return {
      carrier: 'USPS',
      service: 'Priority Mail',
      cost: 9.99,
      estimatedDays: 3,
      estimatedDelivery: new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString().split('T')[0]
    };
  }
}

// 3. Schedule Pickup
export class SchedulePickupTool implements LuaTool {
  name = "schedule_pickup";
  description = "Schedule package pickup with carrier";
  
  inputSchema = z.object({
    carrier: z.enum(['ups', 'fedex']),
    pickupDate: z.string(),
    pickupTime: z.string(),
    packageCount: z.number(),
    address: z.object({
      street: z.string(),
      city: z.string(),
      state: z.string(),
      zip: z.string()
    })
  });

  async execute(input: z.infer<typeof this.inputSchema>) {
    const apiKey = input.carrier === 'ups' 
      ? env('UPS_API_KEY')
      : env('FEDEX_API_KEY');
    
    // Schedule pickup with carrier
    const response = await fetch(`https://${input.carrier}-api.com/pickup/schedule`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${apiKey}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        pickup_date: input.pickupDate,
        ready_time: input.pickupTime,
        package_count: input.packageCount,
        pickup_address: input.address
      })
    });
    
    const data = await response.json();
    
    return {
      success: true,
      confirmationNumber: data.confirmation_number,
      carrier: input.carrier.toUpperCase(),
      pickupDate: input.pickupDate,
      pickupTime: input.pickupTime,
      message: `Pickup scheduled with ${input.carrier.toUpperCase()} for ${input.pickupDate}`
    };
  }
}

Environment Setup

# .env
UPS_API_KEY=your_ups_api_key
FEDEX_API_KEY=your_fedex_api_key
USPS_USER_ID=your_usps_user_id

Key Features

Multi-Carrier

UPS, FedEx, USPS

Auto-Detection

Detect carrier from tracking#

Rate Comparison

Compare shipping costs

Real-Time

Live tracking data