Skip to content

Commit dd64109

Browse files
Bill LeoutsakosBill Leoutsakos
authored andcommitted
fix(knowledge): expose create document ID output
1 parent 4e78409 commit dd64109

4 files changed

Lines changed: 72 additions & 2 deletions

File tree

apps/sim/tools/knowledge/create_document.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ export const knowledgeCreateDocumentTool: InternalToolConfig<any, KnowledgeCreat
124124
// Handle multiple documents response
125125
const uploadCount = documentsCreated.length
126126
const firstDocument = documentsCreated[0]
127+
const documentId = firstDocument?.documentId || firstDocument?.id || ''
127128

128129
return {
129130
success: true,
@@ -132,8 +133,9 @@ export const knowledgeCreateDocumentTool: InternalToolConfig<any, KnowledgeCreat
132133
uploadCount > 1
133134
? `Successfully created ${uploadCount} documents in knowledge base`
134135
: `Successfully created document in knowledge base`,
136+
documentId,
135137
data: {
136-
documentId: firstDocument?.documentId || firstDocument?.id || '',
138+
documentId,
137139
documentName:
138140
uploadCount > 1 ? `${uploadCount} documents` : firstDocument?.filename || 'Unknown',
139141
type: 'document',

apps/sim/tools/knowledge/knowledge.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,72 @@ describe('Knowledge Tools', () => {
157157
})
158158
})
159159

160+
describe('knowledgeCreateDocumentTool', () => {
161+
describe('transformResponse', () => {
162+
it('exposes the created document ID at both the top level and nested data path', async () => {
163+
const result = await knowledgeCreateDocumentTool.transformResponse!(
164+
createMockResponse({
165+
data: {
166+
documentsCreated: [{ documentId: 'doc-123', filename: 'document.txt' }],
167+
},
168+
})
169+
)
170+
171+
expect(result.success).toBe(true)
172+
expect(result.output.documentId).toBe('doc-123')
173+
expect(result.output.data.documentId).toBe('doc-123')
174+
})
175+
176+
it('uses the legacy document ID fallback for both output paths', async () => {
177+
const result = await knowledgeCreateDocumentTool.transformResponse!(
178+
createMockResponse({
179+
documentsCreated: [{ id: 'legacy-doc-123', filename: 'document.txt' }],
180+
})
181+
)
182+
183+
expect(result.output.documentId).toBe('legacy-doc-123')
184+
expect(result.output.data.documentId).toBe('legacy-doc-123')
185+
})
186+
187+
it.each([
188+
['missing documentsCreated', { data: {} }],
189+
['null documentsCreated', { data: { documentsCreated: null } }],
190+
['empty documentsCreated', { data: { documentsCreated: [] } }],
191+
['created document without an ID', { data: { documentsCreated: [{}] } }],
192+
])('preserves empty IDs for %s', async (_label, responseBody) => {
193+
const result = await knowledgeCreateDocumentTool.transformResponse!(
194+
createMockResponse(responseBody)
195+
)
196+
197+
expect(result.success).toBe(true)
198+
expect(result.output.documentId).toBe('')
199+
expect(result.output.data.documentId).toBe('')
200+
})
201+
})
202+
203+
it.each([
204+
['omitted tags', {}],
205+
['an empty tag array', { documentTags: [] }],
206+
['a serialized empty tag array', { documentTags: '[]' }],
207+
])('omits tag data and tag provenance for %s', (_label, tagParams) => {
208+
const params = {
209+
knowledgeBaseId: 'kb-1',
210+
name: 'document.txt',
211+
content: 'document content',
212+
...tagParams,
213+
}
214+
const body = knowledgeCreateDocumentTool.operation.input(params) as {
215+
documents: Array<{ documentTagsData?: string }>
216+
}
217+
218+
expect(body.documents[0]).not.toHaveProperty('documentTagsData')
219+
expect(knowledgeCreateDocumentTool.operation.secretProvenance?.request?.(params)).toEqual([
220+
{ key: 'document-filename:0', inputPaths: [['name']] },
221+
{ key: 'document-content:0', inputPaths: [['content']] },
222+
])
223+
})
224+
})
225+
160226
describe('knowledgeSearchTool', () => {
161227
describe('transformResponse', () => {
162228
it('should restructure cost information for logging', async () => {

apps/sim/tools/knowledge/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ export interface KnowledgeCreateDocumentResponse {
132132
output: {
133133
data: KnowledgeCreateDocumentResult
134134
message: string
135+
documentId: string
135136
}
136137
error?: string
137138
}

apps/sim/tools/schema-enrichers.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ describe('enrichKBTagsSchema', () => {
131131
it('omits the executionId outside an active run', async () => {
132132
mockListKnowledgeTagsAsExecutor.mockResolvedValue([])
133133

134-
await enrichKBTagsSchema('kb-1', {
134+
const result = await enrichKBTagsSchema('kb-1', {
135135
userId: 'user-1',
136136
workspaceId: 'workspace-1',
137137
workflowId: 'workflow-1',
@@ -148,6 +148,7 @@ describe('enrichKBTagsSchema', () => {
148148
executorDelegationOrigin: EXECUTOR_ORIGIN,
149149
},
150150
})
151+
expect(result).toBeNull()
151152
})
152153

153154
it.each([

0 commit comments

Comments
 (0)