@snokam/mcp-api 0.106.1 → 0.107.0

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.
@@ -0,0 +1,1721 @@
1
+ {
2
+ "openapi": "3.0.4",
3
+ "info": {
4
+ "title": "ChatGPT API",
5
+ "description": "Azure OpenAI integrations",
6
+ "version": "v1.0.0"
7
+ },
8
+ "servers": [
9
+ {
10
+ "url": "https://chatgpt.api.test.snokam.no"
11
+ }
12
+ ],
13
+ "paths": {
14
+ "/v1.0/protected/health/{provider}": {
15
+ "get": {
16
+ "tags": [
17
+ "Health"
18
+ ],
19
+ "summary": "Checks an integration's connectivity",
20
+ "operationId": "ChatGptIntegrationHealth",
21
+ "parameters": [
22
+ {
23
+ "name": "provider",
24
+ "in": "path",
25
+ "required": true,
26
+ "schema": {
27
+ "type": "string"
28
+ }
29
+ }
30
+ ],
31
+ "responses": {
32
+ "200": {
33
+ "description": "Payload of IntegrationHealthResult",
34
+ "content": {
35
+ "application/json": {
36
+ "schema": {
37
+ "$ref": "#/components/schemas/integrationHealthResult"
38
+ }
39
+ }
40
+ },
41
+ "x-ms-summary": "Health result"
42
+ }
43
+ },
44
+ "security": [
45
+ {
46
+ "Implicit": [
47
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default"
48
+ ]
49
+ }
50
+ ]
51
+ }
52
+ },
53
+ "/v1.0/newsletter/summary": {
54
+ "post": {
55
+ "tags": [
56
+ "Newsletter"
57
+ ],
58
+ "summary": "Summarize newsletter of a given topic",
59
+ "description": "Reads last week's newsletter mails and returns summary",
60
+ "operationId": "summarizeNewsletter",
61
+ "parameters": [
62
+ {
63
+ "name": "topic",
64
+ "in": "query",
65
+ "description": "Topic to summarize, e.g. AI",
66
+ "schema": {
67
+ "type": "string"
68
+ },
69
+ "x-ms-summary": "Technology topic"
70
+ },
71
+ {
72
+ "name": "mailbox",
73
+ "in": "query",
74
+ "description": "Override the mailbox the summarizer reads, e.g. fag-feed@snokam.no. Falls back to the environment default.",
75
+ "schema": {
76
+ "type": "string"
77
+ },
78
+ "x-ms-summary": "Shared mailbox to read"
79
+ }
80
+ ],
81
+ "responses": {
82
+ "200": {
83
+ "description": "Summary of the newsletter for the specified topic",
84
+ "content": {
85
+ "application/json": {
86
+ "schema": {
87
+ "$ref": "#/components/schemas/simpleResponseDto"
88
+ }
89
+ }
90
+ },
91
+ "x-ms-summary": "Success"
92
+ }
93
+ }
94
+ }
95
+ },
96
+ "/v1.0/newsletter/single-news": {
97
+ "post": {
98
+ "tags": [
99
+ "AI News"
100
+ ],
101
+ "summary": "Get a single AI news item",
102
+ "description": "Fetches one AI news item from recent emails",
103
+ "operationId": "getSingleNews",
104
+ "parameters": [
105
+ {
106
+ "name": "topic",
107
+ "in": "query",
108
+ "description": "Topic to summarize, e.g. AI",
109
+ "schema": {
110
+ "type": "string"
111
+ },
112
+ "x-ms-summary": "Technology topic"
113
+ }
114
+ ],
115
+ "responses": {
116
+ "200": {
117
+ "description": "A single AI news item",
118
+ "content": {
119
+ "application/json": {
120
+ "schema": {
121
+ "$ref": "#/components/schemas/simpleResponseDto"
122
+ }
123
+ }
124
+ },
125
+ "x-ms-summary": "Success"
126
+ }
127
+ }
128
+ }
129
+ },
130
+ "/v1.0/protected/question": {
131
+ "get": {
132
+ "tags": [
133
+ "Question"
134
+ ],
135
+ "summary": "Synchronously answer a question using ChatGPT",
136
+ "description": "This function synchronously answers a question using ChatGPT.",
137
+ "operationId": "protectedSyncQuestion",
138
+ "parameters": [
139
+ {
140
+ "name": "input",
141
+ "in": "query",
142
+ "description": "The question input to be answered",
143
+ "required": true,
144
+ "schema": {
145
+ "type": "string"
146
+ },
147
+ "x-ms-summary": "The question input"
148
+ },
149
+ {
150
+ "name": "addDefaultPrompts",
151
+ "in": "query",
152
+ "description": "If true, default prompts from the Prompts folder will be added to the chat context.",
153
+ "schema": {
154
+ "type": "boolean"
155
+ },
156
+ "x-ms-summary": "Include Default Prompts"
157
+ },
158
+ {
159
+ "name": "addApiTools",
160
+ "in": "query",
161
+ "description": "If true, API tools will be added to the chat context.",
162
+ "schema": {
163
+ "type": "boolean"
164
+ },
165
+ "x-ms-summary": "Include API Tools"
166
+ }
167
+ ],
168
+ "responses": {
169
+ "200": {
170
+ "description": "Question answered successfully",
171
+ "content": {
172
+ "application/json": {
173
+ "schema": {
174
+ "$ref": "#/components/schemas/simpleResponseDto"
175
+ }
176
+ }
177
+ },
178
+ "x-ms-summary": "Success"
179
+ }
180
+ },
181
+ "security": [
182
+ {
183
+ "Implicit": [
184
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default"
185
+ ]
186
+ }
187
+ ]
188
+ }
189
+ },
190
+ "/v1.0/protected/question/async": {
191
+ "get": {
192
+ "tags": [
193
+ "Question"
194
+ ],
195
+ "summary": "Asynchronously answer a question using ChatGPT",
196
+ "description": "This function asynchronously answers a question using ChatGPT.",
197
+ "operationId": "protectedAsyncQuestion",
198
+ "parameters": [
199
+ {
200
+ "name": "input",
201
+ "in": "query",
202
+ "description": "The question input to be answered",
203
+ "required": true,
204
+ "schema": {
205
+ "type": "string"
206
+ },
207
+ "x-ms-summary": "The question input"
208
+ },
209
+ {
210
+ "name": "addDefaultPrompts",
211
+ "in": "query",
212
+ "description": "If true, default prompts from the Prompts folder will be added to the chat context.",
213
+ "schema": {
214
+ "type": "boolean"
215
+ },
216
+ "x-ms-summary": "Include Default Prompts"
217
+ },
218
+ {
219
+ "name": "addApiTools",
220
+ "in": "query",
221
+ "description": "If true, API tools will be added to the chat context.",
222
+ "schema": {
223
+ "type": "boolean"
224
+ },
225
+ "x-ms-summary": "Include API Tools"
226
+ }
227
+ ],
228
+ "responses": {
229
+ "200": {
230
+ "description": "Question answered successfully",
231
+ "x-ms-summary": "Success"
232
+ }
233
+ },
234
+ "security": [
235
+ {
236
+ "Implicit": [
237
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default"
238
+ ]
239
+ }
240
+ ]
241
+ }
242
+ },
243
+ "/v1.0/protected/conversation": {
244
+ "post": {
245
+ "tags": [
246
+ "Conversation"
247
+ ],
248
+ "summary": "Synchronously handle a conversation using ChatGPT",
249
+ "description": "This function synchronously handles a conversation using ChatGPT.",
250
+ "operationId": "protectedSyncConversation",
251
+ "parameters": [
252
+ {
253
+ "name": "addDefaultPrompts",
254
+ "in": "query",
255
+ "description": "If true, default prompts from the Prompts folder will be added to the chat context.",
256
+ "schema": {
257
+ "type": "boolean"
258
+ },
259
+ "x-ms-summary": "Include Default Prompts"
260
+ },
261
+ {
262
+ "name": "addApiTools",
263
+ "in": "query",
264
+ "description": "If true, API tools will be added to the chat context.",
265
+ "schema": {
266
+ "type": "boolean"
267
+ },
268
+ "x-ms-summary": "Include API Tools"
269
+ }
270
+ ],
271
+ "requestBody": {
272
+ "description": "List of chat messages",
273
+ "content": {
274
+ "application/json": {
275
+ "schema": {
276
+ "type": "array",
277
+ "items": {
278
+ "$ref": "#/components/schemas/inputChatMessage"
279
+ }
280
+ }
281
+ }
282
+ },
283
+ "required": true
284
+ },
285
+ "responses": {
286
+ "200": {
287
+ "description": "Conversation handled successfully",
288
+ "content": {
289
+ "application/json": {
290
+ "schema": {
291
+ "$ref": "#/components/schemas/simpleResponseDto"
292
+ }
293
+ }
294
+ },
295
+ "x-ms-summary": "Success"
296
+ }
297
+ },
298
+ "security": [
299
+ {
300
+ "Implicit": [
301
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default"
302
+ ]
303
+ }
304
+ ]
305
+ }
306
+ },
307
+ "/v1.0/protected/conversation/async": {
308
+ "post": {
309
+ "tags": [
310
+ "Conversation"
311
+ ],
312
+ "summary": "Asynchronously handle a conversation using ChatGPT",
313
+ "description": "This function asynchronously handles a conversation using ChatGPT.",
314
+ "operationId": "protectedAsyncConversation",
315
+ "parameters": [
316
+ {
317
+ "name": "addDefaultPrompts",
318
+ "in": "query",
319
+ "description": "If true, default prompts from the Prompts folder will be added to the chat context.",
320
+ "schema": {
321
+ "type": "boolean"
322
+ },
323
+ "x-ms-summary": "Include Default Prompts"
324
+ },
325
+ {
326
+ "name": "addApiTools",
327
+ "in": "query",
328
+ "description": "If true, API tools will be added to the chat context.",
329
+ "schema": {
330
+ "type": "boolean"
331
+ },
332
+ "x-ms-summary": "Include API Tools"
333
+ }
334
+ ],
335
+ "requestBody": {
336
+ "description": "List of chat messages",
337
+ "content": {
338
+ "application/json": {
339
+ "schema": {
340
+ "type": "array",
341
+ "items": {
342
+ "$ref": "#/components/schemas/inputChatMessage"
343
+ }
344
+ }
345
+ }
346
+ },
347
+ "required": true
348
+ },
349
+ "responses": {
350
+ "200": {
351
+ "description": "Conversation handled successfully",
352
+ "x-ms-summary": "Success"
353
+ }
354
+ },
355
+ "security": [
356
+ {
357
+ "Implicit": [
358
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default"
359
+ ]
360
+ }
361
+ ]
362
+ }
363
+ },
364
+ "/v1.0/question": {
365
+ "get": {
366
+ "tags": [
367
+ "Question"
368
+ ],
369
+ "summary": "Synchronously answer a question using ChatGPT",
370
+ "description": "This function synchronously answers a question using ChatGPT.",
371
+ "operationId": "syncQuestion",
372
+ "parameters": [
373
+ {
374
+ "name": "input",
375
+ "in": "query",
376
+ "description": "The question input to be answered",
377
+ "required": true,
378
+ "schema": {
379
+ "type": "string"
380
+ },
381
+ "x-ms-summary": "The question input"
382
+ },
383
+ {
384
+ "name": "addDefaultPrompts",
385
+ "in": "query",
386
+ "description": "If true, default prompts from the Prompts folder will be added to the chat context.",
387
+ "schema": {
388
+ "type": "boolean"
389
+ },
390
+ "x-ms-summary": "Include Default Prompts"
391
+ },
392
+ {
393
+ "name": "addApiTools",
394
+ "in": "query",
395
+ "description": "If true, API tools will be added to the chat context.",
396
+ "schema": {
397
+ "type": "boolean"
398
+ },
399
+ "x-ms-summary": "Include API Tools"
400
+ }
401
+ ],
402
+ "responses": {
403
+ "200": {
404
+ "description": "Question answered successfully",
405
+ "content": {
406
+ "application/json": {
407
+ "schema": {
408
+ "$ref": "#/components/schemas/simpleResponseDto"
409
+ }
410
+ }
411
+ },
412
+ "x-ms-summary": "Success"
413
+ }
414
+ }
415
+ }
416
+ },
417
+ "/v1.0/question/async": {
418
+ "get": {
419
+ "tags": [
420
+ "Question"
421
+ ],
422
+ "summary": "Asynchronously answer a question using ChatGPT",
423
+ "description": "This function asynchronously answers a question using ChatGPT.",
424
+ "operationId": "asyncQuestion",
425
+ "parameters": [
426
+ {
427
+ "name": "input",
428
+ "in": "query",
429
+ "description": "The question input to be answered",
430
+ "required": true,
431
+ "schema": {
432
+ "type": "string"
433
+ },
434
+ "x-ms-summary": "The question input"
435
+ },
436
+ {
437
+ "name": "addDefaultPrompts",
438
+ "in": "query",
439
+ "description": "If true, default prompts from the Prompts folder will be added to the chat context.",
440
+ "schema": {
441
+ "type": "boolean"
442
+ },
443
+ "x-ms-summary": "Include Default Prompts"
444
+ },
445
+ {
446
+ "name": "addApiTools",
447
+ "in": "query",
448
+ "description": "If true, API tools will be added to the chat context.",
449
+ "schema": {
450
+ "type": "boolean"
451
+ },
452
+ "x-ms-summary": "Include API Tools"
453
+ }
454
+ ],
455
+ "responses": {
456
+ "200": {
457
+ "description": "Question answered successfully",
458
+ "x-ms-summary": "Success"
459
+ }
460
+ }
461
+ }
462
+ },
463
+ "/v1.0/conversation": {
464
+ "post": {
465
+ "tags": [
466
+ "Conversation"
467
+ ],
468
+ "summary": "Synchronously handle a conversation using ChatGPT",
469
+ "description": "This function synchronously handles a conversation using ChatGPT.",
470
+ "operationId": "syncConversation",
471
+ "parameters": [
472
+ {
473
+ "name": "addDefaultPrompts",
474
+ "in": "query",
475
+ "description": "If true, default prompts from the Prompts folder will be added to the chat context.",
476
+ "schema": {
477
+ "type": "boolean"
478
+ },
479
+ "x-ms-summary": "Include Default Prompts"
480
+ },
481
+ {
482
+ "name": "addApiTools",
483
+ "in": "query",
484
+ "description": "If true, API tools will be added to the chat context.",
485
+ "schema": {
486
+ "type": "boolean"
487
+ },
488
+ "x-ms-summary": "Include API Tools"
489
+ }
490
+ ],
491
+ "requestBody": {
492
+ "description": "List of chat messages",
493
+ "content": {
494
+ "application/json": {
495
+ "schema": {
496
+ "type": "array",
497
+ "items": {
498
+ "$ref": "#/components/schemas/inputChatMessage"
499
+ }
500
+ }
501
+ }
502
+ },
503
+ "required": true
504
+ },
505
+ "responses": {
506
+ "200": {
507
+ "description": "Conversation handled successfully",
508
+ "content": {
509
+ "application/json": {
510
+ "schema": {
511
+ "$ref": "#/components/schemas/simpleResponseDto"
512
+ }
513
+ }
514
+ },
515
+ "x-ms-summary": "Success"
516
+ }
517
+ }
518
+ }
519
+ },
520
+ "/v1.0/conversation/async": {
521
+ "post": {
522
+ "tags": [
523
+ "Conversation"
524
+ ],
525
+ "summary": "Asynchronously handle a conversation using ChatGPT",
526
+ "description": "This function asynchronously handles a conversation using ChatGPT.",
527
+ "operationId": "asyncConversation",
528
+ "parameters": [
529
+ {
530
+ "name": "addDefaultPrompts",
531
+ "in": "query",
532
+ "description": "If true, default prompts from the Prompts folder will be added to the chat context.",
533
+ "schema": {
534
+ "type": "boolean"
535
+ },
536
+ "x-ms-summary": "Include Default Prompts"
537
+ },
538
+ {
539
+ "name": "addApiTools",
540
+ "in": "query",
541
+ "description": "If true, API tools will be added to the chat context.",
542
+ "schema": {
543
+ "type": "boolean"
544
+ },
545
+ "x-ms-summary": "Include API Tools"
546
+ }
547
+ ],
548
+ "requestBody": {
549
+ "description": "List of chat messages",
550
+ "content": {
551
+ "application/json": {
552
+ "schema": {
553
+ "type": "array",
554
+ "items": {
555
+ "$ref": "#/components/schemas/inputChatMessage"
556
+ }
557
+ }
558
+ }
559
+ },
560
+ "required": true
561
+ },
562
+ "responses": {
563
+ "200": {
564
+ "description": "Conversation handled successfully",
565
+ "x-ms-summary": "Success"
566
+ }
567
+ }
568
+ }
569
+ },
570
+ "/v1.0/public/blob-storage": {
571
+ "get": {
572
+ "tags": [
573
+ "Tokens"
574
+ ],
575
+ "summary": "Gets blob storage and creates sas token",
576
+ "description": "Generates a sas token for use to upload image and video memories to azure blob storage",
577
+ "operationId": "GetBlobStorage",
578
+ "responses": {
579
+ "200": {
580
+ "description": "Generated token",
581
+ "content": {
582
+ "application/json": {
583
+ "schema": {
584
+ "$ref": "#/components/schemas/azureBlobStorageCredentials"
585
+ }
586
+ }
587
+ },
588
+ "x-ms-summary": "Success"
589
+ },
590
+ "401": {
591
+ "description": "User is not authorized",
592
+ "x-ms-summary": "Unauthorized"
593
+ }
594
+ }
595
+ }
596
+ },
597
+ "/v1.0/slack/event": {
598
+ "post": {
599
+ "tags": [
600
+ "Slack"
601
+ ],
602
+ "summary": "Handle a Slack event",
603
+ "description": "This function handles a Slack event.",
604
+ "operationId": "slackEvent",
605
+ "requestBody": {
606
+ "description": "Slack event data",
607
+ "content": {
608
+ "application/json": {
609
+ "schema": {
610
+ "$ref": "#/components/schemas/slackEvent"
611
+ }
612
+ }
613
+ },
614
+ "required": true
615
+ },
616
+ "responses": {
617
+ "200": {
618
+ "description": "Slack event handled successfully",
619
+ "content": {
620
+ "application/json": {
621
+ "schema": {
622
+ "$ref": "#/components/schemas/slackEvent"
623
+ }
624
+ }
625
+ },
626
+ "x-ms-summary": "Success"
627
+ },
628
+ "204": {
629
+ "description": "No relevant Slack event found",
630
+ "x-ms-summary": "No Content"
631
+ }
632
+ }
633
+ }
634
+ },
635
+ "/v1.0/realtime/get-ephemeral-token": {
636
+ "post": {
637
+ "tags": [
638
+ "Realtime"
639
+ ],
640
+ "summary": "Get ephemeral token for Azure OpenAI realtime session",
641
+ "description": "Returns Azure OpenAI connection details for a realtime session. Use `agent` query param to switch assistant behavior.",
642
+ "operationId": "GetEphemeralToken",
643
+ "parameters": [
644
+ {
645
+ "name": "agent",
646
+ "in": "query",
647
+ "schema": {
648
+ "type": "string"
649
+ },
650
+ "x-ms-summary": "Agent (e.g. 'create-event', 'default')"
651
+ },
652
+ {
653
+ "name": "voice",
654
+ "in": "query",
655
+ "schema": {
656
+ "type": "string"
657
+ },
658
+ "x-ms-summary": "Voice (e.g. 'ash', 'alloy')"
659
+ }
660
+ ],
661
+ "responses": {
662
+ "200": {
663
+ "description": "Payload of RealtimeSession",
664
+ "content": {
665
+ "application/json": {
666
+ "schema": {
667
+ "$ref": "#/components/schemas/realtimeSession"
668
+ }
669
+ }
670
+ },
671
+ "x-ms-summary": "Session started"
672
+ }
673
+ }
674
+ }
675
+ },
676
+ "/v1.0/realtime/agents": {
677
+ "get": {
678
+ "tags": [
679
+ "Realtime"
680
+ ],
681
+ "summary": "List all available contexts",
682
+ "description": "Lists all predefined context modes for GPT-4o realtime sessions",
683
+ "operationId": "GetAvailableAgents",
684
+ "responses": {
685
+ "200": {
686
+ "description": "Payload of Array of RealtimeAgentsDto",
687
+ "content": {
688
+ "application/json": {
689
+ "schema": {
690
+ "type": "array",
691
+ "items": {
692
+ "$ref": "#/components/schemas/realtimeAgentsDto"
693
+ }
694
+ }
695
+ }
696
+ },
697
+ "x-ms-summary": "Contexts listed"
698
+ }
699
+ }
700
+ }
701
+ },
702
+ "/followup-email": {
703
+ "post": {
704
+ "tags": [
705
+ "Follow-up Email"
706
+ ],
707
+ "summary": "Generate a follow-up email for a company, and save it as a draft in the pre-configured mailbox",
708
+ "description": "Generates a personalized follow-up email using Salesforce data and external research",
709
+ "operationId": "generateFollowUpEmail",
710
+ "parameters": [
711
+ {
712
+ "name": "companyName",
713
+ "in": "query",
714
+ "description": "The name of the company to generate a follow-up email for",
715
+ "required": true,
716
+ "schema": {
717
+ "type": "string"
718
+ },
719
+ "x-ms-summary": "Company name"
720
+ }
721
+ ],
722
+ "responses": {
723
+ "200": {
724
+ "description": "The generated follow-up email",
725
+ "content": {
726
+ "application/json": {
727
+ "schema": {
728
+ "$ref": "#/components/schemas/followUpEmailResponse"
729
+ }
730
+ }
731
+ },
732
+ "x-ms-summary": "Success"
733
+ },
734
+ "400": {
735
+ "description": "Invalid input parameters",
736
+ "content": {
737
+ "application/json": {
738
+ "schema": {
739
+ "$ref": "#/components/schemas/errorResponse"
740
+ }
741
+ }
742
+ },
743
+ "x-ms-summary": "Bad Request"
744
+ },
745
+ "500": {
746
+ "description": "An error occurred while generating the email",
747
+ "content": {
748
+ "application/json": {
749
+ "schema": {
750
+ "$ref": "#/components/schemas/errorResponse"
751
+ }
752
+ }
753
+ },
754
+ "x-ms-summary": "Internal Server Error"
755
+ }
756
+ },
757
+ "security": [
758
+ {
759
+ "Implicit": [
760
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default"
761
+ ]
762
+ }
763
+ ]
764
+ },
765
+ "get": {
766
+ "tags": [
767
+ "Follow-up Email"
768
+ ],
769
+ "summary": "Generate follow-up email content for a company",
770
+ "description": "Generates personalized follow-up email content using Salesforce data and external research. Returns the email content without creating a draft.",
771
+ "operationId": "generateFollowUpEmailGet",
772
+ "parameters": [
773
+ {
774
+ "name": "companyName",
775
+ "in": "query",
776
+ "description": "The name of the company to generate a follow-up email for",
777
+ "required": true,
778
+ "schema": {
779
+ "type": "string"
780
+ },
781
+ "x-ms-summary": "Company name"
782
+ }
783
+ ],
784
+ "responses": {
785
+ "200": {
786
+ "description": "The generated follow-up email content",
787
+ "content": {
788
+ "application/json": {
789
+ "schema": {
790
+ "$ref": "#/components/schemas/emailContentResponse"
791
+ }
792
+ }
793
+ },
794
+ "x-ms-summary": "Success"
795
+ },
796
+ "400": {
797
+ "description": "Invalid input parameters",
798
+ "content": {
799
+ "application/json": {
800
+ "schema": {
801
+ "$ref": "#/components/schemas/errorResponse"
802
+ }
803
+ }
804
+ },
805
+ "x-ms-summary": "Bad Request"
806
+ },
807
+ "500": {
808
+ "description": "An error occurred while generating the email",
809
+ "content": {
810
+ "application/json": {
811
+ "schema": {
812
+ "$ref": "#/components/schemas/errorResponse"
813
+ }
814
+ }
815
+ },
816
+ "x-ms-summary": "Internal Server Error"
817
+ }
818
+ },
819
+ "security": [
820
+ {
821
+ "Implicit": [
822
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default"
823
+ ]
824
+ }
825
+ ]
826
+ }
827
+ },
828
+ "/followup-email/contact": {
829
+ "post": {
830
+ "tags": [
831
+ "Follow-up Email"
832
+ ],
833
+ "summary": "Generate a follow-up email for a specific contact, and save it as a draft in the pre-configured mailbox",
834
+ "description": "Generates a personalized follow-up email using Salesforce contact data and external research. No email will be sent automatically, but the email will be saved as a draft.",
835
+ "operationId": "generateFollowUpEmailByContact",
836
+ "parameters": [
837
+ {
838
+ "name": "contactId",
839
+ "in": "query",
840
+ "description": "The Salesforce ID of the contact to generate a follow-up email for",
841
+ "required": true,
842
+ "schema": {
843
+ "type": "string"
844
+ },
845
+ "x-ms-summary": "Contact ID"
846
+ }
847
+ ],
848
+ "responses": {
849
+ "200": {
850
+ "description": "The generated follow-up email",
851
+ "content": {
852
+ "application/json": {
853
+ "schema": {
854
+ "$ref": "#/components/schemas/followUpEmailResponse"
855
+ }
856
+ }
857
+ },
858
+ "x-ms-summary": "Success"
859
+ },
860
+ "400": {
861
+ "description": "Invalid input parameters",
862
+ "content": {
863
+ "application/json": {
864
+ "schema": {
865
+ "$ref": "#/components/schemas/errorResponse"
866
+ }
867
+ }
868
+ },
869
+ "x-ms-summary": "Bad Request"
870
+ },
871
+ "500": {
872
+ "description": "An error occurred while generating the email",
873
+ "content": {
874
+ "application/json": {
875
+ "schema": {
876
+ "$ref": "#/components/schemas/errorResponse"
877
+ }
878
+ }
879
+ },
880
+ "x-ms-summary": "Internal Server Error"
881
+ }
882
+ },
883
+ "security": [
884
+ {
885
+ "Implicit": [
886
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default"
887
+ ]
888
+ }
889
+ ]
890
+ },
891
+ "get": {
892
+ "tags": [
893
+ "Follow-up Email"
894
+ ],
895
+ "summary": "Generate follow-up email content for a specific contact",
896
+ "description": "Generates personalized follow-up email content using Salesforce contact data and external research. Returns the email content without creating a draft.",
897
+ "operationId": "generateFollowUpEmailByContactGet",
898
+ "parameters": [
899
+ {
900
+ "name": "contactId",
901
+ "in": "query",
902
+ "description": "The Salesforce ID of the contact to generate a follow-up email for",
903
+ "required": true,
904
+ "schema": {
905
+ "type": "string"
906
+ },
907
+ "x-ms-summary": "Contact ID"
908
+ }
909
+ ],
910
+ "responses": {
911
+ "200": {
912
+ "description": "The generated follow-up email content",
913
+ "content": {
914
+ "application/json": {
915
+ "schema": {
916
+ "$ref": "#/components/schemas/emailContentResponse"
917
+ }
918
+ }
919
+ },
920
+ "x-ms-summary": "Success"
921
+ },
922
+ "400": {
923
+ "description": "Invalid input parameters",
924
+ "content": {
925
+ "application/json": {
926
+ "schema": {
927
+ "$ref": "#/components/schemas/errorResponse"
928
+ }
929
+ }
930
+ },
931
+ "x-ms-summary": "Bad Request"
932
+ },
933
+ "500": {
934
+ "description": "An error occurred while generating the email",
935
+ "content": {
936
+ "application/json": {
937
+ "schema": {
938
+ "$ref": "#/components/schemas/errorResponse"
939
+ }
940
+ }
941
+ },
942
+ "x-ms-summary": "Internal Server Error"
943
+ }
944
+ },
945
+ "security": [
946
+ {
947
+ "Implicit": [
948
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default"
949
+ ]
950
+ }
951
+ ]
952
+ }
953
+ },
954
+ "/followup-email/automated": {
955
+ "post": {
956
+ "tags": [
957
+ "Automated Follow-up"
958
+ ],
959
+ "summary": "Process automated follow-up emails for strategic priority contacts",
960
+ "description": "Processes strategic priority contacts with LastActivity > specified days or null, creating draft emails if no existing drafts exist. This is the same logic that runs daily via CronJob.",
961
+ "operationId": "processAutomatedFollowUpEmails",
962
+ "parameters": [
963
+ {
964
+ "name": "priority",
965
+ "in": "query",
966
+ "description": "The strategic priority to filter contacts. Valid values: A, B, C, D (default: D)",
967
+ "schema": {
968
+ "type": "string"
969
+ },
970
+ "x-ms-summary": "Strategic priority"
971
+ },
972
+ {
973
+ "name": "daysBack",
974
+ "in": "query",
975
+ "description": "Number of days to look back for last activity (default: 90)",
976
+ "schema": {
977
+ "type": "integer",
978
+ "format": "int32"
979
+ },
980
+ "x-ms-summary": "Days back"
981
+ }
982
+ ],
983
+ "responses": {
984
+ "200": {
985
+ "description": "The processing results",
986
+ "content": {
987
+ "application/json": {
988
+ "schema": {
989
+ "$ref": "#/components/schemas/followUpEmailResponse"
990
+ }
991
+ }
992
+ },
993
+ "x-ms-summary": "Success"
994
+ },
995
+ "500": {
996
+ "description": "An error occurred while processing automated follow-ups",
997
+ "content": {
998
+ "application/json": {
999
+ "schema": {
1000
+ "$ref": "#/components/schemas/errorResponse"
1001
+ }
1002
+ }
1003
+ },
1004
+ "x-ms-summary": "Internal Server Error"
1005
+ }
1006
+ },
1007
+ "security": [
1008
+ {
1009
+ "Implicit": [
1010
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default"
1011
+ ]
1012
+ }
1013
+ ]
1014
+ }
1015
+ }
1016
+ },
1017
+ "components": {
1018
+ "schemas": {
1019
+ "authorization": {
1020
+ "type": "object",
1021
+ "properties": {
1022
+ "enterprise_id": {
1023
+ "type": "object",
1024
+ "nullable": true
1025
+ },
1026
+ "team_id": {
1027
+ "type": "string",
1028
+ "nullable": true
1029
+ },
1030
+ "user_id": {
1031
+ "type": "string",
1032
+ "nullable": true
1033
+ },
1034
+ "is_bot": {
1035
+ "type": "boolean",
1036
+ "nullable": true
1037
+ },
1038
+ "is_enterprise_install": {
1039
+ "type": "boolean",
1040
+ "nullable": true
1041
+ }
1042
+ }
1043
+ },
1044
+ "azureBlobStorageCredentials": {
1045
+ "type": "object",
1046
+ "properties": {
1047
+ "blobUrl": {
1048
+ "type": "string"
1049
+ },
1050
+ "sasToken": {
1051
+ "type": "string"
1052
+ },
1053
+ "additionalProperties": {
1054
+ "type": "object",
1055
+ "additionalProperties": {
1056
+ "type": "object"
1057
+ }
1058
+ }
1059
+ }
1060
+ },
1061
+ "clientSecret": {
1062
+ "type": "object",
1063
+ "properties": {
1064
+ "value": {
1065
+ "type": "string",
1066
+ "nullable": true
1067
+ },
1068
+ "expires_at": {
1069
+ "type": "integer",
1070
+ "format": "int64",
1071
+ "nullable": true
1072
+ }
1073
+ },
1074
+ "nullable": true
1075
+ },
1076
+ "emailContentResponse": {
1077
+ "type": "object",
1078
+ "properties": {
1079
+ "success": {
1080
+ "type": "boolean"
1081
+ },
1082
+ "message": {
1083
+ "type": "string"
1084
+ },
1085
+ "subject": {
1086
+ "type": "string"
1087
+ },
1088
+ "body": {
1089
+ "type": "string"
1090
+ },
1091
+ "companyName": {
1092
+ "type": "string"
1093
+ },
1094
+ "contactId": {
1095
+ "type": "string"
1096
+ },
1097
+ "salesforceData": {
1098
+ "type": "string"
1099
+ },
1100
+ "externalResearch": {
1101
+ "type": "string"
1102
+ }
1103
+ }
1104
+ },
1105
+ "errorResponse": {
1106
+ "type": "object",
1107
+ "properties": {
1108
+ "error": {
1109
+ "type": "string"
1110
+ },
1111
+ "message": {
1112
+ "type": "string"
1113
+ },
1114
+ "details": {
1115
+ "type": "string"
1116
+ }
1117
+ }
1118
+ },
1119
+ "event": {
1120
+ "type": "object",
1121
+ "properties": {
1122
+ "type": {
1123
+ "type": "string",
1124
+ "nullable": true
1125
+ },
1126
+ "text": {
1127
+ "type": "string",
1128
+ "nullable": true
1129
+ },
1130
+ "files": {
1131
+ "type": "array",
1132
+ "items": {
1133
+ "$ref": "#/components/schemas/file"
1134
+ },
1135
+ "nullable": true
1136
+ },
1137
+ "upload": {
1138
+ "type": "boolean",
1139
+ "nullable": true
1140
+ },
1141
+ "user": {
1142
+ "type": "string",
1143
+ "nullable": true
1144
+ },
1145
+ "display_as_bot": {
1146
+ "type": "boolean",
1147
+ "nullable": true
1148
+ },
1149
+ "bot_id": {
1150
+ "type": "string",
1151
+ "nullable": true
1152
+ },
1153
+ "ts": {
1154
+ "type": "string",
1155
+ "nullable": true
1156
+ },
1157
+ "channel": {
1158
+ "type": "string",
1159
+ "nullable": true
1160
+ },
1161
+ "subtype": {
1162
+ "type": "string",
1163
+ "nullable": true
1164
+ },
1165
+ "event_ts": {
1166
+ "type": "string",
1167
+ "nullable": true
1168
+ },
1169
+ "channel_type": {
1170
+ "type": "string",
1171
+ "nullable": true
1172
+ }
1173
+ },
1174
+ "nullable": true
1175
+ },
1176
+ "file": {
1177
+ "type": "object",
1178
+ "properties": {
1179
+ "id": {
1180
+ "type": "string",
1181
+ "nullable": true
1182
+ },
1183
+ "created": {
1184
+ "type": "integer",
1185
+ "format": "int32",
1186
+ "nullable": true
1187
+ },
1188
+ "timestamp": {
1189
+ "type": "integer",
1190
+ "format": "int32",
1191
+ "nullable": true
1192
+ },
1193
+ "name": {
1194
+ "type": "string",
1195
+ "nullable": true
1196
+ },
1197
+ "title": {
1198
+ "type": "string",
1199
+ "nullable": true
1200
+ },
1201
+ "mimetype": {
1202
+ "type": "string",
1203
+ "nullable": true
1204
+ },
1205
+ "filetype": {
1206
+ "type": "string",
1207
+ "nullable": true
1208
+ },
1209
+ "pretty_type": {
1210
+ "type": "string",
1211
+ "nullable": true
1212
+ },
1213
+ "user": {
1214
+ "type": "string",
1215
+ "nullable": true
1216
+ },
1217
+ "user_team": {
1218
+ "type": "string",
1219
+ "nullable": true
1220
+ },
1221
+ "editable": {
1222
+ "type": "boolean",
1223
+ "nullable": true
1224
+ },
1225
+ "size": {
1226
+ "type": "integer",
1227
+ "format": "int32",
1228
+ "nullable": true
1229
+ },
1230
+ "mode": {
1231
+ "type": "string",
1232
+ "nullable": true
1233
+ },
1234
+ "is_external": {
1235
+ "type": "boolean",
1236
+ "nullable": true
1237
+ },
1238
+ "external_type": {
1239
+ "type": "string",
1240
+ "nullable": true
1241
+ },
1242
+ "is_public": {
1243
+ "type": "boolean",
1244
+ "nullable": true
1245
+ },
1246
+ "public_url_shared": {
1247
+ "type": "boolean",
1248
+ "nullable": true
1249
+ },
1250
+ "display_as_bot": {
1251
+ "type": "boolean",
1252
+ "nullable": true
1253
+ },
1254
+ "username": {
1255
+ "type": "string",
1256
+ "nullable": true
1257
+ },
1258
+ "url_private": {
1259
+ "type": "string",
1260
+ "nullable": true
1261
+ },
1262
+ "url_private_download": {
1263
+ "type": "string",
1264
+ "nullable": true
1265
+ },
1266
+ "permalink": {
1267
+ "type": "string",
1268
+ "nullable": true
1269
+ },
1270
+ "permalink_public": {
1271
+ "type": "string",
1272
+ "nullable": true
1273
+ },
1274
+ "subject": {
1275
+ "type": "string",
1276
+ "nullable": true
1277
+ },
1278
+ "to": {
1279
+ "type": "array",
1280
+ "items": {
1281
+ "$ref": "#/components/schemas/to"
1282
+ },
1283
+ "nullable": true
1284
+ },
1285
+ "from": {
1286
+ "type": "array",
1287
+ "items": {
1288
+ "$ref": "#/components/schemas/from"
1289
+ },
1290
+ "nullable": true
1291
+ },
1292
+ "cc": {
1293
+ "type": "array",
1294
+ "items": {
1295
+ "type": "object"
1296
+ },
1297
+ "nullable": true
1298
+ },
1299
+ "attachments": {
1300
+ "type": "array",
1301
+ "items": {
1302
+ "type": "object"
1303
+ },
1304
+ "nullable": true
1305
+ },
1306
+ "original_attachment_count": {
1307
+ "type": "integer",
1308
+ "format": "int32",
1309
+ "nullable": true
1310
+ },
1311
+ "plain_text": {
1312
+ "type": "string",
1313
+ "nullable": true
1314
+ },
1315
+ "preview": {
1316
+ "type": "string",
1317
+ "nullable": true
1318
+ },
1319
+ "preview_plain_text": {
1320
+ "type": "string",
1321
+ "nullable": true
1322
+ },
1323
+ "headers": {
1324
+ "$ref": "#/components/schemas/headers"
1325
+ },
1326
+ "has_more": {
1327
+ "type": "boolean",
1328
+ "nullable": true
1329
+ },
1330
+ "sent_to_self": {
1331
+ "type": "boolean",
1332
+ "nullable": true
1333
+ },
1334
+ "bot_id": {
1335
+ "type": "string",
1336
+ "nullable": true
1337
+ },
1338
+ "has_rich_preview": {
1339
+ "type": "boolean",
1340
+ "nullable": true
1341
+ },
1342
+ "file_access": {
1343
+ "type": "string",
1344
+ "nullable": true
1345
+ }
1346
+ }
1347
+ },
1348
+ "followUpEmailResponse": {
1349
+ "type": "object",
1350
+ "properties": {
1351
+ "success": {
1352
+ "type": "boolean"
1353
+ },
1354
+ "message": {
1355
+ "type": "string"
1356
+ },
1357
+ "result": {
1358
+ "type": "string"
1359
+ },
1360
+ "companyName": {
1361
+ "type": "string"
1362
+ },
1363
+ "contactId": {
1364
+ "type": "string"
1365
+ }
1366
+ }
1367
+ },
1368
+ "from": {
1369
+ "type": "object",
1370
+ "properties": {
1371
+ "address": {
1372
+ "type": "string",
1373
+ "nullable": true
1374
+ },
1375
+ "name": {
1376
+ "type": "string",
1377
+ "nullable": true
1378
+ },
1379
+ "original": {
1380
+ "type": "string",
1381
+ "nullable": true
1382
+ }
1383
+ }
1384
+ },
1385
+ "headers": {
1386
+ "type": "object",
1387
+ "properties": {
1388
+ "date": {
1389
+ "type": "string",
1390
+ "nullable": true
1391
+ },
1392
+ "in_reply_to": {
1393
+ "type": "string",
1394
+ "nullable": true
1395
+ },
1396
+ "reply_to": {
1397
+ "type": "object",
1398
+ "nullable": true
1399
+ },
1400
+ "message_id": {
1401
+ "type": "string",
1402
+ "nullable": true
1403
+ }
1404
+ },
1405
+ "nullable": true
1406
+ },
1407
+ "inputChatMessage": {
1408
+ "type": "object",
1409
+ "properties": {
1410
+ "role": {
1411
+ "type": "string"
1412
+ },
1413
+ "content": {
1414
+ "type": "string"
1415
+ },
1416
+ "type": {
1417
+ "type": "string"
1418
+ }
1419
+ }
1420
+ },
1421
+ "integrationHealthResult": {
1422
+ "type": "object",
1423
+ "properties": {
1424
+ "key": {
1425
+ "type": "string"
1426
+ },
1427
+ "status": {
1428
+ "type": "string"
1429
+ },
1430
+ "message": {
1431
+ "type": "string"
1432
+ }
1433
+ }
1434
+ },
1435
+ "parameters": {
1436
+ "type": "object",
1437
+ "properties": {
1438
+ "type": {
1439
+ "type": "string",
1440
+ "nullable": true
1441
+ },
1442
+ "properties": {
1443
+ "type": "object",
1444
+ "additionalProperties": {
1445
+ "$ref": "#/components/schemas/property"
1446
+ },
1447
+ "nullable": true
1448
+ },
1449
+ "required": {
1450
+ "type": "array",
1451
+ "items": {
1452
+ "type": "string"
1453
+ },
1454
+ "nullable": true
1455
+ }
1456
+ },
1457
+ "nullable": true
1458
+ },
1459
+ "property": {
1460
+ "type": "object",
1461
+ "properties": {
1462
+ "type": {
1463
+ "type": "string",
1464
+ "nullable": true
1465
+ },
1466
+ "description": {
1467
+ "type": "string",
1468
+ "nullable": true
1469
+ }
1470
+ }
1471
+ },
1472
+ "realtimeAgentsDto": {
1473
+ "type": "object",
1474
+ "properties": {
1475
+ "context": {
1476
+ "type": "string"
1477
+ },
1478
+ "description": {
1479
+ "type": "string"
1480
+ }
1481
+ }
1482
+ },
1483
+ "realtimeSession": {
1484
+ "type": "object",
1485
+ "properties": {
1486
+ "id": {
1487
+ "type": "string",
1488
+ "nullable": true
1489
+ },
1490
+ "object": {
1491
+ "type": "string",
1492
+ "nullable": true
1493
+ },
1494
+ "expires_at": {
1495
+ "type": "integer",
1496
+ "format": "int64",
1497
+ "nullable": true
1498
+ },
1499
+ "input_audio_noise_reduction": {
1500
+ "type": "object",
1501
+ "nullable": true
1502
+ },
1503
+ "turn_detection": {
1504
+ "$ref": "#/components/schemas/turnDetection"
1505
+ },
1506
+ "input_audio_format": {
1507
+ "type": "string",
1508
+ "nullable": true
1509
+ },
1510
+ "input_audio_transcription": {
1511
+ "type": "object",
1512
+ "nullable": true
1513
+ },
1514
+ "client_secret": {
1515
+ "$ref": "#/components/schemas/clientSecret"
1516
+ },
1517
+ "realtime_url": {
1518
+ "type": "string",
1519
+ "nullable": true
1520
+ },
1521
+ "include": {
1522
+ "type": "object",
1523
+ "nullable": true
1524
+ },
1525
+ "model": {
1526
+ "type": "string",
1527
+ "nullable": true
1528
+ },
1529
+ "modalities": {
1530
+ "type": "array",
1531
+ "items": {
1532
+ "type": "string"
1533
+ },
1534
+ "nullable": true
1535
+ },
1536
+ "instructions": {
1537
+ "type": "string",
1538
+ "nullable": true
1539
+ },
1540
+ "voice": {
1541
+ "type": "string",
1542
+ "nullable": true
1543
+ },
1544
+ "output_audio_format": {
1545
+ "type": "string",
1546
+ "nullable": true
1547
+ },
1548
+ "tool_choice": {
1549
+ "type": "string",
1550
+ "nullable": true
1551
+ },
1552
+ "temperature": {
1553
+ "type": "number",
1554
+ "format": "double",
1555
+ "nullable": true
1556
+ },
1557
+ "max_response_output_tokens": {
1558
+ "type": "string",
1559
+ "nullable": true
1560
+ },
1561
+ "tools": {
1562
+ "type": "array",
1563
+ "items": {
1564
+ "$ref": "#/components/schemas/tool"
1565
+ },
1566
+ "nullable": true
1567
+ }
1568
+ }
1569
+ },
1570
+ "simpleResponseDto": {
1571
+ "type": "object",
1572
+ "properties": {
1573
+ "answer": {
1574
+ "type": "string"
1575
+ }
1576
+ }
1577
+ },
1578
+ "slackEvent": {
1579
+ "type": "object",
1580
+ "properties": {
1581
+ "token": {
1582
+ "type": "string",
1583
+ "nullable": true
1584
+ },
1585
+ "team_id": {
1586
+ "type": "string",
1587
+ "nullable": true
1588
+ },
1589
+ "context_team_id": {
1590
+ "type": "string",
1591
+ "nullable": true
1592
+ },
1593
+ "context_enterprise_id": {
1594
+ "type": "object",
1595
+ "nullable": true
1596
+ },
1597
+ "api_app_id": {
1598
+ "type": "string",
1599
+ "nullable": true
1600
+ },
1601
+ "event": {
1602
+ "$ref": "#/components/schemas/event"
1603
+ },
1604
+ "type": {
1605
+ "type": "string",
1606
+ "nullable": true
1607
+ },
1608
+ "event_id": {
1609
+ "type": "string",
1610
+ "nullable": true
1611
+ },
1612
+ "event_time": {
1613
+ "type": "integer",
1614
+ "format": "int32",
1615
+ "nullable": true
1616
+ },
1617
+ "authorizations": {
1618
+ "type": "array",
1619
+ "items": {
1620
+ "$ref": "#/components/schemas/authorization"
1621
+ },
1622
+ "nullable": true
1623
+ },
1624
+ "is_ext_shared_channel": {
1625
+ "type": "boolean",
1626
+ "nullable": true
1627
+ },
1628
+ "event_context": {
1629
+ "type": "string",
1630
+ "nullable": true
1631
+ }
1632
+ }
1633
+ },
1634
+ "to": {
1635
+ "type": "object",
1636
+ "properties": {
1637
+ "address": {
1638
+ "type": "string",
1639
+ "nullable": true
1640
+ },
1641
+ "name": {
1642
+ "type": "string",
1643
+ "nullable": true
1644
+ },
1645
+ "original": {
1646
+ "type": "string",
1647
+ "nullable": true
1648
+ }
1649
+ }
1650
+ },
1651
+ "tool": {
1652
+ "type": "object",
1653
+ "properties": {
1654
+ "name": {
1655
+ "type": "string",
1656
+ "nullable": true
1657
+ },
1658
+ "description": {
1659
+ "type": "string",
1660
+ "nullable": true
1661
+ },
1662
+ "parameters": {
1663
+ "$ref": "#/components/schemas/parameters"
1664
+ },
1665
+ "type": {
1666
+ "type": "string",
1667
+ "nullable": true
1668
+ }
1669
+ }
1670
+ },
1671
+ "turnDetection": {
1672
+ "type": "object",
1673
+ "properties": {
1674
+ "type": {
1675
+ "type": "string",
1676
+ "nullable": true
1677
+ },
1678
+ "threshold": {
1679
+ "type": "number",
1680
+ "format": "double",
1681
+ "nullable": true
1682
+ },
1683
+ "prefix_padding_ms": {
1684
+ "type": "integer",
1685
+ "format": "int32",
1686
+ "nullable": true
1687
+ },
1688
+ "silence_duration_ms": {
1689
+ "type": "integer",
1690
+ "format": "int32",
1691
+ "nullable": true
1692
+ },
1693
+ "create_response": {
1694
+ "type": "boolean",
1695
+ "nullable": true
1696
+ },
1697
+ "interrupt_response": {
1698
+ "type": "boolean",
1699
+ "nullable": true
1700
+ }
1701
+ },
1702
+ "nullable": true
1703
+ }
1704
+ },
1705
+ "securitySchemes": {
1706
+ "Implicit": {
1707
+ "type": "oauth2",
1708
+ "flows": {
1709
+ "implicit": {
1710
+ "authorizationUrl": "https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize",
1711
+ "tokenUrl": "https://login.microsoftonline.com/organizations/oauth2/v2.0/token",
1712
+ "refreshUrl": "https://login.microsoftonline.com/organizations/oauth2/v2.0/token",
1713
+ "scopes": {
1714
+ "api://b2c47b20-df4a-49b5-a7ee-87f3647ab227/.default": "Default function scope"
1715
+ }
1716
+ }
1717
+ }
1718
+ }
1719
+ }
1720
+ }
1721
+ }