Appearance
Working Without the Assistant Wrapper
If you prefer to work directly with the SDK's event and action system without using the AiFlowAssistant wrapper, you can manually handle events and construct actions.
Direct Event Handling
Here's how to handle events and construct actions without the assistant wrapper:
typescript
import express from "express";
import { AiFlowEventType, AiFlowActionType } from "@sipgate/ai-flow-sdk";
const app = express();
app.use(express.json());
app.post("/webhook", async (req, res) => {
const event = req.body;
let action = null;
switch (event.type) {
case "session_start":
action = {
type: AiFlowActionType.SPEAK,
session_id: event.session.id,
text: "Welcome to our service!",
barge_in: {
strategy: "minimum_characters",
minimum_characters: 5,
},
};
break;
case "user_speak":
// Check if user interrupted (barge-in)
if (event.barged_in) {
console.log(`User interrupted with: ${event.text}`);
action = {
type: AiFlowActionType.SPEAK,
session_id: event.session.id,
text: "I'm listening, go ahead.",
};
break;
}
// Normal user speech handling
if (event.text.toLowerCase().includes("transfer")) {
action = {
type: AiFlowActionType.TRANSFER,
session_id: event.session.id,
target_phone_number: "+1234567890",
caller_id_name: "Support",
caller_id_number: "+1234567890",
};
} else if (event.text.toLowerCase().includes("goodbye")) {
action = {
type: AiFlowActionType.HANGUP,
session_id: event.session.id,
};
} else {
action = {
type: AiFlowActionType.SPEAK,
session_id: event.session.id,
text: `You said: ${event.text}`,
};
}
break;
case "assistant_speak":
console.log(`Spoke for ${event.duration_ms}ms`);
// Optional: track metrics, no action needed
break;
case "session_end":
console.log(`Session ${event.session.id} ended`);
// Cleanup logic, no action needed
break;
}
// Return action if one was created
if (action) {
res.json(action);
} else {
res.status(204).send();
}
});
app.listen(3000, () => {
console.log("Webhook server listening on port 3000");
});Benefits of Direct Integration
- Full Control - Complete control over event handling
- Custom Logic - Easier to implement complex routing logic
- No Abstraction - Direct access to events and actions
- Flexibility - Can integrate with any framework or system
When to Use Direct Integration
Use direct integration when:
- You need custom event processing logic
- You're integrating with a non-standard framework
- You want to implement your own state management
- You need fine-grained control over responses
Next Steps
- Complete Event Reference - All event types
- Complete Action Reference - All action types
- Validation with Zod - Runtime validation