Skip to content

Commit 9ae6209

Browse files
zendesk v2 with paginated output
1 parent 87a1c62 commit 9ae6209

File tree

11 files changed

+236
-42
lines changed

11 files changed

+236
-42
lines changed

apps/sim/blocks/blocks/zendesk.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,7 @@ Return ONLY the search query - no explanations.`,
496496
condition: {
497497
field: 'operation',
498498
value: [
499+
'get_tickets',
499500
'get_users',
500501
'get_organizations',
501502
'search_users',
@@ -533,6 +534,7 @@ Return ONLY the search query - no explanations.`,
533534
tools: {
534535
access: [
535536
'zendesk_get_tickets',
537+
'zendesk_get_tickets_v2',
536538
'zendesk_get_ticket',
537539
'zendesk_create_ticket',
538540
'zendesk_create_tickets_bulk',
@@ -563,7 +565,7 @@ Return ONLY the search query - no explanations.`,
563565
tool: (params) => {
564566
switch (params.operation) {
565567
case 'get_tickets':
566-
return 'zendesk_get_tickets'
568+
return 'zendesk_get_tickets_v2'
567569
case 'get_ticket':
568570
return 'zendesk_get_ticket'
569571
case 'create_ticket':
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
export type { PaginatedCacheStorageAdapter } from '@/lib/paginated-cache/adapter'
2-
export { RedisPaginatedCache } from '@/lib/paginated-cache/redis-cache'
32
export {
43
autoPaginate,
54
cleanupPaginatedCache,
65
hydrateCacheReferences,
76
} from '@/lib/paginated-cache/paginate'
7+
export { RedisPaginatedCache } from '@/lib/paginated-cache/redis-cache'
88
export {
9-
isPaginatedCacheReference,
109
type CachedPage,
1110
type CacheMetadata,
11+
isPaginatedCacheReference,
1212
type PaginatedCacheReference,
1313
type ToolPaginationConfig,
1414
} from '@/lib/paginated-cache/types'

apps/sim/lib/paginated-cache/paginate.test.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,9 @@ describe('autoPaginate', () => {
126126
expect(result.output.tickets).toEqual(
127127
expect.objectContaining({ _type: 'paginated_cache_ref', totalPages: 3, totalItems: 3 })
128128
)
129-
expect(result.output.paging).toEqual({ has_more: false, after_cursor: null })
130-
expect(result.output.metadata).toEqual({ total_returned: 1, has_more: false })
129+
expect(result.output.paging).toBeUndefined()
130+
expect(result.output.metadata).toBeUndefined()
131+
expect(Object.keys(result.output)).toEqual(['tickets'])
131132
})
132133

133134
it('respects maxPages', async () => {
@@ -235,10 +236,7 @@ describe('autoPaginate', () => {
235236
})
236237

237238
const outputKeys = Object.keys(result.output)
238-
expect(outputKeys).toContain('items')
239-
expect(outputKeys).toContain('cursor')
240-
expect(outputKeys).not.toContain('metadata')
241-
expect(outputKeys).not.toContain('paging')
239+
expect(outputKeys).toEqual(['items'])
242240
})
243241
})
244242

apps/sim/lib/paginated-cache/paginate.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,8 @@ export async function autoPaginate(options: AutoPaginateOptions): Promise<ToolRe
5050

5151
let totalItems = 0
5252
let pageIndex = 0
53-
let lastOutput = initialResult.output
5453

55-
const initialItems = config.getItems(initialResult.output)
54+
const initialItems = config.getItems(initialResult.output) ?? []
5655
await cache.storePage(cacheId, pageIndex, initialItems)
5756
totalItems += initialItems.length
5857
pageIndex++
@@ -68,10 +67,9 @@ export async function autoPaginate(options: AutoPaginateOptions): Promise<ToolRe
6867
)
6968
}
7069

71-
const pageItems = config.getItems(pageResult.output)
70+
const pageItems = config.getItems(pageResult.output) ?? []
7271
await cache.storePage(cacheId, pageIndex, pageItems)
7372
totalItems += pageItems.length
74-
lastOutput = pageResult.output
7573
pageIndex++
7674

7775
nextToken = config.getNextPageToken(pageResult.output)
@@ -94,7 +92,6 @@ export async function autoPaginate(options: AutoPaginateOptions): Promise<ToolRe
9492
return {
9593
...initialResult,
9694
output: {
97-
...lastOutput,
9895
[config.pageField]: reference,
9996
},
10097
}

apps/sim/lib/paginated-cache/redis-cache.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const logger = createLogger('RedisPaginatedCache')
99
const REDIS_KEY_PREFIX = 'pagcache:'
1010

1111
/** Safety-net TTL: 2× the max async execution timeout. Explicit cleanup is the primary mechanism. */
12-
const DEFAULT_TTL_MS = Number(env.EXECUTION_TIMEOUT_ASYNC_ENTERPRISE) * 1000 * 2
12+
const DEFAULT_TTL_MS = (Number(env.EXECUTION_TIMEOUT_ASYNC_ENTERPRISE) || 5400) * 1000 * 2
1313

1414
export class RedisPaginatedCache implements PaginatedCacheStorageAdapter {
1515
constructor(

apps/sim/lib/paginated-cache/types.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
* @vitest-environment node
33
*/
44
import { describe, expect, it } from 'vitest'
5-
65
import { isPaginatedCacheReference } from '@/lib/paginated-cache/types'
76

87
describe('isPaginatedCacheReference', () => {

apps/sim/tools/index.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -620,10 +620,6 @@ async function maybeAutoPaginate(
620620
) {
621621
return finalResult
622622
}
623-
const nextToken = tool.pagination.getNextPageToken(finalResult.output)
624-
if (nextToken === null) {
625-
return finalResult
626-
}
627623
return autoPaginate({
628624
initialResult: finalResult,
629625
params: contextParams,
@@ -925,7 +921,7 @@ export async function executeTool(
925921
finalResult,
926922
contextParams,
927923
normalizedToolId,
928-
skipPostProcess,
924+
skipAutoPaginate,
929925
executionContext
930926
)
931927

apps/sim/tools/registry.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2669,6 +2669,7 @@ import {
26692669
zendeskGetOrganizationsTool,
26702670
zendeskGetOrganizationTool,
26712671
zendeskGetTicketsTool,
2672+
zendeskGetTicketsV2Tool,
26722673
zendeskGetTicketTool,
26732674
zendeskGetUsersTool,
26742675
zendeskGetUserTool,
@@ -5016,6 +5017,7 @@ export const tools: Record<string, ToolConfig> = {
50165017
mailchimp_create_batch_operation: mailchimpCreateBatchOperationTool,
50175018
mailchimp_delete_batch_operation: mailchimpDeleteBatchOperationTool,
50185019
zendesk_get_tickets: zendeskGetTicketsTool,
5020+
zendesk_get_tickets_v2: zendeskGetTicketsV2Tool,
50195021
zendesk_get_ticket: zendeskGetTicketTool,
50205022
zendesk_create_ticket: zendeskCreateTicketTool,
50215023
zendesk_create_tickets_bulk: zendeskCreateTicketsBulkTool,

apps/sim/tools/zendesk/get_tickets.ts

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { ToolConfig } from '@/tools/types'
22
import {
3+
appendCursorPaginationParams,
34
buildZendeskUrl,
45
extractCursorPagingInfo,
56
handleZendeskError,
@@ -18,7 +19,7 @@ export interface ZendeskGetTicketsParams {
1819
assigneeId?: string
1920
organizationId?: string
2021
sort?: string
21-
/** Internal: set by auto-pagination via buildNextPageParams */
22+
perPage?: string
2223
pageAfter?: string
2324
}
2425

@@ -43,7 +44,7 @@ export const zendeskGetTicketsTool: ToolConfig<ZendeskGetTicketsParams, ZendeskG
4344
id: 'zendesk_get_tickets',
4445
name: 'Get Tickets from Zendesk',
4546
description: 'Retrieve a list of tickets from Zendesk with optional filtering',
46-
version: '2.0.0',
47+
version: '1.0.0',
4748

4849
params: {
4950
email: {
@@ -101,6 +102,18 @@ export const zendeskGetTicketsTool: ToolConfig<ZendeskGetTicketsParams, ZendeskG
101102
description:
102103
'Sort field for ticket listing (only applies without filters): "updated_at", "id", or "status". Prefix with "-" for descending (e.g., "-updated_at")',
103104
},
105+
perPage: {
106+
type: 'string',
107+
required: false,
108+
visibility: 'user-or-llm',
109+
description: 'Results per page as a number string (default: "100", max: "100")',
110+
},
111+
pageAfter: {
112+
type: 'string',
113+
required: false,
114+
visibility: 'user-or-llm',
115+
description: 'Cursor from a previous response to fetch the next page of results',
116+
},
104117
},
105118

106119
request: {
@@ -125,16 +138,15 @@ export const zendeskGetTicketsTool: ToolConfig<ZendeskGetTicketsParams, ZendeskG
125138
const queryParams = new URLSearchParams()
126139
queryParams.append('query', searchTerms.join(' '))
127140
queryParams.append('filter[type]', 'ticket')
128-
queryParams.append('page[size]', '100')
129-
if (params.pageAfter) queryParams.append('page[after]', params.pageAfter)
141+
appendCursorPaginationParams(queryParams, params)
130142

131143
return `${buildZendeskUrl(params.subdomain, '/search/export')}?${queryParams.toString()}`
132144
}
133145

146+
// No filters - use the simple /tickets endpoint with cursor-based pagination
134147
const queryParams = new URLSearchParams()
135148
if (params.sort) queryParams.append('sort', params.sort)
136-
queryParams.append('page[size]', '100')
137-
if (params.pageAfter) queryParams.append('page[after]', params.pageAfter)
149+
appendCursorPaginationParams(queryParams, params)
138150

139151
const query = queryParams.toString()
140152
const url = buildZendeskUrl(params.subdomain, '/tickets')
@@ -182,19 +194,4 @@ export const zendeskGetTicketsTool: ToolConfig<ZendeskGetTicketsParams, ZendeskG
182194
paging: PAGING_OUTPUT,
183195
metadata: METADATA_OUTPUT,
184196
},
185-
186-
pagination: {
187-
pageField: 'tickets',
188-
getItems: (output) => output.tickets ?? [],
189-
getNextPageToken: (output) => {
190-
if (output.paging?.has_more && output.paging?.after_cursor) {
191-
return output.paging.after_cursor
192-
}
193-
return null
194-
},
195-
buildNextPageParams: (params, token) => ({
196-
...params,
197-
pageAfter: String(token),
198-
}),
199-
},
200197
}

0 commit comments

Comments
 (0)