@loopstack/meeting-notes-example-workflow 0.21.6 → 0.21.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/meeting-notes.workflow.d.ts +2 -2
- package/dist/meeting-notes.workflow.d.ts.map +1 -1
- package/dist/meeting-notes.workflow.js +15 -19
- package/dist/meeting-notes.workflow.js.map +1 -1
- package/dist/templates/extract-notes.md +5 -0
- package/package.json +5 -4
- package/src/__tests__/meeting-notes.workflow.spec.ts +14 -21
- package/src/meeting-notes.workflow.ts +18 -15
- package/src/templates/extract-notes.md +5 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { ClaudeGenerateDocument } from '@loopstack/claude-module';
|
|
3
2
|
import { BaseWorkflow } from '@loopstack/common';
|
|
3
|
+
import { LlmGenerateObjectTool } from '@loopstack/llm-provider-module';
|
|
4
4
|
import { MeetingNotesDocumentSchema } from './documents/meeting-notes-document';
|
|
5
5
|
import { OptimizedMeetingNotesDocumentSchema } from './documents/optimized-notes-document';
|
|
6
6
|
export declare class MeetingNotesWorkflow extends BaseWorkflow<{
|
|
7
7
|
inputText: string;
|
|
8
8
|
}> {
|
|
9
|
-
|
|
9
|
+
llmGenerateObject: LlmGenerateObjectTool;
|
|
10
10
|
meetingNotes?: z.infer<typeof MeetingNotesDocumentSchema>;
|
|
11
11
|
optimizedNotes?: z.infer<typeof OptimizedMeetingNotesDocumentSchema>;
|
|
12
12
|
createForm(args: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meeting-notes.workflow.d.ts","sourceRoot":"","sources":["../src/meeting-notes.workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"meeting-notes.workflow.d.ts","sourceRoot":"","sources":["../src/meeting-notes.workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAoD,MAAM,mBAAmB,CAAC;AAEnG,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAwB,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACtG,OAAO,EAAE,mCAAmC,EAA0B,MAAM,sCAAsC,CAAC;AAEnH,qBAUa,oBAAqB,SAAQ,YAAY,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;IAE3E,iBAAiB,EAAE,qBAAqB,CAAC;IAEzC,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;IAC1D,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mCAAmC,CAAC,CAAC;IAG/D,UAAU,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE;IAStC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC;IAMhE,aAAa;IAkBb,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mCAAmC,CAAC;CAI3E"}
|
|
@@ -11,35 +11,31 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.MeetingNotesWorkflow = void 0;
|
|
13
13
|
const zod_1 = require("zod");
|
|
14
|
-
const
|
|
14
|
+
const zod_2 = require("zod");
|
|
15
15
|
const common_1 = require("@loopstack/common");
|
|
16
|
+
const llm_provider_module_1 = require("@loopstack/llm-provider-module");
|
|
16
17
|
const meeting_notes_document_1 = require("./documents/meeting-notes-document");
|
|
17
18
|
const optimized_notes_document_1 = require("./documents/optimized-notes-document");
|
|
18
19
|
let MeetingNotesWorkflow = class MeetingNotesWorkflow extends common_1.BaseWorkflow {
|
|
19
|
-
|
|
20
|
+
llmGenerateObject;
|
|
20
21
|
meetingNotes;
|
|
21
22
|
optimizedNotes;
|
|
22
23
|
async createForm(args) {
|
|
23
|
-
await this.repository.save(meeting_notes_document_1.MeetingNotesDocument, {
|
|
24
|
-
text: `Unstructured Notes:\n\n${args.inputText}`,
|
|
25
|
-
}, { id: 'input' });
|
|
24
|
+
await this.repository.save(meeting_notes_document_1.MeetingNotesDocument, { text: `Unstructured Notes:\n\n${args.inputText}` }, { id: 'input' });
|
|
26
25
|
}
|
|
27
26
|
async userResponse(payload) {
|
|
28
27
|
const result = await this.repository.save(meeting_notes_document_1.MeetingNotesDocument, payload, { id: 'input' });
|
|
29
28
|
this.meetingNotes = result.content;
|
|
30
29
|
}
|
|
31
30
|
async optimizeNotes() {
|
|
32
|
-
await this.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
<Meeting Notes>
|
|
41
|
-
${this.meetingNotes?.text}
|
|
42
|
-
</Meeting Notes>`,
|
|
31
|
+
const result = await this.llmGenerateObject.call({
|
|
32
|
+
outputSchema: (0, zod_2.toJSONSchema)(optimized_notes_document_1.OptimizedMeetingNotesDocumentSchema),
|
|
33
|
+
prompt: this.render(__dirname + '/templates/extract-notes.md', { text: this.meetingNotes?.text }),
|
|
34
|
+
});
|
|
35
|
+
const objectResult = result.data;
|
|
36
|
+
await this.repository.save(optimized_notes_document_1.OptimizedNotesDocument, objectResult.data, {
|
|
37
|
+
id: 'final',
|
|
38
|
+
validate: 'skip',
|
|
43
39
|
});
|
|
44
40
|
}
|
|
45
41
|
async confirm(payload) {
|
|
@@ -49,9 +45,9 @@ ${this.meetingNotes?.text}
|
|
|
49
45
|
};
|
|
50
46
|
exports.MeetingNotesWorkflow = MeetingNotesWorkflow;
|
|
51
47
|
__decorate([
|
|
52
|
-
(0, common_1.InjectTool)(),
|
|
53
|
-
__metadata("design:type",
|
|
54
|
-
], MeetingNotesWorkflow.prototype, "
|
|
48
|
+
(0, common_1.InjectTool)({ provider: 'claude', model: 'claude-sonnet-4-6' }),
|
|
49
|
+
__metadata("design:type", llm_provider_module_1.LlmGenerateObjectTool)
|
|
50
|
+
], MeetingNotesWorkflow.prototype, "llmGenerateObject", void 0);
|
|
55
51
|
__decorate([
|
|
56
52
|
(0, common_1.Initial)({ to: 'waiting_for_response' }),
|
|
57
53
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meeting-notes.workflow.js","sourceRoot":"","sources":["../src/meeting-notes.workflow.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"meeting-notes.workflow.js","sourceRoot":"","sources":["../src/meeting-notes.workflow.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAAwB;AACxB,6BAAmC;AACnC,8CAAmG;AAEnG,wEAAuE;AACvE,+EAAsG;AACtG,mFAAmH;AAY5G,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,qBAAmC;IAE3E,iBAAiB,CAAwB;IAEzC,YAAY,CAA8C;IAC1D,cAAc,CAAuD;IAG/D,AAAN,KAAK,CAAC,UAAU,CAAC,IAA2B;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CACxB,6CAAoB,EACpB,EAAE,IAAI,EAAE,0BAA0B,IAAI,CAAC,SAAS,EAAE,EAAE,EACpD,EAAE,EAAE,EAAE,OAAO,EAAE,CAChB,CAAC;IACJ,CAAC;IAGK,AAAN,KAAK,CAAC,YAAY,CAAC,OAAmD;QACpE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,6CAAoB,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,OAAqD,CAAC;IACnF,CAAC;IAGK,AAAN,KAAK,CAAC,aAAa;QACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAC/C,YAAY,EAAE,IAAA,kBAAY,EAAC,8DAAmC,CAA4B;YAC1F,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,6BAA6B,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;SAClG,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,CAAC,IAA+B,CAAC;QAC5D,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CACxB,iDAAsB,EACtB,YAAY,CAAC,IAA2D,EACxE;YACE,EAAE,EAAE,OAAO;YACX,QAAQ,EAAE,MAAM;SACjB,CACF,CAAC;IACJ,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAC,OAA4D;QACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,iDAAsB,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,OAA8D,CAAC;IAC9F,CAAC;CACF,CAAA;AA7CY,oDAAoB;AAE/B;IADC,IAAA,mBAAU,EAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;8BAC5C,2CAAqB;+DAAC;AAMnC;IADL,IAAA,gBAAO,EAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,CAAC;;;;sDAOvC;AAGK;IADL,IAAA,mBAAU,EAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,mDAA0B,EAAE,CAAC;;;;wDAIrH;AAGK;IADL,IAAA,mBAAU,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC;;;;yDAgBhE;AAGK;IADL,IAAA,cAAK,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,8DAAmC,EAAE,CAAC;;;;mDAI3F;+BA5CU,oBAAoB;IAVhC,IAAA,iBAAQ,EAAC;QACR,QAAQ,EAAE,SAAS,GAAG,wBAAwB;QAC9C,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,SAAS,EAAE,OAAC;iBACT,MAAM,EAAE;iBACR,OAAO,CACN,2IAA2I,CAC5I;SACJ,CAAC;KACH,CAAC;GACW,oBAAoB,CA6ChC"}
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"summary",
|
|
10
10
|
"workflow"
|
|
11
11
|
],
|
|
12
|
-
"version": "0.21.
|
|
12
|
+
"version": "0.21.7",
|
|
13
13
|
"license": "MIT",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Jakob Klippel",
|
|
@@ -30,9 +30,10 @@
|
|
|
30
30
|
"watch": "nest build --watch"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@loopstack/claude-module": "^0.
|
|
34
|
-
"@loopstack/
|
|
35
|
-
"@loopstack/
|
|
33
|
+
"@loopstack/claude-module": "^0.23.0",
|
|
34
|
+
"@loopstack/llm-provider-module": "^0.2.0",
|
|
35
|
+
"@loopstack/common": "^0.29.0",
|
|
36
|
+
"@loopstack/core": "^0.29.0",
|
|
36
37
|
"@nestjs/common": "^11.1.19",
|
|
37
38
|
"zod": "^4.3.6"
|
|
38
39
|
},
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { TestingModule } from '@nestjs/testing';
|
|
2
|
-
import {
|
|
2
|
+
import { ClaudeModule } from '@loopstack/claude-module';
|
|
3
3
|
import { RunContext, WorkflowEntity, getBlockTools } from '@loopstack/common';
|
|
4
4
|
import { LoopCoreModule, WorkflowProcessorService } from '@loopstack/core';
|
|
5
|
+
import { LlmGenerateObjectTool } from '@loopstack/llm-provider-module';
|
|
5
6
|
import { ToolMock, createStatelessContext, createWorkflowTest } from '@loopstack/testing';
|
|
6
7
|
import { MeetingNotesDocument } from '../documents/meeting-notes-document';
|
|
7
8
|
import { OptimizedNotesDocument } from '../documents/optimized-notes-document';
|
|
@@ -11,8 +12,7 @@ describe('MeetingNotesWorkflow', () => {
|
|
|
11
12
|
let module: TestingModule;
|
|
12
13
|
let workflow: MeetingNotesWorkflow;
|
|
13
14
|
let processor: WorkflowProcessorService;
|
|
14
|
-
|
|
15
|
-
let mockClaudeGenerateDocument: ToolMock;
|
|
15
|
+
let mockLlmGenerateObject: ToolMock;
|
|
16
16
|
|
|
17
17
|
beforeEach(async () => {
|
|
18
18
|
module = await createWorkflowTest()
|
|
@@ -20,13 +20,12 @@ describe('MeetingNotesWorkflow', () => {
|
|
|
20
20
|
.withImports(LoopCoreModule, ClaudeModule)
|
|
21
21
|
.withProvider(MeetingNotesDocument)
|
|
22
22
|
.withProvider(OptimizedNotesDocument)
|
|
23
|
-
.withToolOverride(
|
|
23
|
+
.withToolOverride(LlmGenerateObjectTool)
|
|
24
24
|
.compile();
|
|
25
25
|
|
|
26
26
|
workflow = module.get(MeetingNotesWorkflow);
|
|
27
27
|
processor = module.get(WorkflowProcessorService);
|
|
28
|
-
|
|
29
|
-
mockClaudeGenerateDocument = module.get(ClaudeGenerateDocument);
|
|
28
|
+
mockLlmGenerateObject = module.get(LlmGenerateObjectTool);
|
|
30
29
|
});
|
|
31
30
|
|
|
32
31
|
afterEach(async () => {
|
|
@@ -36,14 +35,13 @@ describe('MeetingNotesWorkflow', () => {
|
|
|
36
35
|
describe('initialization', () => {
|
|
37
36
|
it('should be defined with correct tools', () => {
|
|
38
37
|
expect(workflow).toBeDefined();
|
|
39
|
-
expect(getBlockTools(workflow)).toContain('
|
|
38
|
+
expect(getBlockTools(workflow)).toContain('llmGenerateObject');
|
|
40
39
|
});
|
|
41
40
|
});
|
|
42
41
|
|
|
43
42
|
describe('initial step', () => {
|
|
44
43
|
it('should execute initial step and stop at waiting_for_response', async () => {
|
|
45
44
|
const context = createStatelessContext();
|
|
46
|
-
|
|
47
45
|
const result = await processor.process(workflow, {}, context);
|
|
48
46
|
|
|
49
47
|
expect(result.hasError).toBe(false);
|
|
@@ -63,12 +61,10 @@ describe('MeetingNotesWorkflow', () => {
|
|
|
63
61
|
|
|
64
62
|
it('should use custom input text when provided', async () => {
|
|
65
63
|
const context = createStatelessContext();
|
|
66
|
-
|
|
67
64
|
const result = await processor.process(workflow, { inputText: 'Custom meeting notes here' }, context);
|
|
68
65
|
|
|
69
66
|
expect(result.hasError).toBe(false);
|
|
70
67
|
expect(result.stop).toBe(true);
|
|
71
|
-
|
|
72
68
|
expect(result.documents[0]).toEqual(
|
|
73
69
|
expect.objectContaining({
|
|
74
70
|
content: expect.objectContaining({
|
|
@@ -83,7 +79,9 @@ describe('MeetingNotesWorkflow', () => {
|
|
|
83
79
|
it('should process user response and call LLM to optimize notes', async () => {
|
|
84
80
|
const workflowId = '00000000-0000-0000-0000-000000000001';
|
|
85
81
|
|
|
86
|
-
|
|
82
|
+
mockLlmGenerateObject.call.mockResolvedValue({
|
|
83
|
+
data: { data: {} },
|
|
84
|
+
});
|
|
87
85
|
|
|
88
86
|
const context = {
|
|
89
87
|
workflowEntity: {
|
|
@@ -106,7 +104,6 @@ describe('MeetingNotesWorkflow', () => {
|
|
|
106
104
|
expect(result.stop).toBe(true);
|
|
107
105
|
expect(result.place).toBe('notes_optimized');
|
|
108
106
|
|
|
109
|
-
// User response should have been saved as document
|
|
110
107
|
expect(result.documents).toEqual(
|
|
111
108
|
expect.arrayContaining([
|
|
112
109
|
expect.objectContaining({
|
|
@@ -115,15 +112,13 @@ describe('MeetingNotesWorkflow', () => {
|
|
|
115
112
|
]),
|
|
116
113
|
);
|
|
117
114
|
|
|
118
|
-
|
|
119
|
-
expect(
|
|
120
|
-
expect(mockClaudeGenerateDocument.call).toHaveBeenCalledWith(
|
|
115
|
+
expect(mockLlmGenerateObject.call).toHaveBeenCalledTimes(1);
|
|
116
|
+
expect(mockLlmGenerateObject.call).toHaveBeenCalledWith(
|
|
121
117
|
expect.objectContaining({
|
|
122
|
-
|
|
123
|
-
response: expect.objectContaining({ id: 'final' }),
|
|
118
|
+
outputSchema: expect.any(Object),
|
|
124
119
|
prompt: expect.stringContaining('meeting notes'),
|
|
125
120
|
}),
|
|
126
|
-
|
|
121
|
+
expect.anything(),
|
|
127
122
|
);
|
|
128
123
|
});
|
|
129
124
|
});
|
|
@@ -161,7 +156,6 @@ describe('MeetingNotesWorkflow', () => {
|
|
|
161
156
|
expect(result.stop).toBe(false);
|
|
162
157
|
expect(result.place).toBe('end');
|
|
163
158
|
|
|
164
|
-
// Confirmed payload should have been saved as OptimizedNotesDocument
|
|
165
159
|
expect(result.documents).toEqual(
|
|
166
160
|
expect.arrayContaining([
|
|
167
161
|
expect.objectContaining({
|
|
@@ -170,8 +164,7 @@ describe('MeetingNotesWorkflow', () => {
|
|
|
170
164
|
]),
|
|
171
165
|
);
|
|
172
166
|
|
|
173
|
-
|
|
174
|
-
expect(mockClaudeGenerateDocument.call).not.toHaveBeenCalled();
|
|
167
|
+
expect(mockLlmGenerateObject.call).not.toHaveBeenCalled();
|
|
175
168
|
});
|
|
176
169
|
});
|
|
177
170
|
});
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { toJSONSchema } from 'zod';
|
|
3
3
|
import { BaseWorkflow, Final, Initial, InjectTool, Transition, Workflow } from '@loopstack/common';
|
|
4
|
+
import type { LlmGenerateObjectResult } from '@loopstack/llm-provider-module';
|
|
5
|
+
import { LlmGenerateObjectTool } from '@loopstack/llm-provider-module';
|
|
4
6
|
import { MeetingNotesDocument, MeetingNotesDocumentSchema } from './documents/meeting-notes-document';
|
|
5
7
|
import { OptimizedMeetingNotesDocumentSchema, OptimizedNotesDocument } from './documents/optimized-notes-document';
|
|
6
8
|
|
|
@@ -15,7 +17,8 @@ import { OptimizedMeetingNotesDocumentSchema, OptimizedNotesDocument } from './d
|
|
|
15
17
|
}),
|
|
16
18
|
})
|
|
17
19
|
export class MeetingNotesWorkflow extends BaseWorkflow<{ inputText: string }> {
|
|
18
|
-
@InjectTool(
|
|
20
|
+
@InjectTool({ provider: 'claude', model: 'claude-sonnet-4-6' })
|
|
21
|
+
llmGenerateObject: LlmGenerateObjectTool;
|
|
19
22
|
|
|
20
23
|
meetingNotes?: z.infer<typeof MeetingNotesDocumentSchema>;
|
|
21
24
|
optimizedNotes?: z.infer<typeof OptimizedMeetingNotesDocumentSchema>;
|
|
@@ -24,9 +27,7 @@ export class MeetingNotesWorkflow extends BaseWorkflow<{ inputText: string }> {
|
|
|
24
27
|
async createForm(args: { inputText: string }) {
|
|
25
28
|
await this.repository.save(
|
|
26
29
|
MeetingNotesDocument,
|
|
27
|
-
{
|
|
28
|
-
text: `Unstructured Notes:\n\n${args.inputText}`,
|
|
29
|
-
},
|
|
30
|
+
{ text: `Unstructured Notes:\n\n${args.inputText}` },
|
|
30
31
|
{ id: 'input' },
|
|
31
32
|
);
|
|
32
33
|
}
|
|
@@ -39,18 +40,20 @@ export class MeetingNotesWorkflow extends BaseWorkflow<{ inputText: string }> {
|
|
|
39
40
|
|
|
40
41
|
@Transition({ from: 'response_received', to: 'notes_optimized' })
|
|
41
42
|
async optimizeNotes() {
|
|
42
|
-
await this.
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const result = await this.llmGenerateObject.call({
|
|
44
|
+
outputSchema: toJSONSchema(OptimizedMeetingNotesDocumentSchema) as Record<string, unknown>,
|
|
45
|
+
prompt: this.render(__dirname + '/templates/extract-notes.md', { text: this.meetingNotes?.text }),
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const objectResult = result.data as LlmGenerateObjectResult;
|
|
49
|
+
await this.repository.save(
|
|
50
|
+
OptimizedNotesDocument,
|
|
51
|
+
objectResult.data as z.infer<typeof OptimizedMeetingNotesDocumentSchema>,
|
|
52
|
+
{
|
|
45
53
|
id: 'final',
|
|
46
|
-
|
|
54
|
+
validate: 'skip',
|
|
47
55
|
},
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
<Meeting Notes>
|
|
51
|
-
${this.meetingNotes?.text}
|
|
52
|
-
</Meeting Notes>`,
|
|
53
|
-
});
|
|
56
|
+
);
|
|
54
57
|
}
|
|
55
58
|
|
|
56
59
|
@Final({ from: 'notes_optimized', wait: true, schema: OptimizedMeetingNotesDocumentSchema })
|