Zendesk
The Zendesk integration enables your Minded agents to seamlessly interact with Zendesk tickets, conversations, and customer data. This integration provides a complete interface for building intelligent customer support agents that can handle ticket management, customer communication, and workflow automation.
Overview
The Zendesk integration provides:
Ticket Management - Create, update, and manage ticket status
Customer Communication - Send messages and comments
Conversation Handling - Access conversation history and context
Tag Management - Add and manage ticket tags
Custom Fields - Set and update custom field values
Search Capabilities - Search tickets and conversations
Real-time Updates - Receive and respond to Zendesk events
Quick Start
1. Basic Setup
import { Agent } from '@minded/sdk';
import { zendesk } from '@minded/sdk/interfaces/zendesk';
import { events } from '@minded/sdk';
const agent = new Agent({
memorySchema: yourMemorySchema,
config: mindedConfig,
tools: yourTools,
});
// Initialize Zendesk interface
zendesk.init(agent);
// Handle AI messages - send them to Zendesk
agent.on(events.AI_MESSAGE, async ({ message, state }) => {
await zendesk.sendMessage(state.sessionId!, message);
});
2. Trigger Configuration
Configure your flow with a Zendesk trigger:
# flows/zendeskFlow.yaml
name: Zendesk Support Flow
nodes:
- name: Zendesk-Trigger
type: trigger
triggerType: app
appTriggerId: zendesk-interface
appTriggerName: Zendesk Minded Conversation
appName: Zendesk
- name: Support-Agent
type: promptNode
prompt: |
You are a helpful customer support agent.
Respond to the customer's inquiry professionally and helpfully.
edges:
- source: Zendesk-Trigger
target: Support-Agent
type: stepForward
Available Methods
Core Communication
sendMessage(sessionId: string, message: string)
sendMessage(sessionId: string, message: string)
Send a message to the customer in the Zendesk conversation.
await zendesk.sendMessage(sessionId, 'Hello! How can I help you today?');
sendComment(sessionId: string, comment: string)
sendComment(sessionId: string, comment: string)
Add an internal comment to the ticket (not visible to customer).
await zendesk.sendComment(sessionId, 'Customer issue escalated to tier 2');
sendPublicComment(sessionId: string, comment: string)
sendPublicComment(sessionId: string, comment: string)
Add a public comment to the ticket (visible to customer).
await zendesk.sendPublicComment(sessionId, 'Issue resolved - closing ticket');
Conversation Management
getConversation(sessionId: string)
getConversation(sessionId: string)
Retrieve the complete conversation context.
const conversation = await zendesk.getConversation(sessionId);
console.log(conversation);
getConversationMessages(sessionId: string)
getConversationMessages(sessionId: string)
Get all messages in the conversation.
const messages = await zendesk.getConversationMessages(sessionId);
Ticket Operations
getTicket(sessionId: string)
getTicket(sessionId: string)
Retrieve ticket information and metadata.
const ticket = await zendesk.getTicket(sessionId);
console.log(`Ticket status: ${ticket.status}`);
createTicket(params)
createTicket(params)
Create a new ticket with specified parameters.
await zendesk.createTicket({
sessionId: sessionId,
subject: 'Customer inquiry about order #12345',
ticketBody: 'Customer is asking about their order status',
priority: 'normal',
tags: ['order-inquiry', 'customer-support'],
customFields: [
{ id: 123, value: 'urgent' },
{ id: 456, value: 'premium-customer' },
],
});
markTicketAsSolved(sessionId: string)
markTicketAsSolved(sessionId: string)
Mark a ticket as solved.
await zendesk.markTicketAsSolved({ sessionId });
markTicketAsOpen(sessionId: string)
markTicketAsOpen(sessionId: string)
Reopen a closed ticket.
await zendesk.markTicketAsOpen({ sessionId });
Tag and Field Management
addTag(sessionId: string, tag: string)
addTag(sessionId: string, tag: string)
Add a tag to the ticket.
await zendesk.addTag(sessionId, 'escalated');
setCustomFields(sessionId: string, fields: any[])
setCustomFields(sessionId: string, fields: any[])
Set custom field values on the ticket.
await zendesk.setCustomFields({
sessionId,
fields: [
{ id: 123, value: 'high-priority' },
{ id: 456, value: 'technical-issue' },
],
});
search(sessionId: string, query: string)
search(sessionId: string, query: string)
Search tickets and conversations.
const results = await zendesk.search({
sessionId,
query: 'customer:[email protected] status:open',
});
Complete Example
Here's a comprehensive example of a Zendesk customer support agent:
Project Structure
zendesk-agent/
├── minded.json
├── schema.ts
├── zendeskAgent.ts
├── flows/
│ └── supportFlow.yaml
└── tools/
├── escalateIssue.ts
├── lookupOrder.ts
└── index.ts
Configuration
minded.json
:
{
"flows": ["./flows"],
"tools": ["./tools"],
"agent": "./zendeskAgent.ts",
"llm": {
"name": "AzureChatOpenAI",
"properties": {
"model": "gpt-4o",
"temperature": 0.7
}
}
}
Memory Schema
schema.ts
:
import { z } from 'zod';
export default z.object({
// Customer information
customerName: z.string().optional(),
customerEmail: z.string().optional(),
customerId: z.string().optional(),
// Issue tracking
issueType: z.enum(['billing', 'technical', 'general', 'escalation']).optional(),
issueDescription: z.string().optional(),
priority: z.enum(['low', 'normal', 'high', 'urgent']).optional(),
// Ticket information
ticketId: z.string().optional(),
ticketStatus: z.string().optional(),
ticketTags: z.array(z.string()).optional(),
// Resolution tracking
resolution: z.string().optional(),
resolved: z.boolean().optional(),
escalated: z.boolean().optional(),
// Conversation context
conversationStage: z.enum(['greeting', 'information_gathering', 'issue_resolution', 'closing']).optional(),
});
Agent Implementation
zendeskAgent.ts
:
import { Agent } from '@minded/sdk';
import { zendesk } from '@minded/sdk/interfaces/zendesk';
import { events } from '@minded/sdk';
import { HumanMessage } from '@langchain/core/messages';
import memorySchema from './schema';
import tools from './tools';
import mindedConfig from './minded.json';
const agent = new Agent({
memorySchema,
config: mindedConfig,
tools,
});
// Initialize Zendesk interface
zendesk.init(agent);
// Handle AI messages
agent.on(events.AI_MESSAGE, async ({ message, state }) => {
await zendesk.sendMessage(state.sessionId!, message);
});
// Handle trigger events from Zendesk
agent.on(events.TRIGGER_EVENT, async ({ triggerBody, sessionId }) => {
// Qualify the trigger and set initial context
const isValidTrigger = triggerBody.content && triggerBody.content.trim().length > 0;
if (!isValidTrigger) {
return { isQualified: false };
}
return {
isQualified: true,
messages: [new HumanMessage({ content: triggerBody.content })],
sessionId,
memory: {
conversationStage: 'greeting',
customerEmail: triggerBody.customerEmail,
ticketId: triggerBody.ticketId,
},
};
});
// Handle escalation events
agent.on(events.MEMORY_UPDATE, async ({ memory, state }) => {
if (memory.escalated && !memory.resolved) {
await zendesk.addTag(state.sessionId!, 'escalated');
await zendesk.sendComment(state.sessionId!, `Issue escalated: ${memory.issueDescription}`);
}
});
export default agent;
Flow Definition
flows/supportFlow.yaml
:
name: Zendesk Support Flow
nodes:
- name: Zendesk-Trigger
type: trigger
triggerType: app
appTriggerId: zendesk-interface
appTriggerName: Zendesk Minded Conversation
appName: Zendesk
- name: Support-Agent
type: promptNode
prompt: |
You are a professional customer support agent.
Customer Context:
- Email: {{memory.customerEmail}}
- Issue Type: {{memory.issueType}}
- Priority: {{memory.priority}}
- Stage: {{memory.conversationStage}}
Guidelines:
1. Be empathetic and professional
2. Gather necessary information about the issue
3. Provide clear solutions or next steps
4. Escalate complex issues when needed
5. Always confirm resolution before closing
If this is the first interaction, greet the customer and ask about their issue.
- name: Escalate-Issue
type: tool
toolName: escalateIssue
- name: Resolve-Issue
type: promptNode
prompt: |
The issue has been resolved. Please:
1. Summarize the solution provided
2. Ask if the customer needs anything else
3. Thank them for their patience
edges:
- source: Zendesk-Trigger
target: Support-Agent
type: stepForward
- source: Support-Agent
target: Escalate-Issue
type: promptCondition
prompt: Customer issue requires escalation to a specialist
- source: Support-Agent
target: Resolve-Issue
type: promptCondition
prompt: Customer issue has been resolved successfully
- source: Escalate-Issue
target: Support-Agent
type: stepForward
- source: Resolve-Issue
target: Support-Agent
type: promptCondition
prompt: Customer has additional questions or issues
Tools Implementation
tools/escalateIssue.ts
:
import { Tool } from '@minded/sdk';
import { zendesk } from '@minded/sdk/interfaces/zendesk';
import { z } from 'zod';
const escalateIssue: Tool<any, any> = {
name: 'escalateIssue',
description: 'Escalate a customer issue to a specialist',
inputSchema: z.object({
reason: z.string().describe('Reason for escalation'),
priority: z.enum(['high', 'urgent']).describe('Escalation priority'),
}),
func: async ({ reason, priority }, { memory, sessionId }) => {
// Add escalation tag
await zendesk.addTag(sessionId!, 'escalated');
// Set priority
await zendesk.setCustomFields({
sessionId: sessionId!,
fields: [{ id: 123, value: priority }], // Assuming field ID 123 is priority
});
// Add internal comment
await zendesk.sendComment(sessionId!, `ESCALATED: ${reason} - Priority: ${priority}`);
return {
success: true,
message: `Issue escalated with priority: ${priority}`,
memory: {
...memory,
escalated: true,
priority: priority,
},
};
},
};
export default escalateIssue;
Best Practices
1. Error Handling
Always implement proper error handling for Zendesk operations:
agent.on(events.AI_MESSAGE, async ({ message, state }) => {
try {
await zendesk.sendMessage(state.sessionId!, message);
} catch (err) {
logger.error({ message: 'Failed to send message to Zendesk', err });
// Implement fallback or retry logic
}
});
2. Memory Management
Use memory to maintain context across the conversation:
// Track conversation progress
memory.conversationStage = 'information_gathering';
// Store important customer data
memory.customerEmail = triggerBody.customerEmail;
memory.issueType = 'billing';
3. Trigger Qualification
Implement proper trigger qualification to handle only relevant events:
agent.on(events.TRIGGER_EVENT, async ({ triggerBody, sessionId }) => {
// Only process triggers with actual content
if (!triggerBody.content || triggerBody.content.trim().length === 0) {
return { isQualified: false };
}
// Skip automated messages
if (triggerBody.isAutomated) {
return { isQualified: false };
}
return { isQualified: true };
});
4. Tag Management
Use tags consistently for tracking and automation:
// Add tags based on issue type
if (memory.issueType === 'billing') {
await zendesk.addTag(sessionId, 'billing-issue');
}
// Track resolution status
if (memory.resolved) {
await zendesk.addTag(sessionId, 'resolved-by-ai');
}
5. Custom Fields
Leverage custom fields for enhanced workflow automation:
// Set custom fields for reporting and automation
await zendesk.setCustomFields({
sessionId,
fields: [
{ id: 123, value: memory.priority },
{ id: 456, value: memory.issueType },
{ id: 789, value: 'ai-handled' },
],
});
Integration Architecture
The Zendesk integration follows this architecture:
Trigger Events - Zendesk sends events to your agent
Agent Processing - Your agent processes the event and determines response
Zendesk API Calls - Agent makes calls back to Zendesk via the interface
Real-time Updates - Changes are reflected in Zendesk immediately
This architecture ensures seamless bi-directional communication between your Minded agent and Zendesk, enabling sophisticated customer support automation while maintaining full control over the conversation flow.
Troubleshooting
Common Issues
Connection Issues: Ensure your Zendesk credentials are properly configured
Permission Errors: Verify your Zendesk API permissions include required scopes
Rate Limiting: Implement proper rate limiting and retry logic
Session Management: Ensure sessionId is properly maintained across requests
Debug Mode
Enable debug logging to troubleshoot issues:
// Add debugging to your agent
agent.on(events.AI_MESSAGE, async ({ message, state }) => {
console.log('Sending message to Zendesk:', { message, sessionId: state.sessionId });
await zendesk.sendMessage(state.sessionId!, message);
});
For additional support, consult the Minded platform documentation or contact support.
Last updated