Support Triage

foundationprotocol

Foundation + Protocol composing to classify and summarize a support ticket using structured AI output.

Step 1 — AI Adapter Prompt

Foundation's AI adapter sends the raw ticket text to the LLM and receives a prose response.

typescript
// foundation/ai/adapter.ts
import { AIAdapter } from "foundation/ai/adapter";

const adapter = new AIAdapter({ model: "gpt-4o-mini" });

const response = await adapter.complete({
  system: "You are a support triage assistant. Classify and summarize the ticket.",
  user: ticketText,
});

console.log(response.prose);
output
The customer is reporting a billing discrepancy on their January invoice.
They were charged $149 for the Pro tier but expected $99 based on a promotional
rate applied at signup. The account is in good standing and the customer has
been with us for 14 months. Urgency appears moderate — no service disruption,
but the customer is frustrated and has asked for a callback within 24 hours.
Recommended action: escalate to billing team with priority P2.

Step 2 — Protocol Output Parser

Protocol's output parser extracts structured JSON from the LLM prose using a fence-first strategy.

typescript
// protocol/output/parser.ts
import { extractJSON } from "protocol/output/parser";

const structured = extractJSON(response.prose, {
  schema: SupportSummarySchema,
  strategy: "fence-first",
});

console.log(JSON.stringify(structured, null, 2));
output
{
  "category": "billing",
  "priority": "P2",
  "sentiment": "frustrated",
  "summary": "Customer charged $149 instead of promotional $99 rate.",
  "recommendedAction": "Escalate to billing team",
  "callbackRequired": true,
  "callbackDeadlineHours": 24
}

Step 3 — Protocol Schema Validator

Protocol's schema validator confirms the extracted object matches the SupportSummary contract.

typescript
// protocol/schema/validator.ts
import { validate } from "protocol/schema/validator";
import { SupportSummarySchema } from "protocol/schemas/support";

const result = validate(structured, SupportSummarySchema);

console.log("valid:", result.valid);
console.log("errors:", result.errors);
output
valid: true
errors: []

Final Result — Structured Support Summary

The complete validated support summary ready for downstream routing and storage.

typescript
// Composed pipeline result
const ticket = await triageTicket(rawTicketText);

console.log(ticket);
output
{
  "ticketId": "TKT-20481",
  "category": "billing",
  "priority": "P2",
  "sentiment": "frustrated",
  "summary": "Customer charged $149 instead of promotional $99 rate.",
  "recommendedAction": "Escalate to billing team",
  "callbackRequired": true,
  "callbackDeadlineHours": 24,
  "processedAt": "2025-01-15T10:32:00Z",
  "pipeline": ["foundation/ai", "protocol/parser", "protocol/validator"]
}