Support Triage
foundationprotocolFoundation + 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"]
}