@exulu/backend 1.48.2 → 1.49.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.
Files changed (164) hide show
  1. package/dist/index.cjs +351 -42
  2. package/dist/index.d.cts +96 -1
  3. package/dist/index.d.ts +96 -1
  4. package/dist/index.js +340 -38
  5. package/ee/{markdown.ts → chunking/markdown.ts} +2 -2
  6. package/ee/python/README.md +295 -0
  7. package/ee/python/documents/processing/README.md +155 -0
  8. package/ee/{documents → python/documents}/processing/doc_processor.ts +25 -17
  9. package/ee/{documents/processing/pdf_to_markdown.py → python/documents/processing/document_to_markdown.py} +3 -10
  10. package/ee/python/setup.sh +180 -0
  11. package/package.json +14 -3
  12. package/scripts/postinstall.cjs +149 -0
  13. package/.agents/skills/mintlify/SKILL.md +0 -347
  14. package/.editorconfig +0 -15
  15. package/.eslintrc.json +0 -52
  16. package/.github/workflows/release-backend.yml +0 -38
  17. package/.husky/commit-msg +0 -1
  18. package/.jscpd.json +0 -18
  19. package/.mcp.json +0 -25
  20. package/.nvmrc +0 -1
  21. package/.prettierignore +0 -5
  22. package/.prettierrc.json +0 -12
  23. package/CHANGELOG.md +0 -8
  24. package/SECURITY.md +0 -5
  25. package/commitlint.config.js +0 -4
  26. package/devops/documentation/patch-older-releases.md +0 -42
  27. package/ee/documents/processing/build_pdf_processor.sh +0 -35
  28. package/ee/documents/processing/chunk_markdown.py +0 -263
  29. package/ee/documents/processing/pdf_processor.spec +0 -115
  30. package/eslint.config.js +0 -88
  31. package/jest.config.ts +0 -25
  32. package/mintlify-docs/.mintignore +0 -7
  33. package/mintlify-docs/AGENTS.md +0 -33
  34. package/mintlify-docs/CLAUDE.MD +0 -50
  35. package/mintlify-docs/CONTRIBUTING.md +0 -32
  36. package/mintlify-docs/LICENSE +0 -21
  37. package/mintlify-docs/README.md +0 -55
  38. package/mintlify-docs/ai-tools/claude-code.mdx +0 -43
  39. package/mintlify-docs/ai-tools/cursor.mdx +0 -39
  40. package/mintlify-docs/ai-tools/windsurf.mdx +0 -39
  41. package/mintlify-docs/api-reference/core-types/agent-types.mdx +0 -110
  42. package/mintlify-docs/api-reference/core-types/analytics-types.mdx +0 -95
  43. package/mintlify-docs/api-reference/core-types/configuration-types.mdx +0 -83
  44. package/mintlify-docs/api-reference/core-types/evaluation-types.mdx +0 -106
  45. package/mintlify-docs/api-reference/core-types/job-types.mdx +0 -135
  46. package/mintlify-docs/api-reference/core-types/overview.mdx +0 -73
  47. package/mintlify-docs/api-reference/core-types/prompt-types.mdx +0 -102
  48. package/mintlify-docs/api-reference/core-types/rbac-types.mdx +0 -163
  49. package/mintlify-docs/api-reference/core-types/session-types.mdx +0 -77
  50. package/mintlify-docs/api-reference/core-types/user-management.mdx +0 -112
  51. package/mintlify-docs/api-reference/core-types/workflow-types.mdx +0 -88
  52. package/mintlify-docs/api-reference/core-types.mdx +0 -585
  53. package/mintlify-docs/api-reference/dynamic-types.mdx +0 -851
  54. package/mintlify-docs/api-reference/endpoint/create.mdx +0 -4
  55. package/mintlify-docs/api-reference/endpoint/delete.mdx +0 -4
  56. package/mintlify-docs/api-reference/endpoint/get.mdx +0 -4
  57. package/mintlify-docs/api-reference/endpoint/webhook.mdx +0 -4
  58. package/mintlify-docs/api-reference/introduction.mdx +0 -661
  59. package/mintlify-docs/api-reference/mutations.mdx +0 -1012
  60. package/mintlify-docs/api-reference/openapi.json +0 -217
  61. package/mintlify-docs/api-reference/queries.mdx +0 -1154
  62. package/mintlify-docs/backend/introduction.mdx +0 -218
  63. package/mintlify-docs/changelog.mdx +0 -387
  64. package/mintlify-docs/community-edition.mdx +0 -304
  65. package/mintlify-docs/core/exulu-agent/api-reference.mdx +0 -894
  66. package/mintlify-docs/core/exulu-agent/configuration.mdx +0 -690
  67. package/mintlify-docs/core/exulu-agent/introduction.mdx +0 -552
  68. package/mintlify-docs/core/exulu-app/api-reference.mdx +0 -481
  69. package/mintlify-docs/core/exulu-app/configuration.mdx +0 -319
  70. package/mintlify-docs/core/exulu-app/introduction.mdx +0 -117
  71. package/mintlify-docs/core/exulu-authentication.mdx +0 -810
  72. package/mintlify-docs/core/exulu-chunkers/api-reference.mdx +0 -1011
  73. package/mintlify-docs/core/exulu-chunkers/configuration.mdx +0 -596
  74. package/mintlify-docs/core/exulu-chunkers/introduction.mdx +0 -403
  75. package/mintlify-docs/core/exulu-context/api-reference.mdx +0 -911
  76. package/mintlify-docs/core/exulu-context/configuration.mdx +0 -648
  77. package/mintlify-docs/core/exulu-context/introduction.mdx +0 -394
  78. package/mintlify-docs/core/exulu-database.mdx +0 -811
  79. package/mintlify-docs/core/exulu-default-agents.mdx +0 -545
  80. package/mintlify-docs/core/exulu-eval/api-reference.mdx +0 -772
  81. package/mintlify-docs/core/exulu-eval/configuration.mdx +0 -680
  82. package/mintlify-docs/core/exulu-eval/introduction.mdx +0 -459
  83. package/mintlify-docs/core/exulu-logging.mdx +0 -464
  84. package/mintlify-docs/core/exulu-otel.mdx +0 -670
  85. package/mintlify-docs/core/exulu-queues/api-reference.mdx +0 -648
  86. package/mintlify-docs/core/exulu-queues/configuration.mdx +0 -650
  87. package/mintlify-docs/core/exulu-queues/introduction.mdx +0 -474
  88. package/mintlify-docs/core/exulu-reranker/api-reference.mdx +0 -630
  89. package/mintlify-docs/core/exulu-reranker/configuration.mdx +0 -663
  90. package/mintlify-docs/core/exulu-reranker/introduction.mdx +0 -516
  91. package/mintlify-docs/core/exulu-tool/api-reference.mdx +0 -723
  92. package/mintlify-docs/core/exulu-tool/configuration.mdx +0 -805
  93. package/mintlify-docs/core/exulu-tool/introduction.mdx +0 -539
  94. package/mintlify-docs/core/exulu-variables/api-reference.mdx +0 -699
  95. package/mintlify-docs/core/exulu-variables/configuration.mdx +0 -736
  96. package/mintlify-docs/core/exulu-variables/introduction.mdx +0 -511
  97. package/mintlify-docs/development.mdx +0 -94
  98. package/mintlify-docs/docs.json +0 -248
  99. package/mintlify-docs/enterprise-edition.mdx +0 -538
  100. package/mintlify-docs/essentials/code.mdx +0 -35
  101. package/mintlify-docs/essentials/images.mdx +0 -59
  102. package/mintlify-docs/essentials/markdown.mdx +0 -88
  103. package/mintlify-docs/essentials/navigation.mdx +0 -87
  104. package/mintlify-docs/essentials/reusable-snippets.mdx +0 -110
  105. package/mintlify-docs/essentials/settings.mdx +0 -318
  106. package/mintlify-docs/favicon.svg +0 -3
  107. package/mintlify-docs/frontend/introduction.mdx +0 -39
  108. package/mintlify-docs/getting-started.mdx +0 -267
  109. package/mintlify-docs/guides/custom-agent.mdx +0 -608
  110. package/mintlify-docs/guides/first-agent.mdx +0 -315
  111. package/mintlify-docs/images/admin_ui.png +0 -0
  112. package/mintlify-docs/images/contexts.png +0 -0
  113. package/mintlify-docs/images/create_agents.png +0 -0
  114. package/mintlify-docs/images/evals.png +0 -0
  115. package/mintlify-docs/images/graphql.png +0 -0
  116. package/mintlify-docs/images/graphql_api.png +0 -0
  117. package/mintlify-docs/images/hero-dark.png +0 -0
  118. package/mintlify-docs/images/hero-light.png +0 -0
  119. package/mintlify-docs/images/hero.png +0 -0
  120. package/mintlify-docs/images/knowledge_sources.png +0 -0
  121. package/mintlify-docs/images/mcp.png +0 -0
  122. package/mintlify-docs/images/scaling.png +0 -0
  123. package/mintlify-docs/index.mdx +0 -411
  124. package/mintlify-docs/logo/dark.svg +0 -9
  125. package/mintlify-docs/logo/light.svg +0 -9
  126. package/mintlify-docs/partners.mdx +0 -558
  127. package/mintlify-docs/products.mdx +0 -77
  128. package/mintlify-docs/snippets/snippet-intro.mdx +0 -4
  129. package/mintlify-docs/styles.css +0 -207
  130. package/ngrok.bash +0 -1
  131. package/ngrok.md +0 -6
  132. package/ngrok.yml +0 -10
  133. package/release.config.cjs +0 -15
  134. package/skills-lock.json +0 -10
  135. package/types/context-processor.ts +0 -45
  136. package/types/enums/eval-types.ts +0 -5
  137. package/types/enums/field-types.ts +0 -1
  138. package/types/enums/jobs.ts +0 -11
  139. package/types/enums/statistics.ts +0 -13
  140. package/types/exulu-table-definition.ts +0 -79
  141. package/types/file-types.ts +0 -18
  142. package/types/models/agent-session.ts +0 -27
  143. package/types/models/agent.ts +0 -68
  144. package/types/models/context.ts +0 -53
  145. package/types/models/embedding.ts +0 -17
  146. package/types/models/eval-run.ts +0 -40
  147. package/types/models/exulu-agent-tool-config.ts +0 -11
  148. package/types/models/item.ts +0 -21
  149. package/types/models/job.ts +0 -8
  150. package/types/models/project.ts +0 -16
  151. package/types/models/rate-limiter-rules.ts +0 -7
  152. package/types/models/test-case.ts +0 -25
  153. package/types/models/tool.ts +0 -9
  154. package/types/models/user-role.ts +0 -12
  155. package/types/models/user.ts +0 -20
  156. package/types/models/variable.ts +0 -8
  157. package/types/models/vector-methods.ts +0 -7
  158. package/types/provider-config.ts +0 -21
  159. package/types/queue-config.ts +0 -16
  160. package/types/rbac-rights-modes.ts +0 -1
  161. package/types/statistics.ts +0 -20
  162. package/types/workflow.ts +0 -31
  163. /package/ee/{documents → python/documents}/THIRD_PARTY_LICENSES/docling.txt +0 -0
  164. /package/ee/{documents/processing → python}/requirements.txt +0 -0
@@ -1,319 +0,0 @@
1
- ---
2
- title: "Configuration"
3
- description: "Complete guide to configuring your ExuluApp instance"
4
- ---
5
-
6
- ## Configuration overview
7
-
8
- The `ExuluConfig` object passed to `app.create()` controls all aspects of your Exulu IMP instance. This guide covers each configuration section in detail.
9
-
10
- ## Basic structure
11
-
12
- ```typescript
13
- import { ExuluApp, type ExuluConfig } from "@exulu/backend";
14
-
15
- const config: ExuluConfig = {
16
- telemetry: { enabled: false },
17
- logger: { /* Winston configuration */ },
18
- workers: { enabled: true },
19
- MCP: { enabled: false },
20
- fileUploads: { /* S3 configuration */ },
21
- privacy: { /* Privacy settings */ }
22
- };
23
-
24
- const app = new ExuluApp();
25
- await app.create({ config });
26
- ```
27
-
28
- ## Telemetry
29
-
30
- Configure OpenTelemetry integration for distributed tracing.
31
-
32
- <ParamField path="telemetry.enabled" type="boolean" required>
33
- Enable or disable OpenTelemetry tracing for the Express server
34
- </ParamField>
35
-
36
- ```typescript
37
- config: {
38
- telemetry: {
39
- enabled: true
40
- }
41
- }
42
- ```
43
-
44
- <Note>
45
- Telemetry data is sent to the configured OpenTelemetry collector. You need to set up OTEL environment variables or use `ExuluOtel.create()` separately.
46
- </Note>
47
-
48
- ## Logging
49
-
50
- Configure Winston logging transports for both the Express server and workers.
51
-
52
- <ParamField path="logger.winston.transports" type="winston.transport[]">
53
- Array of Winston transport instances for server logging
54
- </ParamField>
55
-
56
- ```typescript
57
- import winston from "winston";
58
-
59
- config: {
60
- logger: {
61
- winston: {
62
- transports: [
63
- new winston.transports.Console({
64
- format: winston.format.json()
65
- }),
66
- new winston.transports.File({
67
- filename: "exulu-server.log"
68
- })
69
- ]
70
- }
71
- }
72
- }
73
- ```
74
-
75
- <Tip>
76
- If no transports are provided, ExuluApp defaults to console logging with timestamps and colors in development.
77
- </Tip>
78
-
79
- ## Workers
80
-
81
- Configure BullMQ background workers for job processing.
82
-
83
- <ParamField path="workers.enabled" type="boolean" required>
84
- Enable background workers. Set to `false` if running only an API server without job processing.
85
- </ParamField>
86
-
87
- <ParamField path="workers.logger.winston.transports" type="winston.transport[]">
88
- Separate logging configuration for worker processes. Falls back to `logger.winston.transports` if not specified.
89
- </ParamField>
90
-
91
- <ParamField path="workers.telemetry.enabled" type="boolean">
92
- Enable OpenTelemetry tracing for worker processes. Falls back to `telemetry.enabled` if not specified.
93
- </ParamField>
94
-
95
- ```typescript
96
- config: {
97
- workers: {
98
- enabled: true,
99
- logger: {
100
- winston: {
101
- transports: [
102
- new winston.transports.File({
103
- filename: "exulu-workers.log"
104
- })
105
- ]
106
- }
107
- },
108
- telemetry: {
109
- enabled: true
110
- }
111
- }
112
- }
113
- ```
114
-
115
- ### Starting workers
116
-
117
- After configuring workers, start them in a separate process:
118
-
119
- ```typescript
120
- // workers.ts
121
- import { app } from "./app";
122
-
123
- await app.bullmq.workers.create();
124
- ```
125
-
126
- <Warning>
127
- Workers require Redis to be configured via the `REDIS_HOST` and `REDIS_PORT` environment variables.
128
- </Warning>
129
-
130
- ## MCP (Model Context Protocol)
131
-
132
- Enable the MCP server for external tool integrations.
133
-
134
- <ParamField path="MCP.enabled" type="boolean" required>
135
- Enable the MCP server. When enabled, ExuluApp exposes your agents, tools, and contexts via the MCP protocol.
136
- </ParamField>
137
-
138
- ```typescript
139
- config: {
140
- MCP: {
141
- enabled: true
142
- }
143
- }
144
- ```
145
-
146
- <Info>
147
- The MCP server integrates with your Express app and exposes endpoints for MCP clients to discover and invoke tools.
148
- </Info>
149
-
150
- ## File uploads
151
-
152
- Configure S3-compatible storage for file uploads.
153
-
154
- <ParamField path="fileUploads.s3region" type="string" required>
155
- AWS region for S3 bucket
156
- </ParamField>
157
-
158
- <ParamField path="fileUploads.s3key" type="string" required>
159
- AWS access key ID
160
- </ParamField>
161
-
162
- <ParamField path="fileUploads.s3secret" type="string" required>
163
- AWS secret access key
164
- </ParamField>
165
-
166
- <ParamField path="fileUploads.s3Bucket" type="string" required>
167
- S3 bucket name
168
- </ParamField>
169
-
170
- <ParamField path="fileUploads.s3endpoint" type="string">
171
- Custom S3 endpoint URL (for S3-compatible services like MinIO)
172
- </ParamField>
173
-
174
- <ParamField path="fileUploads.s3prefix" type="string">
175
- Prefix for all uploaded files in the bucket
176
- </ParamField>
177
-
178
- ```typescript
179
- config: {
180
- fileUploads: {
181
- s3region: "us-east-1",
182
- s3key: process.env.AWS_ACCESS_KEY_ID,
183
- s3secret: process.env.AWS_SECRET_ACCESS_KEY,
184
- s3Bucket: "exulu-uploads",
185
- s3prefix: "uploads/"
186
- }
187
- }
188
- ```
189
-
190
- <CodeGroup>
191
- ```typescript MinIO example
192
- config: {
193
- fileUploads: {
194
- s3region: "us-east-1",
195
- s3key: "minioadmin",
196
- s3secret: "minioadmin",
197
- s3Bucket: "exulu",
198
- s3endpoint: "http://localhost:9000",
199
- s3prefix: "files/"
200
- }
201
- }
202
- ```
203
-
204
- ```typescript AWS S3 example
205
- config: {
206
- fileUploads: {
207
- s3region: "us-west-2",
208
- s3key: process.env.AWS_ACCESS_KEY_ID,
209
- s3secret: process.env.AWS_SECRET_ACCESS_KEY,
210
- s3Bucket: "my-exulu-bucket"
211
- }
212
- }
213
- ```
214
- </CodeGroup>
215
-
216
- ## Privacy
217
-
218
- Configure privacy and personalization features.
219
-
220
- <ParamField path="privacy.systemPromptPersonalization" type="boolean">
221
- Enable system prompt personalization based on user interactions. When disabled, all users receive the same system prompts.
222
- </ParamField>
223
-
224
- ```typescript
225
- config: {
226
- privacy: {
227
- systemPromptPersonalization: false
228
- }
229
- }
230
- ```
231
-
232
- ## Complete example
233
-
234
- ```typescript
235
- import { ExuluApp, type ExuluConfig } from "@exulu/backend";
236
- import winston from "winston";
237
-
238
- const config: ExuluConfig = {
239
- telemetry: {
240
- enabled: process.env.NODE_ENV === "production"
241
- },
242
- logger: {
243
- winston: {
244
- transports: [
245
- new winston.transports.Console({
246
- format: winston.format.combine(
247
- winston.format.colorize(),
248
- winston.format.simple()
249
- )
250
- }),
251
- new winston.transports.File({
252
- filename: "logs/exulu.log",
253
- format: winston.format.json()
254
- })
255
- ]
256
- }
257
- },
258
- workers: {
259
- enabled: true,
260
- telemetry: {
261
- enabled: true
262
- }
263
- },
264
- MCP: {
265
- enabled: true
266
- },
267
- fileUploads: {
268
- s3region: process.env.AWS_REGION!,
269
- s3key: process.env.AWS_ACCESS_KEY_ID!,
270
- s3secret: process.env.AWS_SECRET_ACCESS_KEY!,
271
- s3Bucket: process.env.S3_BUCKET!,
272
- s3prefix: "uploads/"
273
- },
274
- privacy: {
275
- systemPromptPersonalization: false
276
- }
277
- };
278
-
279
- const app = new ExuluApp();
280
- await app.create({ config });
281
-
282
- const expressApp = await app.express.init();
283
- expressApp.listen(3000);
284
- ```
285
-
286
- ## Environment variables
287
-
288
- Many configuration values should come from environment variables for security and deployment flexibility:
289
-
290
- ```bash
291
- # Required for workers
292
- REDIS_HOST=localhost
293
- REDIS_PORT=6379
294
-
295
- # Required for database
296
- POSTGRES_HOST=localhost
297
- POSTGRES_PORT=5432
298
- POSTGRES_USER=exulu
299
- POSTGRES_PASSWORD=password
300
- POSTGRES_DB=exulu
301
-
302
- # Required for authentication
303
- NEXTAUTH_SECRET=your-secret-key
304
-
305
- # Optional for telemetry
306
- SIGNOZ_ACCESS_TOKEN=your-token
307
- SIGNOZ_TRACES_URL=https://your-signoz.com
308
- SIGNOZ_LOGS_URL=https://your-signoz.com
309
-
310
- # Optional for file uploads
311
- AWS_ACCESS_KEY_ID=your-key
312
- AWS_SECRET_ACCESS_KEY=your-secret
313
- AWS_REGION=us-east-1
314
- S3_BUCKET=your-bucket
315
- ```
316
-
317
- <Note>
318
- Use a `.env` file with `dotenv` for local development. Never commit secrets to version control.
319
- </Note>
@@ -1,117 +0,0 @@
1
- ---
2
- title: "Overview"
3
- description: "The main application class for initializing and managing your Exulu IMP instance"
4
- ---
5
-
6
- ## Overview
7
-
8
- `ExuluApp` is the central class for the Exulu Intelligence Management Platform (IMP). It orchestrates all components of your AI agent infrastructure, including agents, contexts, tools, evaluations, and background workers.
9
-
10
- ## Key features
11
-
12
- <CardGroup cols={2}>
13
- <Card title="Agent management" icon="robot">
14
- Register and manage AI agents from multiple providers (OpenAI, Anthropic, Google, Cerebras)
15
- </Card>
16
- <Card title="Context system" icon="database">
17
- Configure semantic search contexts with vector embeddings
18
- </Card>
19
- <Card title="Background workers" icon="gear">
20
- Process long-running tasks with BullMQ workers
21
- </Card>
22
- <Card title="Express integration" icon="server">
23
- Built-in API server with GraphQL and REST endpoints
24
- </Card>
25
- </CardGroup>
26
-
27
- ## Installation
28
-
29
- ```bash
30
- npm install @exulu/backend
31
- ```
32
-
33
- ## Quick start
34
-
35
- ```typescript
36
- import { ExuluApp } from "@exulu/backend";
37
-
38
- // Create and configure the app
39
- const app = new ExuluApp();
40
- await app.create({
41
- config: {
42
- telemetry: { enabled: false },
43
- workers: { enabled: true },
44
- MCP: { enabled: false }
45
- }
46
- });
47
-
48
- // Initialize Express server
49
- const expressApp = await app.express.init();
50
- expressApp.listen(3000, () => {
51
- console.log("Exulu IMP running on port 3000");
52
- });
53
- ```
54
-
55
- ## Architecture
56
-
57
- The ExuluApp follows a factory pattern where you instantiate the class and then call the async `create()` method to initialize all components:
58
-
59
- ```typescript
60
- const app = new ExuluApp();
61
- const initializedApp = await app.create({
62
- contexts: { /* your contexts */ },
63
- agents: [ /* custom agents */ ],
64
- tools: [ /* custom tools */ ],
65
- evals: [ /* custom evaluations */ ],
66
- rerankers: [ /* custom rerankers */ ],
67
- config: { /* configuration */ }
68
- });
69
- ```
70
-
71
- ## Core concepts
72
-
73
- <AccordionGroup>
74
- <Accordion title="Agents">
75
- AI agents are the execution units that process requests. Exulu IMP includes default agents for major providers:
76
- - Anthropic (Claude Opus 4, Sonnet 4, Sonnet 4.5)
77
- - OpenAI (GPT-5, GPT-4.1, GPT-4o series)
78
- - Google (Vertex Gemini 2.5 Flash, Pro, 3 Pro)
79
- - Cerebras (Llama 3.3, GPT-OSS)
80
-
81
- You can add custom agents by passing them to the `agents` array.
82
- </Accordion>
83
-
84
- <Accordion title="Contexts">
85
- Contexts are semantic search indices that allow agents to query relevant information. Each context:
86
- - Has an associated vector database table
87
- - Defines embeddings generation logic
88
- - Can include multiple data sources
89
- - Automatically exposes a tool for agents to use
90
- </Accordion>
91
-
92
- <Accordion title="Tools">
93
- Tools extend agent capabilities by providing functions they can call. Default tools include:
94
- - Todo management tools
95
- - Perplexity search tools
96
- - Context query tools (auto-generated from contexts)
97
- </Accordion>
98
-
99
- <Accordion title="Workers">
100
- BullMQ workers process background jobs:
101
- - Agent request execution
102
- - Embeddings generation
103
- - Evaluation runs
104
- - Scheduled context source updates
105
- </Accordion>
106
- </AccordionGroup>
107
-
108
- ## Next steps
109
-
110
- <CardGroup cols={2}>
111
- <Card title="Configuration" icon="gear" href="/core/exulu-app/configuration">
112
- Learn about all configuration options
113
- </Card>
114
- <Card title="API reference" icon="code" href="/core/exulu-app/api-reference">
115
- Explore methods and properties
116
- </Card>
117
- </CardGroup>