add docs and some fixes

This commit is contained in:
Nicolò Boschi 2025-11-24 14:54:57 +01:00
parent 4f8e4b83ed
commit a2ac37ed95
62 changed files with 32042 additions and 0 deletions

20
memora-docs/.gitignore vendored Normal file
View file

@ -0,0 +1,20 @@
# Dependencies
/node_modules
# Production
/build
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*

41
memora-docs/README.md Normal file
View file

@ -0,0 +1,41 @@
# Website
This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.
## Installation
```bash
npm install
```
## Local Development
```bash
npm start
```
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
## Build
```bash
npm run build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.
## Deployment
Using SSH:
```bash
USE_SSH=true npm run deploy
```
Not using SSH:
```bash
GIT_USER=<Your GitHub username> npm run deploy
```
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.

View file

@ -0,0 +1,71 @@
---
id: add-agent-background
title: "Add/merge agent background"
description: "Add new background information or merge with existing. LLM intelligently resolves conflicts, normalizes to first person, and optionally infers personality traits."
sidebar_label: "Add/merge agent background"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "post api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Add/merge agent background"}
>
</Heading>
<MethodEndpoint
method={"post"}
path={"/api/v1/agents/{agent_id}/background"}
context={"endpoint"}
>
</MethodEndpoint>
Add new background information or merge with existing. LLM intelligently resolves conflicts, normalizes to first person, and optionally infers personality traits.
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={{"required":true,"content":{"application/json":{"schema":{"properties":{"content":{"type":"string","title":"Content","description":"New background information to add or merge"},"update_personality":{"type":"boolean","title":"Update Personality","description":"If true, infer Big Five personality traits from the merged background (default: true)","default":true}},"type":"object","required":["content"],"title":"AddBackgroundRequest","description":"Request model for adding/merging background information.","example":{"content":"I was born in Texas","update_personality":true}}}}}}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"background":{"type":"string","title":"Background"},"personality":{"anyOf":[{"properties":{"openness":{"type":"number","maximum":1,"minimum":0,"title":"Openness","description":"Openness to experience (0-1)"},"conscientiousness":{"type":"number","maximum":1,"minimum":0,"title":"Conscientiousness","description":"Conscientiousness (0-1)"},"extraversion":{"type":"number","maximum":1,"minimum":0,"title":"Extraversion","description":"Extraversion (0-1)"},"agreeableness":{"type":"number","maximum":1,"minimum":0,"title":"Agreeableness","description":"Agreeableness (0-1)"},"neuroticism":{"type":"number","maximum":1,"minimum":0,"title":"Neuroticism","description":"Neuroticism (0-1)"},"bias_strength":{"type":"number","maximum":1,"minimum":0,"title":"Bias Strength","description":"How strongly personality influences opinions (0-1)"}},"type":"object","required":["openness","conscientiousness","extraversion","agreeableness","neuroticism","bias_strength"],"title":"PersonalityTraits","description":"Personality traits based on Big Five model.","example":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}},{"type":"null"}]}},"type":"object","required":["background"],"title":"BackgroundResponse","description":"Response model for background update.","example":{"background":"I was born in Texas. I am a software engineer with 10 years of experience.","personality":{"agreeableness":0.8,"bias_strength":0.6,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.4,"openness":0.7}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,76 @@
---
id: agent-memory-api
title: "Agent Memory API"
description: "A temporal-semantic memory system for AI agents that stores, retrieves, and reasons over memories."
sidebar_label: Introduction
sidebar_position: 0
hide_title: true
custom_edit_url: null
---
import ApiLogo from "@theme/ApiLogo";
import Heading from "@theme/Heading";
import SchemaTabs from "@theme/SchemaTabs";
import TabItem from "@theme/TabItem";
import Export from "@theme/ApiExplorer/Export";
<span
className={"theme-doc-version-badge badge badge--secondary"}
children={"Version: 1.0.0"}
>
</span>
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Agent Memory API"}
>
</Heading>
A temporal-semantic memory system for AI agents that stores, retrieves, and reasons over memories.
## Features
* **Batch Memory Storage**: Store multiple memories efficiently with automatic fact extraction
* **Semantic Search**: Find relevant memories using natural language queries
* **Fact Type Filtering**: Search across world facts, agent actions, and opinions separately
* **Think Endpoint**: Generate contextual answers based on agent identity and memories
* **Graph Visualization**: Interactive memory graph visualization
* **Document Tracking**: Track and manage memory documents with upsert support
## Architecture
The system uses:
- **Temporal Links**: Connect memories that are close in time
- **Semantic Links**: Connect semantically similar memories
- **Entity Links**: Connect memories that mention the same entities
- **Spreading Activation**: Intelligent traversal for memory retrieval
<div
style={{"display":"flex","flexDirection":"column","marginBottom":"var(--ifm-paragraph-margin-bottom)"}}
>
<h3
style={{"marginBottom":"0.25rem"}}
>
Contact
</h3><span>
Memory System:
</span>
</div><div
style={{"marginBottom":"var(--ifm-paragraph-margin-bottom)"}}
>
<h3
style={{"marginBottom":"0.25rem"}}
>
License
</h3><a
href={"https://www.apache.org/licenses/LICENSE-2.0.html"}
>
Apache 2.0
</a>
</div>

View file

@ -0,0 +1,90 @@
---
id: batch-put-async
title: "Store multiple memories asynchronously"
description: "Store multiple memory items in batch asynchronously using the task backend."
sidebar_label: "Store multiple memories asynchronously"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "post api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Store multiple memories asynchronously"}
>
</Heading>
<MethodEndpoint
method={"post"}
path={"/api/v1/agents/{agent_id}/memories/async"}
context={"endpoint"}
>
</MethodEndpoint>
Store multiple memory items in batch asynchronously using the task backend.
This endpoint returns immediately after queuing the task, without waiting for completion.
The actual processing happens in the background.
Features:
- Immediate response (non-blocking)
- Background processing via task queue
- Efficient batch processing
- Automatic fact extraction from natural language
- Entity recognition and linking
- Document tracking with automatic upsert (when document_id is provided)
- Temporal and semantic linking
The system automatically:
1. Queues the batch put task
2. Returns immediately with success=True, queued=True
3. Processes in background: extracts facts, generates embeddings, creates links
Note: If document_id is provided and already exists, the old document and its memory units will be deleted before creating new ones (upsert behavior).
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={{"required":true,"content":{"application/json":{"schema":{"properties":{"items":{"items":{"properties":{"content":{"type":"string","title":"Content"},"event_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Event Date"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"}},"type":"object","required":["content"],"title":"MemoryItem","description":"Single memory item for batch put.","example":{"content":"Alice mentioned she's working on a new ML model","context":"team meeting","event_date":"2024-01-15T10:30:00Z"}},"type":"array","title":"Items"},"document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Id"}},"type":"object","required":["items"],"title":"BatchPutRequest","description":"Request model for batch put endpoint.","example":{"document_id":"conversation_123","items":[{"content":"Alice works at Google","context":"work"},{"content":"Bob went hiking yesterday","event_date":"2024-01-15T10:00:00Z"}]}}}}}}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"agent_id":{"type":"string","title":"Agent Id"},"document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Id"},"items_count":{"type":"integer","title":"Items Count"},"queued":{"type":"boolean","title":"Queued"}},"type":"object","required":["success","message","agent_id","items_count","queued"],"title":"BatchPutAsyncResponse","description":"Response model for async batch put endpoint.","example":{"agent_id":"user123","document_id":"conversation_123","items_count":2,"message":"Batch put task queued for background processing","queued":true,"success":true}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,87 @@
---
id: batch-put-memories
title: "Store multiple memories"
description: "Store multiple memory items in batch with automatic fact extraction."
sidebar_label: "Store multiple memories"
hide_title: true
hide_table_of_contents: true
api: eJztWFFz2zgO/isY7sO1GcV23O6L3tw07Xmm3XYa3z5cmsnAEixxS5FakrLr8/i/34CkbDlp0l7nXu5m/WSJIEB8+AAC2gmPlRP5jXhPjbFb+NCSRS+NduI2EyW5wsqWn0Uurr2xBE2nvGwVQRN3SE+NA6lhib6oYSN9Ddh506CXBayw8EBfvcWCtYw+688aAOANoe8suTw+nsPVaiULSdonPa01BTknddVLzB5TCitrGtCsEBUo1FWHFR0Uay/9FiwVptIyyKMuQUn9ZaD8tSm6hq2zUl6470jXOrIenm1q0lAm6TtZgnR81rUsqXzea1tQ0xo+DFty1KBmFQeTUWxRE7it89QczaBS2wTJxQiuoovuqGIVHoO/viYojPakfdwwHcFb0hw+ckDNkspS6srFxRcjeE1l1ypZhHUnG6nQRoVR5OUILi2FVZ/Onx0sZ8EViliyI2nTryNYMGLugAk05LFEj72fvxlPOcxXj6EWNKOyhOUW6Kt03mXBO6PKo1YWkt71rOs0P2ykUrAkKEmRpxKWtGKKFuwGx1DTBowmB89S+JZU41oa+3wkMmF6rs9LkYtAu7u283fBhCQnMtGixYY8Wc6RndDYkMgFVtELkQnJidGir0UmLP3ZSUulyL3tKBOuqKlBke+E37a8z3krdSUy4aVX/GLGimBeiv3+Nu4n51+Zcsub7qtLweYlbGMgpdHjPxwn525grbXsmWcP8p0I+Xny53R9oPaxY14mkX0maM2ul+gpnENvP6wCMve3roxt0ItcsOi5lw2JfXYQ051Sgl3uLVyxWnjNavfJ06/+KQtPKbtM2/f7rJcxyz+o8Ccxujl4Ptgaq+DcUyMeVD+pq9OqBytj+2rVeWYUfcWmVXQCq5gpWfA+zYqoBFfT3xxsjA1lhstR4On7d9CYkpQY+C88YQMNkY+oDtEX08n05fnk4vzi18XFJH8xySeTfw59RmtxO4jiPMR/n4lBHv4sxIdyGbj7NMyRd4PNrxiyj53/FPn+AOn0PsJxCjKQLlsj9X20T1xi/NZkXciPu4vpC87TSP6bh4HhQDhAD2+NqRSdwM9rAYfjpldmCRv2vJYhfltynmwZkH4iPJMUnts9/xgg1xrtYgpOJ5PgxCnfuoIvwFWn4FMSFj9dBFxUNkjypTGKUA/4kQwyQxpyDit6qia8TyL77FgOf6jS/ff5l6J7V5jupI5J7akiez8F4DLIfY+2PWRHNLKTwj8w+U1uH0J2n9xx4T9h9xFg0TmykdE/RvkelOkgqANqqS047upKmJ70cyI7UoZvn8Tal9PpQ6L+jkqWwTBcWWvsz7O0JI9SPXFXKVOcrP4AdXoS7G8fr4zvTDxgoL6rfpD2UeRx0QAGLHj1e1xjv6LpJDdg1BHeiO7jbryO8H3LWC/y98Xi4wOFMbYN+dowlVoTanJoanIxxlaO1xfjwEE33vVc3I8HbRIH9tOxe7n6nyzM3MytTIjoSdFKk9Hs4/xBMn/Ws0OvfH5o0lMipd6eM3w2h4gf+Bp9TDmXgSVvJa35L7e3ltAZ7cCsyUKPbpiYfvnlMDDx4xmcnYVC05+NJzOs6Owsh28NaZIHgn6+UtvvzGhR/3XvzTWhLWpW/UaGQypaY2jzk+bOhVb73vgFf3bEy1HbGzbBqQBvpPLEmRIOG3QDFta40BKpMk4kWcQL4okSPqaVmp/AEfflntQ2al/UUn+Bq1Q8WXE/CEGiTBdmMbch62CJjsrQdwUTskxTDZvonYp631psa/hdug6V/FdgLSufa08Bq/WhHayC5HooGVUcLqpFmitZQfgf7aFmrJKWPllcjFCaWVzXtsb6xIOZLWrpqWAy8KvBFNm5ME+fMyL9APqORzW2eWm0pmIQtsBE5GlJGUc8wHOXHrcfgv9ge09yDFdHGiKPqPHmNHB/x3Lqh8Og57ChOFselFy3PA8ysWYM9An2SskqjeqhmsRbNGGYcgpVHD75lyoHFuFCSjNcnzkBOi6qXHP4wj6KzFosaoLpaCIy0VklclF737p8PN5sNiMMyyNjq3Ha68bv5pdXv11fnU9Hk1HtG8WK+YyxXFyMJqMJv+IS26Ae2Hokbe9XnGHB++tzzF+fY/6fPseknoXL9bhVKEM7FtJul5qRG4GtFJlYX/S9OCdIPujKD3lzm4ma+5j8Rux2XPH/YdV+z6/5XtqK/OY2E2u0Epd81d/sRCkd/y9FvkLl6InEe/YptW7P4bFj9x2a5u5jjarjJ5GJL7Qdfj8KXUdNWJINZ4jL6XPLeWgdj9sfdNLc/8Qds6Kg1j8pezvo8D5+uF6ITCzThyaeREQuLG64LcVNPKpp42dg/hLF73aiT2WRi6iTf/8GNVi39g==
sidebar_class_name: "post api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Store multiple memories"}
>
</Heading>
<MethodEndpoint
method={"post"}
path={"/api/v1/agents/{agent_id}/memories"}
context={"endpoint"}
>
</MethodEndpoint>
Store multiple memory items in batch with automatic fact extraction.
Features:
- Efficient batch processing
- Automatic fact extraction from natural language
- Entity recognition and linking
- Document tracking with automatic upsert (when document_id is provided)
- Temporal and semantic linking
The system automatically:
1. Extracts semantic facts from the content
2. Generates embeddings
3. Deduplicates similar facts
4. Creates temporal, semantic, and entity links
5. Tracks document metadata
Note: If document_id is provided and already exists, the old document and its memory units will be deleted before creating new ones (upsert behavior).
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={{"required":true,"content":{"application/json":{"schema":{"properties":{"items":{"items":{"properties":{"content":{"type":"string","title":"Content"},"event_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Event Date"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"}},"type":"object","required":["content"],"title":"MemoryItem","description":"Single memory item for batch put.","example":{"content":"Alice mentioned she's working on a new ML model","context":"team meeting","event_date":"2024-01-15T10:30:00Z"}},"type":"array","title":"Items"},"document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Id"}},"type":"object","required":["items"],"title":"BatchPutRequest","description":"Request model for batch put endpoint.","example":{"document_id":"conversation_123","items":[{"content":"Alice works at Google","context":"work"},{"content":"Bob went hiking yesterday","event_date":"2024-01-15T10:00:00Z"}]}}}}}}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"agent_id":{"type":"string","title":"Agent Id"},"document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Id"},"items_count":{"type":"integer","title":"Items Count"}},"type":"object","required":["success","message","agent_id","items_count"],"title":"BatchPutResponse","description":"Response model for batch put endpoint.","example":{"agent_id":"user123","document_id":"conversation_123","items_count":2,"message":"Successfully stored 2 memory items","success":true}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: cancel-operation
title: "Cancel a pending async operation"
description: "Cancel a pending async operation by removing it from the queue"
sidebar_label: "Cancel a pending async operation"
hide_title: true
hide_table_of_contents: true
api: eJy9VktvGzcQ/ivE5NIaG8kxetqbGsupAacJYjUX2wjG3JGWMZdkyFk5W2H/ezHc1SuuExQtqou45Mw3Mx/nwQ0wrhKUN/CWGh879S5QRDbeJbgroKKkownyDSW8RqfJKlSBXGXcSmHqnFZ+q6LuOxWp8Ws5M6yW0TeKa1JfWmoJCthJXlZQgs5wn3abUEDAiA0xRXFpAw4bghJwRY4/mQoKMOJHQK6hgEhfWhOpgpJjSwUkXVODUG6AuyB6iaNxKyiADVvZmAmQuqyg74sd+s7+f2FhR99g5U4wUvAuURK1s9NT+Tum9brVmlJatlZ9GIWhAO0dk2MRxxCs0Rl2+jmJzmbvSt/3fQG/nJ09Bf6I1lSDN/MYffwHqBCi8MJm8LsiRmNlZZia9FTAen10iq57t8x3eMyU8D7uGMe0ogj9XV9s9zBG7A7ovPKDg9AX0KTV95h/SynhimAH9rxoJkMt5LTf2/b3n0nz0a3f5LgG06Pc3R5mT+/A7vNhnA/0/Z2xrchvi8X7J4DD3TbEtZeCqcgSUy4TrqGEKQYzXb+a5vpI0822TvrpLqfTdHOY331O8KXP7BwVxVj+s/eX8G3Z37qZYmqCj2hfJmrQsdGqGRRSl5gatfRRzS7V4IniGlkl9pFSoSJxNLSWJbpKRcLkXVJ+TXEAMZQmt+7WvXihLgi5jZTk80SdnPyKrOutb9fsI67o5KTMS1JNa9kESzsYRcul0YYc2049Gq4VtuwbFH+XqFnRV46oJa4B/3obzTVh1LVAX5jspKU1Ot4jt0mamhP30CqLbtXiKnc2OR7QLsSEpJW6MJZJsi47m7EV6uhTUo8+2ip7I4Rk7gePRn58ME6+VCLphky2G9AXtXEPau6q4I1jAX5DTq6WVK7qr9yiVejSI8Wk7jFRpbwbTZiKHBvusoltUAPum4ihVh9NatGaP3OmCPilY8pcrWl716ssuT6UHCDOvW4bMbOIqB/GsPN6sIdOuBpRqlE4DTfUhkSRVWpD8JHHPJhFXRsmLckgW4uatpnWJkrlrXspjIxJqa6Me0hi87V3jvTBteVMxEhKW59IGafYNDSo7y7/ifo2ydHaTiXTGIvxgDVRng90/sCyxCntV4ZgwoZUvoUdyHWIhHmSzoToI+6tNfnmOOKaYkKba2zkcKwptLdOjb+xuaPOzX2cbdvKydRJg7JGk8yXvcgsoK5JnU1OoYA2WiihZg6pnE4fHx8nmI8nPq6mo26aXl2+nv9+PX95Njmd1NxYARYfh3bxanI6OZWt4BM36A5s/egB8W3r2ezn1b9/fIydVwplGiyaPFRywJuxod4ABgMFrF9BMTw6EhRQHjw/9n1VDo5eDncF1D6xoGw2Un1/RNv3si09ooPy5q6ANUaD99J2bzZQmSTrCsol2kTfif2nD+NI+lk9F8h28jiZO2u0rXxBAQ/UHb6gZP7+j3aPGMqDviasKOb4B5GZ1hT4QPnJu0ReUbsZeD6/mi/m0Pd/AQeDus0=
sidebar_class_name: "delete api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Cancel a pending async operation"}
>
</Heading>
<MethodEndpoint
method={"delete"}
path={"/api/v1/agents/{agent_id}/operations/{operation_id}"}
context={"endpoint"}
>
</MethodEndpoint>
Cancel a pending async operation by removing it from the queue
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","title":"Operation Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: clear-agent-memories
title: "Clear agent memories"
description: "Delete memory units for an agent. Optionally filter by fact_type (world, agent, opinion) to delete only specific types. This is a destructive operation that cannot be undone. The agent profile (personality and background) will be preserved."
sidebar_label: "Clear agent memories"
hide_title: true
hide_table_of_contents: true
api: eJzlVlFz2zYM/is49qXNqXaa25PfvMbpcteuvSbrS5PrIRQssaFIlaCcej7/9x1ISZGXZu26x/kligR8AL8PBLBTEStWi49qWZGL8AYdVtSQi+q6UCWxDqaNxju1UKdkKRI01Piwhc6ZyLD2AdABivMM3iZTtHYLa2MjBbjZwhp1/BS3LcHTOx9sWWTrAnxrnPHuGUQPZcb2zm6BW9JmbTSIE8/gsjYMhgGhJI6h09FsCHxLASUcxBojaHTOR7gh6FzpHYkb5UjQBr82luBpS4ElPxO3gK6EG9S3VfCdK5/BnbFW3NtATGFD5UwVagxyXqqF0pYwfEqYnxILhlgVqsWADUUKwuNOOWxILVQ2M6UqlBH2Woy1KlSgL50JVKpFDB0VinVNDarFTslp1UJxDMZVqlDRRCsvsjDnpdrvixF9JHWA/9JR2B7gr9HyQQB027frlOJhKIHt37jOWrV/oPyga9IyyTLo+4ikk/TPxOVS4Pf/HVZSC8Std0wsZzo5PpY/h7gXndbEvO4svO+NVaG0d1HqWphoW2t0Enb+mcVnN+GpDSJ7NDkCZ7CJQjfeW0I3OWMfUE7YEDNW9E+CvulN9vtisPE3n0nHA/k+jpHvQa/vQfJlnBzvkILhAzS+JJuu6XDFhpJmKXD6ik1rU7pj5uLsu6CpdymBR0Kt1NhIiZTwXn6F+uXk5KEQH9CaMl/SVQg+/LwKJUU0Vp5MpIYfGlivD77+QLEbF6mioPbX90JgCLidaPXa5wSTtFz9kKwD2OOmiYz+UnynCORcOXRvN6mBe3ozu48f4zTT961gg8lvl5fvHgBmbRuKtZcGmOshtbxYq4WaY2vmmxfzdE15vht63n4+aY/GrX0i46CfvclTZPnu/EHtXrklRGpaH9A+Z2rQRaOHscNbjtSkgl6e5/7AeQJw9IG4gEAxGNrIo/T4QMjeMfgNBRjSml25K/fkCZwRxi4Qy79HcHT0K0ZdD7ldRB+woqOjRXokaDobTWtphAFar4025KLdwp2JNWAXfYOSb+pp9DUG1HKujH8xnOaCMOhaoM9MStLSBl28R+7YuAqcpIcWLLqqw4pA2ryRfAVtbK1wltqmcVVKNmED6uCZIXXSlA33/RRyRj0/fW9lYJJBFsluM/plbdwtrFzZeuOiAL8iJ72DIF3ir7FDC+j4jgLDDTKV4PtVAExJLg5jdjhUxn0VsK3hg+EOrfkzVZuAn7tIiavNuGJUyXIztcwQp153sqPAZUB92x87Ped4aYkZUMremLNCXcsUInDXtj7Evg6WQdcmkpZikFeyO/SV1jHx4so9F0b6ooTXxt2yxHzpnSM9kS1VIgYCbT0TGAfRNJTdR/EfuA9FnjYnNo2xGCasifMq0/mdyHLOvBIRMDYESYUR5KINhKUU1lKIPuDeWpOUiwE3FBjz0Og57O8U2isH/a/v5ahTL+/XkuHmJOqkH1mjSebTvcmyRV0TnMyOVaG6YNVC1TG2vJjP7+7uZpg+z3yo5r0vz1+fv1z9frF6fjI7ntWxsQIsOeZ28WJ2PDuWV63n2KCbxHopC1tfkZOOdNBudvcj6f+44fbjQK7zvLVo0qRLsuz6Lv9RYWtUoTYvVJG3WuFwMdlvR2qvC1V7juKz20lH+CPY/V5e5/VUxnFpGG/sZEF9VI2f2jq/dZxb2v5tZd6g7cQuLZQbDEZS+pfpPX3fj+ln8FjgYRq77TTmkNDIYFpAasKSQsohf15qTW2cOD7YlyT5cTafrl6vLldqv/8LyLPVmQ==
sidebar_class_name: "delete api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Clear agent memories"}
>
</Heading>
<MethodEndpoint
method={"delete"}
path={"/api/v1/agents/{agent_id}/memories"}
context={"endpoint"}
>
</MethodEndpoint>
Delete memory units for an agent. Optionally filter by fact_type (world, agent, opinion) to delete only specific types. This is a destructive operation that cannot be undone. The agent profile (personality and background) will be preserved.
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"fact_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional fact type filter (world, agent, opinion)","title":"Fact Type"},"description":"Optional fact type filter (world, agent, opinion)"}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"DeleteResponse","description":"Response model for delete operations.","example":{"message":"Resource deleted successfully","success":true}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: create-or-update-agent
title: "Create or update agent"
description: "Create a new agent or update existing agent with personality and background. Auto-fills missing fields with defaults."
sidebar_label: "Create or update agent"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "put api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Create or update agent"}
>
</Heading>
<MethodEndpoint
method={"put"}
path={"/api/v1/agents/{agent_id}"}
context={"endpoint"}
>
</MethodEndpoint>
Create a new agent or update existing agent with personality and background. Auto-fills missing fields with defaults.
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"personality":{"anyOf":[{"properties":{"openness":{"type":"number","maximum":1,"minimum":0,"title":"Openness","description":"Openness to experience (0-1)"},"conscientiousness":{"type":"number","maximum":1,"minimum":0,"title":"Conscientiousness","description":"Conscientiousness (0-1)"},"extraversion":{"type":"number","maximum":1,"minimum":0,"title":"Extraversion","description":"Extraversion (0-1)"},"agreeableness":{"type":"number","maximum":1,"minimum":0,"title":"Agreeableness","description":"Agreeableness (0-1)"},"neuroticism":{"type":"number","maximum":1,"minimum":0,"title":"Neuroticism","description":"Neuroticism (0-1)"},"bias_strength":{"type":"number","maximum":1,"minimum":0,"title":"Bias Strength","description":"How strongly personality influences opinions (0-1)"}},"type":"object","required":["openness","conscientiousness","extraversion","agreeableness","neuroticism","bias_strength"],"title":"PersonalityTraits","description":"Personality traits based on Big Five model.","example":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}},{"type":"null"}]},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background"}},"type":"object","title":"CreateAgentRequest","description":"Request model for creating/updating an agent.","example":{"background":"I am a creative software engineer with 10 years of experience","name":"Alice","personality":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}}}}}}}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"agent_id":{"type":"string","title":"Agent Id"},"name":{"type":"string","title":"Name"},"personality":{"properties":{"openness":{"type":"number","maximum":1,"minimum":0,"title":"Openness","description":"Openness to experience (0-1)"},"conscientiousness":{"type":"number","maximum":1,"minimum":0,"title":"Conscientiousness","description":"Conscientiousness (0-1)"},"extraversion":{"type":"number","maximum":1,"minimum":0,"title":"Extraversion","description":"Extraversion (0-1)"},"agreeableness":{"type":"number","maximum":1,"minimum":0,"title":"Agreeableness","description":"Agreeableness (0-1)"},"neuroticism":{"type":"number","maximum":1,"minimum":0,"title":"Neuroticism","description":"Neuroticism (0-1)"},"bias_strength":{"type":"number","maximum":1,"minimum":0,"title":"Bias Strength","description":"How strongly personality influences opinions (0-1)"}},"type":"object","required":["openness","conscientiousness","extraversion","agreeableness","neuroticism","bias_strength"],"title":"PersonalityTraits","description":"Personality traits based on Big Five model.","example":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}},"background":{"type":"string","title":"Background"}},"type":"object","required":["agent_id","name","personality","background"],"title":"AgentProfileResponse","description":"Response model for agent profile.","example":{"agent_id":"user123","background":"I am a software engineer with 10 years of experience in startups","name":"Alice","personality":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,78 @@
---
id: delete-document
title: "Delete a document"
description: "Delete a document and all its associated memory units and links."
sidebar_label: "Delete a document"
hide_title: true
hide_table_of_contents: true
api: eJztVk1vGzcQ/SvE5JIYG8kxetqbGsupAacNYjUX2wjG3JGWMZfckLNyVGH/ezHkrj7iOkWBoqf64hU/3gzfzLyZLTCuIpQ3cO5115DjCHcFVBR1MC0b76CEc7LEpFBVwxmFrlJorTIcFcbotUGmSjXU+LBRnUvrrlLWuIc4uXW3blGbqB6NtUpj1FiRqhJqeeteq0VNe2zDkexSlmfWHkPSNw6oxdIy+EaxYI73xgvJpHrJ1LQ+oC1UpAYdG10ocmx48+rQ40fDteLaRzqytPPYtxRQaFAanfOs7kl1rvKOJlDAbveyghLygz6PDkEBLQZsiCkIw1tw2BCUgCty/NlUUIARelvkGgoI9LUzgSooOXRUQNQ1NQjlFnjTyr3IwbgVFMCGrSzMBEhdVtD3xQ59NP9vGBhzItu4E4jYehcpyq2z01P5d5wr153WFOOys+rjcBgK0N6xUFJuAdvWGp1Ym36Jcme796Tv+76An87OngJ/QmuqHIp5CD78A1Rog0SKTfa7IkZj5cswNfHpAev10S66zW/LFMFjooT1YcU4phUF6O/6YlzDEHBzwOaVzw5CX0ATVz8i/j3FiCuCHdjzRxMZaiG7/d62v/9Cmo+CfpPelU0P5+72MHt6M7vPP+M80/dXxsYjvywWH54A5tg2xLXfV0sqEq6hhCm2Zrp+M03VEafbsUr66ZjRcbo9SO4+ZffSJ26OCuJ9LuTZh0v4Xslu3UyNyvB6FIax8uMmMjVq6YOaXarsh+IaWUX2gWKhAnEwtJZPUbdAGL2Lyq8pZBBDWe1evFAXhNwFSlJyok5OfkbW9ejbNfuAKzo5KdMnqaazbFpLOxhFy6XRhhzbTVYp7Ng3KP4uUfOohcYP+Nfja64Jg64F+sIkJy2t0fEeuYvGrZQT99Aqi27V4YrU145kO6NdiAlJKnVhLJPkXHI2YSvUwceoHn2wVfJGCEncZ48GfnxrnPxSkUQJmewmoy9q4x7U3FWtN44F+B05kVJSqaa/cYdWoYuPFKK6x0iV8m4wYaqs48nE+KiM+y5gW6tPJnZozR8p+QT80jElrtY7lV+lk+vDkxliJ3mLgPpheHb6zvbQCVcDyi4zc4S6NlJgFbu29YGHPJgFXRsmLcmQ2wqNmdZFiqn/nZwshqRUV9K+xOZb7xzpg7ClTMRASltpV8YpNg3l67vgP7k+Jjlau1HRNMZiOGBNLs8znX9jWd4p4sviPzaUu+kO5LoNhJUk1kyIPuLeWpMixwHXFCLaVGMDh0NNob11avgbpB11kvahr42Vk6gTebJGk3SX/ZFZi7omdTY5hQK6YKGEmrmN5XT6+Pg4wbQ98WE1He7G6dXl2/mv1/PXZ5PTSc2NFWDxMcvFm8np5FSWWh+5QXdg68lM9L3WbPft6f8B6rkBamggUvHT1qJJvTFFbjv0hRvA1kAB6zdQ5MkpQgHlwQy1K0JZP5x+7gqofWTB2G5FRH4Ptu9lWaRuA+XNXQFrDAbvpXvcbKEyUb4rKJdoI/0goi8/Dn31lXruGWP7dNI812g7+QUFPNDmcAiUIeI/tHtIUBpWasKKQnp+PjHTmlo+uPtktpJJcNfHz+dX88Uc+v5PedtN5A==
sidebar_class_name: "delete api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Delete a document"}
>
</Heading>
<MethodEndpoint
method={"delete"}
path={"/api/v1/agents/{agent_id}/documents/{document_id}"}
context={"endpoint"}
>
</MethodEndpoint>
Delete a document and all its associated memory units and links.
This will cascade delete:
- The document itself
- All memory units extracted from this document
- All links (temporal, semantic, entity) associated with those memory units
This operation cannot be undone.
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: delete-memory-unit
title: "Delete a memory unit"
description: "Delete a single memory unit and all its associated links (temporal, semantic, and entity links)"
sidebar_label: "Delete a memory unit"
hide_title: true
hide_table_of_contents: true
api: eJy9VlFv2zgM/isC97IVbtIW9+S33JruCnS3Yc320hYDZzOxVlnyRDpdLvB/P1C2k3S97nDAYXmJLZMfqU/kR21BcMWQ38BbqkPcmHcNRRQbPMNdBiVxEW2j75DDOTkSMmjY+pUjU/curbdi0JcGnTNW2CBzKCwKlcZZf8/mpVDdhIguM0w1erFFljzIi5VNb/UKMghj9MsScihTvM99mM8aBjJoMGJNQlGz3oLHmiAHXJGXz7aEDKym2qBUkEGkb62NVEIusaUMuKioRsi3IJtG/Vii9SvIQKw4XZgpkLksoeuyHbqG/j/APypTCftO3bkJnonV4+zkRP8e833dFgUxL1tnPgzGkEERvJAXNcemcbZIhE2/svps91l0Xddl8NvZ2VPgT+hsmdzMPMYQ/wMqNFEPSWyfd0mC1umTFar5qYELxaOv6DfvlunkHpOkbA8r1gutKEJ312XjGsaImwMmr0KfIHQZ1Lz6GelviRlXBDuw500TGWahX7t97PDlKxXy6MBv0r760IPd3R5mT2/P7vPbOO/p+6dgo8kfi8X7J4D92dYkVdg3SmoOqSCHKTZ2uj6dpq7g6Xbsjm6aeskST7dDTXepqJch0fKoBwZBmL2/hB+F4NbPzNjSx2NHj3LAGxaqzTJEM7s0fQpGKhTDEiJxZiJJtLTWRxWBSMjBswlrimZMcHLrb/2LF+aCUNpIrK9H5ujod5SiGnO7lhBxRUdHeXokU7dObDNKkyU2tFzawpIXtzEPViqDrYQaNd8lFmLou0QsdF89/vW4m2vCWFQKfWFTko7W6GWP3KoKGq/poTMO/arFFZlvLennHu1CQ2g9mQvrhLTcUrIJ22ARA7N5CNGVKRslJHHfZzTwExrr9c0wqfgJuU2PvqisvzdzXzbBelHgN+RVQMmkdv4uLTqDnh8osvmCTKUJfghhy0F8NcS4qR73TcSmMp8st+jsX6nuFPzSCyWu1jvpXyXL9aFlD3EeirbWMIuIxf2w7fTcx0OvXA0o5WDM/Qm1DVMUw23ThChDHcxiUVmhQotBlxYVjZXWMnF+64+VkaEozZVOFI35OnhPxcGxpUrESKZwgclYb8TW1LvvDv+J+1jk6NzGsK2tw3jAmjrPezr/JbLuU3VXNH+sqR+BO5DrJhKWWlgzJfoR987ZdHIScU2R0aUeGzgcegrdrTfDb1B1LJKqD6Ns7JxEnSqTswXpYNmbzBosKjJnkxPIoI0OcqhEGs6n04eHhwmmz5MQV9PBl6dXl6/nf17Pj88mJ5NKaqfAmmMvF6eTk8mJLjWBpUZ/EGt3pTi4S/woN9v9cPoFV5BBh7V7po1Dm0ZMYmE7yOsNYGMhg/UpZP3FgyGD/OAKMh65Lo93h7sMqsCi7tut9uLH6LpOl1UxNpDf3GWwxmjxi4rwzRZKy/pcQr5Ex/QTVl5+GCbTK/PcDsYB5HX8rNG1+gYZ3NPm8PqkY/gXxh3JSaO+Iiwppq33X2dFQY0c+D25meg9ajcFz+dX88Ucuu5vWrnCbA==
sidebar_class_name: "delete api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Delete a memory unit"}
>
</Heading>
<MethodEndpoint
method={"delete"}
path={"/api/v1/agents/{agent_id}/memories/{unit_id}"}
context={"endpoint"}
>
</MethodEndpoint>
Delete a single memory unit and all its associated links (temporal, semantic, and entity links)
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"unit_id","in":"path","required":true,"schema":{"type":"string","title":"Unit Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: get-agent-profile
title: "Get agent profile"
description: "Get personality traits and background for an agent. Auto-creates agent with defaults if not exists."
sidebar_label: "Get agent profile"
hide_title: true
hide_table_of_contents: true
api: eJzFV0tz4zYS/iso5JK4aEl2sskWb5qJPXHVzMQVO7mMXVNtskUiBgEG3ZStVem/pxogJUqax64PG19MAf380P01sNYMFen8g55X6Fi9AwcVNuhY32e6RCqCadl4p3P9Blm1GMg7sIZXigMYJgWuVA9QPFbBd65UCx8UOAVibqLmHfvTIiAwUlpTT4ZrVeICOsukzEI5zwqfDTFNdKZ9iwHE41Wpc10hf4xqH9vgF8aiznQLARpkDBL3WjtoUOc6SZlSZ9pItC1wrTMd8K/OBCx1zqHDTFNRYwM6X2tetaJHHIyrdKbZsJWFBMRVqTebe9Gn1jtCEpXz2Uz+7cNy0xUFEi06q37rhXWmC+9YUMzXGtrWmiLmNP2TRGc9CqMNkjGb5GGbxX8VYNYn/3nZ97K/yfTo3I6d+hadQ6KRIdc1Dxh0pht4Nk3X6Pws041x6Xu2c/DroHtYLcOGYq/wucVg0BWovp2dnn0nERXeUWHQsfEdvdT76yMjh2EcSewiwGcOsMRAJp3J/+r8Yqx/6He8uXMJVUCEB4svTXi+Z+DQ6d7uzqvDLng2haHmJT7fj9QPPY72dv4eDNBH4oCu4volHl8ZIHUzGDj0+Yt/UsTBu8qu9gjJuIXtpMpI+dY4490WhE02BOEf/sSC95jhw64DPlWXB5VyeIr7+B5mf7/L6noX6m2kzqPMro/Z9QEIS+WdemUqdWmWqBpfop3EqKBpLSba2Kur2eSno1OIa59outnkx8NWmE3+dVA0s8n32YgmZpN/C6I71v8SBb3aSX3tGEYcHoltn7f2HN4f8OF1Gg8jBt6HdthI8KUpFXm0nytHgA48rDvCcHb+/b77XF8paBQo8gt+goAKXWUcYkjz7WymVgiBlF+M2c84RQyBu5aGHHM9t6Y4zPUfOlP5y/QP5+fHY+4PsKaMQ0xdhODDy2dciQzGypdhbOhYwPpibxfc6tdFnPX7NbbJtivGMVYY9OZ+V2IQAqxGhfjWpwCFohqqvlSz75AIqjg5k8jnRSMY6lZ2v1bekldy3cuNingHb0L382n8nOD7lLNB5Jfb2+sjg+lsG+Ta9zereJeSOtJTaM10eTaNZU/T9VD+m+nu2mXcwkcg9q4h77DxYaXm11dHLXfn5oqxaX0Ae0rYgGNTqCYp0IoYm9iH86vUiqS4BlbEPiBlKiAHg0v5lCtmQCAhdL/EkIwYpMmdu3PffKMuEbgLSPLzRJ2cvAIu6iG2G/YBKjw5yeMnqqazbFqLWzMKFwsTe8iuUv9Cx74BiXcBhVxPOUAheSX7N0M2NwihqMX0pYlBWlyC453ljoyrlJPwwCoLruqgQvVXJ5RAydqluJAKUpfGMkqBxWCjbQVF8ETqyQdbxmgEkIh9iqjHZzvxCOWCzGhXyfptbdyjunBl641jMfwGndyxUcUGfuYOrAJHTxhG8ya5MKUQC6+iiyGpZPdNgLZWfxjqwJr/xEoT41eOMWK1xOGsqyi5HEsmEz/7opO3hroNUDz2acfv5C8+RgYrZS9M6YS6ljCwoq5tfeC+DuahqA1jIcUgS7c1DpXWEVJ+504Fkb4o1VvjHkl8vvbOYTE6tliJQuuF9RR5m02DSX17+EfqQ5GDtStFpjEWwgg1Ub5IcH7FcxPp3CmW+KGR6cKGt0Zu2oBQSmHNBeg97K018eR68oc063oM+54Ce+dU/9fzOBSRx/uRNHROhE64SEaUjNWdyLyFokZ1PpnpTHfB6lzXzC3l0+nT09ME4vbEh2ra69L07dXri/c3F6fnk9mk5saK4e2A0meT2WQW3yqeuAE38iUvz71pfcg1690s+j89U3vqlfaZthZMnCoRhnVPqh80tEZnenkWr4xSuTrT+eiOMyRzn+naE4vKei0N+Huwm40sC02sdP7hPtNLCEZuA3EOlobku9T5AizhF9D49rd+AH2nPhf1MGecTJkl2E5+6Uw/4mr8ro6jtUYoMcQY0va8KLDlkeLRTUBe0dup8+biVm82fwMQd7Yf
sidebar_class_name: "get api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Get agent profile"}
>
</Heading>
<MethodEndpoint
method={"get"}
path={"/api/v1/agents/{agent_id}/profile"}
context={"endpoint"}
>
</MethodEndpoint>
Get personality traits and background for an agent. Auto-creates agent with defaults if not exists.
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"agent_id":{"type":"string","title":"Agent Id"},"name":{"type":"string","title":"Name"},"personality":{"properties":{"openness":{"type":"number","maximum":1,"minimum":0,"title":"Openness","description":"Openness to experience (0-1)"},"conscientiousness":{"type":"number","maximum":1,"minimum":0,"title":"Conscientiousness","description":"Conscientiousness (0-1)"},"extraversion":{"type":"number","maximum":1,"minimum":0,"title":"Extraversion","description":"Extraversion (0-1)"},"agreeableness":{"type":"number","maximum":1,"minimum":0,"title":"Agreeableness","description":"Agreeableness (0-1)"},"neuroticism":{"type":"number","maximum":1,"minimum":0,"title":"Neuroticism","description":"Neuroticism (0-1)"},"bias_strength":{"type":"number","maximum":1,"minimum":0,"title":"Bias Strength","description":"How strongly personality influences opinions (0-1)"}},"type":"object","required":["openness","conscientiousness","extraversion","agreeableness","neuroticism","bias_strength"],"title":"PersonalityTraits","description":"Personality traits based on Big Five model.","example":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}},"background":{"type":"string","title":"Background"}},"type":"object","required":["agent_id","name","personality","background"],"title":"AgentProfileResponse","description":"Response model for agent profile.","example":{"agent_id":"user123","background":"I am a software engineer with 10 years of experience in startups","name":"Alice","personality":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: get-agent-stats
title: "Get memory statistics for an agent"
description: "Get statistics about nodes and links for a specific agent"
sidebar_label: "Get memory statistics for an agent"
hide_title: true
hide_table_of_contents: true
api: eJylVktv3DYQ/ivE5NIayq5t9KTbNrFdA04bxNtcbCMYU7MSY4pkyNE6m4X+ezGUtI+6SVHUF1PkzDcz37x2C4x1gvIOFjU5Vu/QYU0tOYaHAipKOprAxjso4YpYJUY2iY1OCh99x8r5ipJCVylr3FNSKx8VqhRIm5XRCgUVCvCBIgrOdQUl1MSf8ssnwUtQQMCILTFF8WULDluCEgYZU0EBRjwIyA0UEOlLZyJVUHLsqICkG2oRyi3wJohe4mhcDQWwYSsXQ3DXFfT9g+in4F2iJCrnp6fy7zjU205rSmnVWfVhFIYCtHcs4ZRbwBCs0Tmi+eckOtu9G33f9wX8cn7+EvgjWlNlNXURo4//ARVCFBbZDH5XxGisnAxTm14KWK+PXtFt/lhldo9Z6ovdjXFMNUXoH/piusMYcXNA5Y0fHIS+gDbVP2L9HaWENcEO7PuimQy1lNd+b9s/fibNRxm/y3ENpke5hz3Mnt6B3e+H8Xag75+MTSK/LZfvXwAOuW2JGz9Wcq5ebqCEOQYzX5/Nc9mm+XYq334+lblxK59pOKrLd9T6uFGL99fw9567dwvF1AYf0b5O1KJjo1U7KKRNYmpzyy2uh1ZLihuUNvWRUqEicTS0lqO0aCRM3iXl1xQHEENpdu/u3atX6pKQu0hJPk/UycmvyLqZfLtlH7Gmk5MyH0m1nWUTLO1gFK1WRhtybDfq2XCjsGPfovi7Qs2KvnJELXEN+LdTNLeEUTcCfWmyk5bW6HiP3CXjauXEPbTKoqs7rEl96UieB7RLMSH1oy6NZZLyys5mbIU6+pTUs4+2yt4IIZn7waORHx+Mky+VSAYSk90M6MvGuCd14argjWMBviInE41Ubt+v3KFV6NIzxaQeMVGlvBtNmIocG95kE1NQA+5VxNCojyZ1aM23XGcCfu2YMldrmnJdZ8n1oeQA8dbrTua1WkbUT2PY+TzYywN9QqlG4TRkqAuJIqvUheAjj3WwiLoxTFqKQa6WDU2V1iVK5b17LYyMRaluZOyLzTfeOdIHacuViJGUtj6RMk6xaWlQ3yX/hfpU5GjtRiXTGovxgDVRvhjo/BfLEqfMWRb/sSWVs7ADuQ2RsJLCWgjRR9xba3LmOOKaYkKbe2zkcOwptPdOjX/jFEedp/i4vKbOydTJJLJGkyySvcgioG5Inc9OoYAuWiihYQ6pnM+fn59nmJ9nPtbzUTfNb67fXPx+e/H6fHY6a7i1Aiw+DuPibHY6O5Wr4BO36A5syfae5sZ+ied17XZr+mj4bPer6X/t/nG+SpfMg0WTV0eOdjtOzjvAYKCA9RkUw9KXYVkerP9hgD4U0PjEorDdSpf9GW3fy7XMgg2Udw8FrDEafJTxereFyiQ5V1Cu0Cb6QYQ/fRh3zM/qez5Pq8TJIlmj7eQLCniizeGPlbw9G8KKYvZheF5oTYEPFF8se/lpslssVxdL6Pu/AGALWMc=
sidebar_class_name: "get api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Get memory statistics for an agent"}
>
</Heading>
<MethodEndpoint
method={"get"}
path={"/api/v1/agents/{agent_id}/stats"}
context={"endpoint"}
>
</MethodEndpoint>
Get statistics about nodes and links for a specific agent
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: get-document
title: "Get document details"
description: "Get a specific document including its original text"
sidebar_label: "Get document details"
hide_title: true
hide_table_of_contents: true
api: eJy9V01v2zgQ/SsEe9kNFH+1vejmTZM0QLstGqeHTQJjQo0lNhSpkiMnruH/vhhKsuW6SYtisb5EombezDy+4TBrSZAHmV7LN07VJVoK8jaRGQbldUXaWZnKcyQBIlSo9EIrkbWWQltl6kzbXGgKwnmdawtGED6STKSr0AMjXGQylTnSvHOUiazAQ4mEnmOvpYUSZSohR0tznclEag5cARUykR6/1tpjJlPyNSYyqAJLkOla0qpiv0Be21wmkjQZXpgykLjI5GaTbNG78P9FgI6tJsYtQ4TK2YCBvSajEf/ZZ/GyVgpDWNRGfGqNZSKVs8SUpGsJVWW0ipQNvwT2WfcyqTwTSrqJoLPnsuOkkh2bv0RUIrsNnMcNfMbpQ7fTMzbcbIuYFxCKWIldfVjEjd2H4M1oV2xtjGTiOtCTBkO8ZQzG9AiE2RyeTeWksRLTmEddZb/gc9VYtT4lls6v5rXVNFeutn1XbQlz9D3f99FaXFlN4iRabzZJZ+7uvqCiPT1dyyi2nrD3Wf6Ou72y9+r5UaK3h3rsKWtffd0HUboMjVg4L3KkXS+jzSqnLQ1kIvERyoph1z0NyTqgH09efp9yKuFOteu9LZOT0eTV8Wh8PH49G4/Sl6N0NPqH246hAoagnZ2Pf1hWOn59IEZ5Vhuzy5YXRYEeB4PBPk9PBN7wL5GvJpPDxvwMRmex7cSp987/fldmSKBN7E/CMhwaGKf2vv5Co3Qa3NzuhAbew6qnyneuSTDqOeTPif89hgA5yi3Y06aRDDHjrz8TOdfVhG7tetLc0duw+3QZbxr6fhSsM3k7m308AGz2tkQqXDtq4oQhFucQKj1cjodRyGG47gS9GXZiCsN1bzJs4mhYuEjM3iHZtv7048VBc93YqSAsK+fBHAcswZJWolG2CKtAWMaOm16IJg9BBZAI5DyGRHgkr3HJj2Az4RGCs0G4JfoGRGMY3Ngb++KFOEOg2mPg1yNxdPQXkCq63C7Jecjx6CiNjyjK2pCuDG5hBC4WWmm0ZFbiQVMhoCZXAue7AEUCH8mD4roa/MuumksErwqGPtMxSYNLsLRDrgPfBCynB0YYsHkNOYqvNfLnBu2MQ7CixJk2hCy4mGzEFqC8C0E8OG+ymA0TErlvMmr5cZW2/CYC8jWC0Kwa9Fmh7b04bU8yBj5Hy5cQFLGhH6kGI8CGB/RB3EHATDjbhtAZWtK0iiG6ohrccw9VIT7rUIPR36LyGPzCEkaultjtdR4tl33LBmJ7X5h5UPdt2fG5iQeWuWpRtspsdqiuAnoSoa4q56nVwdSrQhMqFgMvzQrslFYHDOmNPWZGWlGKd9reB4554qxF1du2qETwKJRxAYW2gnSJjft28w/cO5GDMSsRdKkN+B5r7Hza0PmTyFwnn7zE+UOJIu7CFuSy8gjxijllove4N0bHnSMPS/QBmqnWctj2FJgbK9pfe66Diud6eynsOidSx2eT0Qp5gO5MphWoAsVkMOJR441MZUFUhXQ4fHh4GED8PHA+H7a+Yfju4uT078vT48lgNCioNAzMOTbHxXgwGox4qXKBSrC9WOf9mdyMk/D9cbPejaffvJq3pyu/DSsDOg6OWNm6PTevJVRaJnI57m4vnEbau8dsRcrr/av1bSILF4gx1mtusitvNhte5qNgJdPr20QuwWu449P1ei0zHfg5k+kCTMBnyv3jUzt0/hRPldHNFsuTZQmm5jeZyHtc9f/D4An7P8btExQneYGQoY/lNxZTpbCinu/BxYNvy9shd346k5vNv8fyvSg=
sidebar_class_name: "get api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Get document details"}
>
</Heading>
<MethodEndpoint
method={"get"}
path={"/api/v1/agents/{agent_id}/documents/{document_id}"}
context={"endpoint"}
>
</MethodEndpoint>
Get a specific document including its original text
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"id":{"type":"string","title":"Id"},"agent_id":{"type":"string","title":"Agent Id"},"original_text":{"type":"string","title":"Original Text"},"content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Hash"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"memory_unit_count":{"type":"integer","title":"Memory Unit Count"}},"type":"object","required":["id","agent_id","original_text","content_hash","created_at","updated_at","memory_unit_count"],"title":"DocumentResponse","description":"Response model for get document endpoint.","example":{"agent_id":"user123","content_hash":"abc123","created_at":"2024-01-15T10:30:00Z","id":"session_1","memory_unit_count":15,"original_text":"Full document text here...","updated_at":"2024-01-15T10:30:00Z"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: get-graph
title: "Get memory graph data"
description: "Retrieve graph data for visualization, optionally filtered by fact_type (world/agent/opinion). Limited to 1000 most recent items."
sidebar_label: "Get memory graph data"
hide_title: true
hide_table_of_contents: true
api: eJzNV21v20YS/iuD7ZfEoCVZTYEDv6mN4zOQOoGt9oDahjEmR+TWy112dyhFJ+i/H2a5lKk4boHiDjh9kbSceWbm2XnjTjFWQeW36lcdOjT638jaWXWfqZJC4XUb/+bqmthrWhNUHtsaSmSElfOwHqtl4KI8GrOFlTZMnkp43MIKC37gbUvwZuO8KadYkeWpa7XVzr6dwEfdaKYS2MHZbDaDxgUGTwVZBs3UhInKlGvJRzuXpcpVRfwQnVGZatFjQ0xeQtkpiw2pXEUjD7pUmdISQ4sswp7+6LSnUuXsO8pUKGpqUOU7JR6qXAX22lYqU6zZyMFCgOCyVPt9dkA/xDTA/9GR3x7hr9CEIwNot59W0cVjUwKbTmxnjNrfPxv/gAXDUh7u5dhTaJ0NFARvPpvJ1/FV3XRFQSGsOgPXSVhlqnCWyXL0om2NLiKT09+D6OxGPrZeeGbdW7Cu7H/EW4jaZan7S/48kuypTDG4x9+pYLU/HKD3uB0RehVR95misvofwJ9HVHmOj4YevNv8920sBRquBVqEHKN56KzmMEokbZkq8mMtkYNfotx+/7W1ce7cJuoHjo6COTY4SpYLKYj3yDi6+a8LuX8AjSvJxBoelTTZsnXaspQbfcGmFdTdcE23O7XyrlG5OosuqFzN1SGIQA1a1oXK1IZ0VbPKZ5N/SM6mJLrdKV0mZYOPZKS0jC4INs4/BUCGC+cqQ8+YsVvE8oia85Hmj+4RNlKXtX5K5Xqkc398/be7vgS+sMrVv5x/Am1XTuhBFq35bP7udHZ2evYDnM3y72dCgGXdp0Zy883n8+ubT1dvs+QnvPl0fbG4uvxtsbz8dPVWGoF4iY/F2fz7dz9MJkJjMvntQKOX49yZ7+WTqXfz+cvK/hWNLmPdwrn3zv/9si6JUZujojgWMK44Lpm/7lxDtu/vX6+aj653UGqmCdWfNd2fKQSs6LkEXxeNZAw98s+LSuLqTSe5UfE809uz+3oY73v6vmVsEPnncvn5BWB/tw1x7dIIi8OLa5WrKbZ6uj7rR2OY7obptZ8OUy4mrNBwNJZ+psb5LSw+X76o9Tu7AKamdR7N6VCe0PQKYRuYmtgAFpfQWwWukSGw8xQy8GnmhwzQluAJg7MB3Jp8D6IpTO7snf3uO/hAyJ2nIH9P4OTkR+SiHny7YeexopOTPP4kaDrDujV0gAFarXShybLZwkZzDdixa1D8lUEL9IU9FhJXj38zRHND6ItaoD/o6KShNVp+Ru6CthVYcQ8NGLRVhxWBTGst/graYcbCh7i1aFtFZyM2YOFdCBD7SvRGCInc9x4lftI2EyCQ7CNMZtujL2ttn+A8tVYBviArqwxBakkdGkAbNuQDPGKgEpxNJnQZ29A2mhiC6nFjs4ejxU3ALy1T5GpNw133Hf5oV+sh3ruia8TM0mPxlMKOv3t7aIWrhFIm4dDfUNcG8gyha1vnOeXBwhe1ZiokGeRoWdOQaV2gkN/ZU2EkJSV81PYpiM2fnLVUjK4tZiJ6gsK4QKAtsG6oVz9c/gv1IcnjBhp0ow36EWuifN7T+ReWJU7psyz+Y0MwDIPkQesJS0mshRB9xL0xOt4ce1yTD9gP2cRhqik0dxbSJ3VxLGIXT9vlUDmROulEMj5knj+LLFosaoL5RGZV52Um1sxtyKfTzWYzwfh44nw1Tbph+vHyp/Orm/PT+WQ2qbkxAiw+9u3ibDKbzOSodYEbtCNbF8THuSTbwtf9Zvc8jf4v3hdSa5YCm7YGdZw6kahdarq3ClutMrWWlaRvgSpT+ejFoe+995mqXWBR2O2kQH/xZr+X437pl7lY6iDrxvPa/0Tbr14T1mg68SiO/TV6LQrfVn6V2DfXaZq9hddCHIaW3Y5tDg4dgotzuiYsyUcf+seLoqCWR4ov1gpx/jDCLs6Xar//Dw9s58g=
sidebar_class_name: "get api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Get memory graph data"}
>
</Heading>
<MethodEndpoint
method={"get"}
path={"/api/v1/agents/{agent_id}/graph"}
context={"endpoint"}
>
</MethodEndpoint>
Retrieve graph data for visualization, optionally filtered by fact_type (world/agent/opinion). Limited to 1000 most recent items.
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"fact_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fact Type"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"nodes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Nodes"},"edges":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Edges"},"table_rows":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Table Rows"},"total_units":{"type":"integer","title":"Total Units"}},"type":"object","required":["nodes","edges","table_rows","total_units"],"title":"GraphDataResponse","description":"Response model for graph data endpoint.","example":{"edges":[{"from":"1","to":"2","type":"semantic","weight":0.8}],"nodes":[{"id":"1","label":"Alice works at Google","type":"world"},{"id":"2","label":"Bob went hiking","type":"world"}],"table_rows":[{"context":"Work info","date":"2024-01-15 10:30","entities":"Alice (PERSON), Google (ORGANIZATION)","id":"abc12345...","text":"Alice works at Google"}],"total_units":2}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,63 @@
---
id: list-agents
title: "List all agents"
description: "Get a list of all agents with their profiles"
sidebar_label: "List all agents"
hide_title: true
hide_table_of_contents: true
api: eJylV9ty2zYQ/RUM8tJ6aIly4rTDN9m1U83kNrXSh9oez5pckYhBAAFAyaxG/95ZkJQoyrm5fjFE7O5Z7OUssOYecseTaz7NUXn2DhTkWKLy/DbiGbrUCuOFVjzhb9AzYFI4z/SCgZQMSMexlfAF8wUKy4zVCyHR8YhrgxZIdZbxhJPaXSPPI27RGa0cOp6s+Ukc0799sKsqTdG5RSXZX60wj3iqlSffkjUHY6RIA8D4syOdNXdpgSXQyliC96JBaHGTNRceS/cVgTuR0drXBnnCnbdC5TziXnhJH5oAzTK+ibiCEr8l+572NxE3aJ1WIIWvD0G1QaXQuZ4hVZX3aHnES3gUZVXyZBLxUqhmHe8APnS6wyR1G8xrho8GrUCVIvslPp78Sh6lWrlUoPJCV+656OcHRoZuHEjsPMBHb2GJ1okmaT8LftHXH+L2N3eQkFtEuJf43ANP9wwMQfd2d6gKK6u9SIUrn4P5vqc+ROzt7fDuBbg75y2q3BfPQTwT4NhVZ2CI+adeMeetVrmsWa+wmVALWVGVOaaNUEKrbRA2UeeEvv+MqQ+t/6USFjPiHL2r4sO6HFTKMIv78R2e/nZ3qo87V+cWhD/MX0+C+SDC7sFhxrRiZyJnl2KJrNQZylHwCkojsaGNvbqKR78dZCF8e6Lp4tHrYSvEo9NB0cSjl1GPJuLR7xTRe0gfcqsr9U26OttJUdtbBI/ZHTTcqeoPC55cD7U3Ua9opOSbXhjPGwts6sleZbL/ae9TYyHY+06ZbNm5Jd59Xt0LyO2Ar98K52ceDzuoYfMwzGgmNDOsnV7MVWUJth7xnWNgLdTDaeB+zHX3pFu9sbbvWrfRlBxbaBv8FCrvDd2DSmwm3HV/lvHKoZ2cvNwPUcJnDEoGzOmFX4FFhioXCgNF9OuEn8Qnr47jyfHkdD6Jk5dxEsf/dDlI+FSKdJiLp3ri9ImeOP1KT5z+SE+c7vfE6aAcd26/nk9eJSeN25vbTfiLeIm+0BSGHClbBsglPgYjxsvJeHtFEWqhQ3/tjf93WGpbs+nH2UHabtSUeSyNtiCPHZagvEhZ2Si42lGVUS6ns+7e5AvwzHlt0UXMorcCl7QElTGL4IhI9RJtY0SgG92oG/XiBbtE8JVFRz+P2NHRGfi06Hy78tpCjkdHSVgiKyvphZG4NcNwsRAh9rJuCh8qr0sgfxeQehZykNK5GvtX3WmuEGxakOlLEZyUuATld5YrR2WqyD2QTILKK8iRfanoIuIaa5cEMa8NskshPRJTBGeDbQap1c6xlbYyC95QQELsG4/a+GwnjUMDFjzKurE+L4R6YBcqM1ooT4bfoKKbKLJwe3z0FUgGyq3Q9ni+gRAZFaSvA0R3qMbuGwumYH8LV4EU/4Z7JxmfKY8hVkvscp0HyWVfsjHxh04rulqzuYX0oT12WDd44e7dWcla4fZ6XRmH1jNXGaOtb+tgatNCeEypGOjTvMCu0iqHLrlRxxSRtijZW6EeHGGea6Uw7aUtVCJRQSq1QyYU86LERn2b/AP1rshBypo5UQoJthc1Ur5owvkd5DLQgKI3BHNQEiN54bdGroxFyKiwphTovdhLKULmWtKAhi/bGLY9BfJGsfavfURAGgZXS2Vd54TQEekTtRE170SmBtIC2cko5hGvrOQJL7w3LhmPV6vVCML2SNt83Oq68dvZ+cX7q4vjk1E8KnwpyfCW2PhkFI/i8EbQzpegelg0HXpUP2Sa9e4Z9LNvsnZUUReMjQShwiyn06xbIrzmYASP+HISblzd9Cq087S5XlPHfLJys6HP1Nc1T65vI74EK4j26dcm4gVChjYMpAesKYBpioYIdwmyChN1+ICj28GWnN9czPlm8x9AEQw1
sidebar_class_name: "get api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"List all agents"}
>
</Heading>
<MethodEndpoint
method={"get"}
path={"/api/v1/agents"}
context={"endpoint"}
>
</MethodEndpoint>
Get a list of all agents with their profiles
<ParamsDetails
parameters={undefined}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"agents":{"items":{"properties":{"agent_id":{"type":"string","title":"Agent Id"},"name":{"type":"string","title":"Name"},"personality":{"properties":{"openness":{"type":"number","maximum":1,"minimum":0,"title":"Openness","description":"Openness to experience (0-1)"},"conscientiousness":{"type":"number","maximum":1,"minimum":0,"title":"Conscientiousness","description":"Conscientiousness (0-1)"},"extraversion":{"type":"number","maximum":1,"minimum":0,"title":"Extraversion","description":"Extraversion (0-1)"},"agreeableness":{"type":"number","maximum":1,"minimum":0,"title":"Agreeableness","description":"Agreeableness (0-1)"},"neuroticism":{"type":"number","maximum":1,"minimum":0,"title":"Neuroticism","description":"Neuroticism (0-1)"},"bias_strength":{"type":"number","maximum":1,"minimum":0,"title":"Bias Strength","description":"How strongly personality influences opinions (0-1)"}},"type":"object","required":["openness","conscientiousness","extraversion","agreeableness","neuroticism","bias_strength"],"title":"PersonalityTraits","description":"Personality traits based on Big Five model.","example":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}},"background":{"type":"string","title":"Background"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["agent_id","name","personality","background"],"title":"AgentListItem","description":"Agent list item with profile summary."},"type":"array","title":"Agents"}},"type":"object","required":["agents"],"title":"AgentListResponse","description":"Response model for listing all agents.","example":{"agents":[{"agent_id":"user123","background":"I am a software engineer","created_at":"2024-01-15T10:30:00Z","name":"Alice","personality":{"agreeableness":0.5,"bias_strength":0.5,"conscientiousness":0.5,"extraversion":0.5,"neuroticism":0.5,"openness":0.5},"updated_at":"2024-01-16T14:20:00Z"}]}}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: list-documents
title: "List documents"
description: "List documents with pagination and optional search. Documents are the source content from which memory units are extracted."
sidebar_label: "List documents"
hide_title: true
hide_table_of_contents: true
api: eJzFV01z2zYQ/SsY5NJ6aIlS4gtvamKnnnGaD6s51PZo1uRKRAwCDLCUrWr03zsLghQVx3Hb6Ux1MQku3i7ePuyut5Jg5WV2Jd/YvKnQkJc3iSzQ507VpKyRmbxQnkTRfRf3ikpRw0oZYAMBphA22IIWHsHl5Uj0cAIcCipReNu4HEVuDaEhsXS2EvelyktRYWXdRjRGRXN8IAc5YTGSibQ1uuDovJCZ1MrToo9FJrIGBxUSOj7FVhqoUGYSVmhooQqZSMVHqIFKmUiHXxvlsJAZuQYT6fMSK5DZVtKm5n2enDIrmUhSpHlhxkDivJC7XdKjf+1gvzboNge4S9D+ABjM5v0yhHboguHiimm0lrubvdOPB960qhT9A48RVRnCFTrJ2VxCo0lmkzTdO7kIsENHdrn0+N94Gvh536Lu+IAOfW2NR8+7p2nKfw61dtnkOXq/bLT4FI1lIqNoAp91rVUeBDH+4nnPdhBR7VgupFoPirA6fICiUK1SPwwsWzHE09jbL5iT3PUL4BxsBpI4D2D83RLo7/LQmc6DxS6JOfyRaUxH0mXhR7Y9pd8GPczWVTx1F2fSCyl6uBk699Tf2AHvh7npPojKFqjF0jqhD0sDmqK2yhDfW3yAqmb0nv6r7f5eZrLx6CbTl/vsLkrwJfN9m8d1h0BYLIBkJqfp9NVxOjmenMwnafYyzdL0D5YqQ3n0XlmzmMhEtsVkwcVkkduGRTM5SSThAy00mhWVMjt5NU0T2dTFM/As2Zi5cHW61KR97k/SHf8S+Wo6fSzmz6BV0RbJU+es+/dKLpBA6QMpHxpomx8K/fmy0+lqd/O01i9sGyALs/KrH1XKd+g9rHB/cZ42DWSIOX99TsN8rtZ1tBuodk9vy+7Tx3jT0vc9Z53Jr/P5h0eAbW4rpNKyzlahOoZekskx1Gq8noyDpP1420l7Nx62J2WWNlBx0E/etR1v9uH80SW7NjNBWNXWgT72WIEhlXct0m88YRVu3uxctJ4FlUDCk3XoE+GQnMI1P3JfdgjeGi/sGl0LotCPrs21efFCnCFQ49Dz65E4OvoFKC+72C7JOljh0VEWHlFUjSZVa+xhBC6XKldoSG/aoQAashVwvEvIqWvjykb8y+40l2FIYOgzFYLUuAZDe+TGK7MShsMDLTSYVQMrFNySFMfLaGfsgjUkzpQmZImFYAO2gNxZ78W9dboI0TAhgfs2osiPrZXhN+GRBwlCvWnR56Uyd+I01jMGfouGB5E4wTxQA1qA8ffovLgFj4XgWSi4UAUaUrQJLrpDtbhvHdSl+Kx8A1r9GbTG4OeGMHC1xi7Xq2C5Hlq2EF2hFnMH+V08dnhu/YFhriLKN2NbU3t0JHxT19ZR1MHM5aUizFkMvDTnaa1VWuPRZ9fmmBmJohQXytx59vnaGoP5IG1BiTzA5dp6FMoIUhW22/vkP9reiRy03givKqXBDVjjzactnc945nNyrQ3TJlQoQhZ6kMvaIRQsrBkTfcC91ipkjhys0Xlou1vkMN4p0NdGxF+s5JCHSh7np+7mBOrarp8jN9K9yayGvEQxHaUykY3TMpMlUe2z8fj+/n4E4fPIutU47vXji/PXp79dnh5PR+mopCqMExxjWy4mo3SU8lJtPVVgBr4Ox/ZvC81234r+5wE/VmS+U+NagwrNJnCzjbX2SkKtZCLX3ODbqicTmQ2G/GL430tpPfGm7Zbv5e9O73a83A603BIL5eFWD0baO9zEsX4NuuFoQqN8wq6bo/6ObT9T741v+MUptv5+NE/m6adPsTP+LJ7irWuAZjP02UXTMxZ6folQoAsxtJ9neY71MNhHIwoH37fDt6dzudv9BQlO5jo=
sidebar_class_name: "get api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"List documents"}
>
</Heading>
<MethodEndpoint
method={"get"}
path={"/api/v1/agents/{agent_id}/documents"}
context={"endpoint"}
>
</MethodEndpoint>
List documents with pagination and optional search. Documents are the source content from which memory units are extracted.
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"ListDocumentsResponse","description":"Response model for list documents endpoint.","example":{"items":[{"agent_id":"user123","content_hash":"abc123","created_at":"2024-01-15T10:30:00Z","id":"session_1","memory_unit_count":15,"text_length":5420,"updated_at":"2024-01-15T10:30:00Z"}],"limit":100,"offset":0,"total":50}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: list-memories
title: "List memory units"
description: "List memory units with pagination and optional full-text search. Supports filtering by fact_type."
sidebar_label: "List memory units"
hide_title: true
hide_table_of_contents: true
api: eJy9V21v2zYQ/isE96UNZFvOnG7TN69NMwNp0zVuB7QJiot0tthQpEKenHqG//twpOTITdN2wzZ/sUQd73l479xIgqWX2Xv5Aivr1uKsRgekrPHyMpEF+typmt9lJk+VJ1FFucYo8uJWUSlqWCoT9ggwhbBBHLRYNFoPCD+R8AguL4fivKlr68iLhdKETpmluFqLBeT0gdY1DmUibYc/K2QmtfL0ISAq9DKRNTiokNAx5Y00UKHMJCzR0AdVyEQq5lkDlTKRDm8a5bCQGbkGE+nzEiuQ2UYymMykJ6YgE0mKNC9MWZGYFXK7TXbad/Q69TcNuvWe/gVovwcAZn22CBT3oVhtu2IareX28g78OeQk5vyxj37zH6P+voemVaXobyC2WpUhXKKTHDALaDTJbJymdyCnQW0fyC4WHv8dpB7OWdS65QM69LU1Hj3vPkxT/tsP5/Mmz9H7RaPF61ZYJjK3htBQsGdda5WHaBx99Lxn02NUO45VUhFBEVb7D1AUKmbCq55kDMX2NPbqI+Ykt7sFcA7WvYCcBWX83RLoL9qhE50HiW3S+vBroq07ks4LX5PdmfRz0n1vvW9P3fFMdoHUIlz2wT3FWvOGS0jP8vve6T6IyhaoxcI6oe/VHzRFbZUhrhz4CaqaIXY+eL+J3vxEMpN/WHctcmtW6HxwKSMCMaXD9HAySMeD8dF8nGY/plmavmOFhlR0mpxqlaN49Or49fnZy8eJOLF2qVE8Ont9Mn05ezedz85ePpZJr1Zk8tY6HUoSF7KjoxR/nqTpAA9/uRpMxsVkAD+NnwwmkydPjo4mkzRNUzZf5Brhbq279gKoQ7NGUIliOhOEUIUsbn0dkq1zZrqLlvFRuuVfIieHh/fj/y1oVcS6feycdf88+AskUHov+vcFtM33c+PblaoLxe3lw+lxaiNBjuXKL79W2l+g97DEu1x7WDQYY1eJvxr2fK4I3cr1Av3OvNG6Dx/jWTTfl8A6kd/m81f3FEbfVkil5RhbhoIaml8mR1Cr0Wo8Cr3RjzZdj9yOunY64nQKFXhhgzn2mmA7Dkxfze5l5oWZCsKqtg70wGMFhlTe5aVfe8IqpOt0JiK6oBJIeLIOfSIcklO44kceFxyCt8YLu0InOm7DC3NhfvhBPEegxqHn1wNxcPArUF523M7JOljiwUEWHlFUjSZVa9ypEbhYqFyhIb2Oswo0ZCtgvpyqAj+Rg5zPFfWfd6c5DxMLq36uAkmNKzB0p7nxPL0YpgdaaDDLBpYouJMp5svadh1dPO/mnUA26BaQO+u9CGUisGGDBNtHRq19bK0MvwmPPP0Q6nXUPi+VuRbHbQVkxSdoeHhC0Va9BrQA42/ReXEFHgsuIRFCFaG6rQNEd6io98RBXYq3yjeg1Z8h3lj5zBAGW62w8/UySK76klHFM5s3FcPMHeTX7bHDc8QDw7ZqtRStcDtNNrVHR8LHUbGNg6nLS0WYczDw0rzELtIajz67MAO2SBuU4lSZa8+YT60xmPfcFiIRHIpcW49CGUGqwrh95/x727sgB63XwqtKaXA9q/Hm42jObyDzOVVbxz1UKLoe0zKoHULBgTVlQ+/ZXmsVPEcOQguLLbG1YZtToC+MaH9tNYc8VPN27OoyJ5guDgs5cve9E5nWkJcoDofcjxqnZSZLotpno9Ht7e0QwuehdctRu9ePTmdPj1+eHw8Oh+mwpCpMIcwxlovxMB2mvFRbTxWYHta9C8XntWZz15H+l9tHW35526jWoEJnCUbYtIX1vYRayUSuxjKJFw8mnfWuIL3rSqiwl4ksrSfeutlwGr5xervl5Tj2chcslIcr3Rt8r3H92dVjBbphbqFHPiB/851y3XT2PbK7Sf1O+JJfnGLpL7N/0IePXrfN87F4yNpdjzTrPmbHZmfnMBaUCAW6wCF+nuY51n2y96YYJr/rmCfHc7nd/gXQ2CLs
sidebar_class_name: "get api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"List memory units"}
>
</Heading>
<MethodEndpoint
method={"get"}
path={"/api/v1/agents/{agent_id}/memories/list"}
context={"endpoint"}
>
</MethodEndpoint>
List memory units with pagination and optional full-text search. Supports filtering by fact_type.
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"fact_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fact Type"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"ListMemoryUnitsResponse","description":"Response model for list memory units endpoint.","example":{"items":[{"context":"Work conversation","date":"2024-01-15T10:30:00Z","entities":"Alice (PERSON), Google (ORGANIZATION)","fact_type":"world","id":"550e8400-e29b-41d4-a716-446655440000","text":"Alice works at Google on the AI team"}],"limit":100,"offset":0,"total":150}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: list-operations
title: "List async operations"
description: "Get a list of all async operations (pending and failed) for a specific agent, including error messages for failed operations"
sidebar_label: "List async operations"
hide_title: true
hide_table_of_contents: true
api: eJzFVktz2zgM/isY9tJmFDvJ7Ek3b5tkM5NuO423lyTTQShYYkORLAk5dT367zug5Fez6c6e1hdTJPAB+IgH14qxTqq8Ve+p9XEFHwJFZONdUveFqijpaIJ8q1JdEgOCNYnBLwCtBUwrp8FvdeB1IFcZVwO6ChZoLFVvYOEjIKRA2iyMBqzJcQHGadtlWYrRR2gpJawpZfFBdQ9ZFWr7cVWpUokbXw7OA0ZsiSlKPGvlsCVVqmzti6lUoYwEEZAbVahI3zoTqVIlx44KlXRDLapyrXgVRC9xNK5WhWLDVjZmAgRXler7e9FPwbtESVTOTk7k75Ctm05rSmnRWfg0CqtCae+YHIs4hmCNzu5PvybRWe/c6Pu+L9RvZ2fPgT+jNVVWg3Nh7j+gqhCFMjaD3xUxGisrw9Sm5wLW64NTdKsPi8zuIUt9sd0xjqmmqPr7vtjsYYy42qPy2g8Oqr5Qbap/xfr7ISvUFuxl0UwGzOW039n2D19J88GN3+a4BtOj3P0OZkfvwO7LYbwb6PsnYxuRP+bzj88Ah7ttiRsvmVwT5+zlRpVqisFMl6fTnLZput6kbz89yHXjFj5zcZCcYw3PPl6pn2v3zs2AqQ0+oj1O1KJjo6EdFNIqMbW58GZXQ30m4AYZEvtIqYBIHA0tZSmVHQmTlLtfUhxADKXJnbtzr17BBSF3kZJ8HsHR0e/Iutn4dsM+Yk1HR2VeErSdZRMsbWGAFgujDTm2K3gy3AB27FsUfxeoGeg7R9QS14B/s4nmhjDqRqAvTHbS0hId75C7JO3GiXtowaKrO6wJvnUkxwPahZiQJIILY5kkx7KzGRtQR58SPPloq+yNEJK5Hzwa+fHBuNwPE0lXYrKrAX3eGPcI564K3jgW4Etycq8EuYa/c4cW0KUnigkeMEkTdKMJU5Fjw6tsYhPUgHsZMTTw2aQOrfmR00TArxxT5mpJm7uus+RyX3KAeOd114qZeUT9OIad14M9dMLViFKNwmm4oS4kigypC8FHHvNgFnVjmLQkg2zNG9pkWpcolXfuWBgZkxKujXtMYvOtd4703rXlTMRIoK1PBMYBm5YG9e3lP1PfJDlau4JkWmMx7rEmyucDnf9iWeKUZsviP7YE+Ra2IDchEuY5NhOiD7i31uSb44hLigltrrGRw7Gm0N45GH9jK0edW/k4wTaVk6mTdmSNJpkmO5FZQN0QnE1OVKG6aFWpGuaQyun06elpgvl44mM9HXXT9Prq7fmfN+fHZ5OTScOtFWDxcWgXp5OTyYlsBZ+4Rbdn61rm/8+D/+d+s96NpP/72TC2ZqmtabBo8tTJHK3HpnurMBhVqOWpKob3guiVey8Hf/Aqanxi0VqvpUD/irbvZVvayEqVt/eFWmI0+CCd+XatKpNkXalygTbRL5h6/WmcUW/gJcc3o8jJIFqi7eRLFeqRVvuPnTx9G8KKYvZhOJ5pTYH3FJ89FuRpsx1Ml+dz1fd/A2bNiYA=
sidebar_class_name: "get api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"List async operations"}
>
</Heading>
<MethodEndpoint
method={"get"}
path={"/api/v1/agents/{agent_id}/operations"}
context={"endpoint"}
>
</MethodEndpoint>
Get a list of all async operations (pending and failed) for a specific agent, including error messages for failed operations
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={undefined}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,76 @@
---
id: search-memories
title: "Search memory"
description: "Search memory using semantic similarity and spreading activation."
sidebar_label: "Search memory"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "post api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Search memory"}
>
</Heading>
<MethodEndpoint
method={"post"}
path={"/api/v1/agents/{agent_id}/memories/search"}
context={"endpoint"}
>
</MethodEndpoint>
Search memory using semantic similarity and spreading activation.
The fact_type parameter is optional and must be one of:
- 'world': General knowledge about people, places, events, and things that happen
- 'agent': Memories about what the AI agent did, actions taken, and tasks performed
- 'opinion': The agent's formed beliefs, perspectives, and viewpoints
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"type":"string","title":"Query"},"fact_type":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fact Type"},"thinking_budget":{"type":"integer","title":"Thinking Budget","default":100},"max_tokens":{"type":"integer","title":"Max Tokens","default":4096},"trace":{"type":"boolean","title":"Trace","default":false},"question_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Date"}},"type":"object","required":["query"],"title":"SearchRequest","description":"Request model for search endpoint.","example":{"fact_type":["world","agent"],"max_tokens":4096,"query":"What did Alice say about machine learning?","question_date":"2023-05-30T23:40:00","thinking_budget":100,"trace":true}}}}}}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"results":{"items":{"properties":{"id":{"type":"string","title":"Id"},"text":{"type":"string","title":"Text"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"event_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Date"},"document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Id"}},"type":"object","required":["id","text"],"title":"SearchResult","description":"Single search result item.","example":{"context":"work info","document_id":"session_abc123","event_date":"2024-01-15T10:30:00Z","id":"123e4567-e89b-12d3-a456-426614174000","text":"Alice works at Google on the AI team","type":"world"}},"type":"array","title":"Results"},"trace":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trace"}},"type":"object","required":["results"],"title":"SearchResponse","description":"Response model for search endpoints.","example":{"results":[{"context":"work info","event_date":"2024-01-15T10:30:00Z","id":"123e4567-e89b-12d3-a456-426614174000","text":"Alice works at Google on the AI team","type":"world"}],"trace":{"num_results":1,"query":"What did Alice say about machine learning?","time_seconds":0.123}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,156 @@
import type { SidebarsConfig } from "@docusaurus/plugin-content-docs";
const sidebar: SidebarsConfig = {
apisidebar: [
{
type: "doc",
id: "api-reference/endpoints/agent-memory-api",
},
{
type: "category",
label: "Visualization",
items: [
{
type: "doc",
id: "api-reference/endpoints/get-graph",
label: "Get memory graph data",
className: "api-method get",
},
],
},
{
type: "category",
label: "Memory Operations",
items: [
{
type: "doc",
id: "api-reference/endpoints/list-memories",
label: "List memory units",
className: "api-method get",
},
{
type: "doc",
id: "api-reference/endpoints/search-memories",
label: "Search memory",
className: "api-method post",
},
{
type: "doc",
id: "api-reference/endpoints/batch-put-memories",
label: "Store multiple memories",
className: "api-method post",
},
{
type: "doc",
id: "api-reference/endpoints/batch-put-async",
label: "Store multiple memories asynchronously",
className: "api-method post",
},
{
type: "doc",
id: "api-reference/endpoints/list-operations",
label: "List async operations",
className: "api-method get",
},
{
type: "doc",
id: "api-reference/endpoints/cancel-operation",
label: "Cancel a pending async operation",
className: "api-method delete",
},
{
type: "doc",
id: "api-reference/endpoints/delete-memory-unit",
label: "Delete a memory unit",
className: "api-method delete",
},
],
},
{
type: "category",
label: "Reasoning",
items: [
{
type: "doc",
id: "api-reference/endpoints/think",
label: "Think and generate answer",
className: "api-method post",
},
],
},
{
type: "category",
label: "Agent Management",
items: [
{
type: "doc",
id: "api-reference/endpoints/list-agents",
label: "List all agents",
className: "api-method get",
},
{
type: "doc",
id: "api-reference/endpoints/get-agent-stats",
label: "Get memory statistics for an agent",
className: "api-method get",
},
{
type: "doc",
id: "api-reference/endpoints/clear-agent-memories",
label: "Clear agent memories",
className: "api-method delete",
},
{
type: "doc",
id: "api-reference/endpoints/get-agent-profile",
label: "Get agent profile",
className: "api-method get",
},
{
type: "doc",
id: "api-reference/endpoints/update-agent-personality",
label: "Update agent personality",
className: "api-method put",
},
{
type: "doc",
id: "api-reference/endpoints/add-agent-background",
label: "Add/merge agent background",
className: "api-method post",
},
{
type: "doc",
id: "api-reference/endpoints/create-or-update-agent",
label: "Create or update agent",
className: "api-method put",
},
],
},
{
type: "category",
label: "Documents",
items: [
{
type: "doc",
id: "api-reference/endpoints/list-documents",
label: "List documents",
className: "api-method get",
},
{
type: "doc",
id: "api-reference/endpoints/get-document",
label: "Get document details",
className: "api-method get",
},
{
type: "doc",
id: "api-reference/endpoints/delete-document",
label: "Delete a document",
className: "api-method delete",
},
],
},
],
};
export default sidebar.apisidebar;

View file

@ -0,0 +1,79 @@
---
id: think
title: "Think and generate answer"
description: "Think and formulate an answer using agent identity, world facts, and opinions."
sidebar_label: "Think and generate answer"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "post api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Think and generate answer"}
>
</Heading>
<MethodEndpoint
method={"post"}
path={"/api/v1/agents/{agent_id}/think"}
context={"endpoint"}
>
</MethodEndpoint>
Think and formulate an answer using agent identity, world facts, and opinions.
This endpoint:
1. Retrieves agent facts (agent's identity)
2. Retrieves world facts relevant to the query
3. Retrieves existing opinions (agent's perspectives)
4. Uses LLM to formulate a contextual answer
5. Extracts and stores any new opinions formed
6. Returns plain text answer, the facts used, and new opinions
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"type":"string","title":"Query"},"thinking_budget":{"type":"integer","title":"Thinking Budget","default":50},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"}},"type":"object","required":["query"],"title":"ThinkRequest","description":"Request model for think endpoint.","example":{"context":"This is for a research paper on AI ethics","query":"What do you think about artificial intelligence?","thinking_budget":50}}}}}}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"text":{"type":"string","title":"Text"},"based_on":{"items":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"text":{"type":"string","title":"Text"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"event_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Date"}},"type":"object","required":["text"],"title":"ThinkFact","description":"A fact used in think response.","example":{"context":"healthcare discussion","event_date":"2024-01-15T10:30:00Z","id":"123e4567-e89b-12d3-a456-426614174000","text":"AI is used in healthcare","type":"world"}},"type":"array","title":"Based On","default":[]},"new_opinions":{"items":{"type":"string"},"type":"array","title":"New Opinions","default":[]}},"type":"object","required":["text"],"title":"ThinkResponse","description":"Response model for think endpoint.","example":{"based_on":[{"id":"123","text":"AI is used in healthcare","type":"world"},{"id":"456","text":"I discussed AI applications last week","type":"agent"}],"new_opinions":["AI has great potential when used responsibly"],"text":"Based on my understanding, AI is a transformative technology..."}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,71 @@
---
id: update-agent-personality
title: "Update agent personality"
description: "Update agent's Big Five personality traits and bias strength"
sidebar_label: "Update agent personality"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "put api-method"
info_path: docs/api-reference/endpoints/agent-memory-api
custom_edit_url: null
---
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import ParamsDetails from "@theme/ParamsDetails";
import RequestSchema from "@theme/RequestSchema";
import StatusCodes from "@theme/StatusCodes";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";
import Heading from "@theme/Heading";
<Heading
as={"h1"}
className={"openapi__heading"}
children={"Update agent personality"}
>
</Heading>
<MethodEndpoint
method={"put"}
path={"/api/v1/agents/{agent_id}/profile"}
context={"endpoint"}
>
</MethodEndpoint>
Update agent's Big Five personality traits and bias strength
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={{"required":true,"content":{"application/json":{"schema":{"properties":{"personality":{"properties":{"openness":{"type":"number","maximum":1,"minimum":0,"title":"Openness","description":"Openness to experience (0-1)"},"conscientiousness":{"type":"number","maximum":1,"minimum":0,"title":"Conscientiousness","description":"Conscientiousness (0-1)"},"extraversion":{"type":"number","maximum":1,"minimum":0,"title":"Extraversion","description":"Extraversion (0-1)"},"agreeableness":{"type":"number","maximum":1,"minimum":0,"title":"Agreeableness","description":"Agreeableness (0-1)"},"neuroticism":{"type":"number","maximum":1,"minimum":0,"title":"Neuroticism","description":"Neuroticism (0-1)"},"bias_strength":{"type":"number","maximum":1,"minimum":0,"title":"Bias Strength","description":"How strongly personality influences opinions (0-1)"}},"type":"object","required":["openness","conscientiousness","extraversion","agreeableness","neuroticism","bias_strength"],"title":"PersonalityTraits","description":"Personality traits based on Big Five model.","example":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}}},"type":"object","required":["personality"],"title":"UpdatePersonalityRequest","description":"Request model for updating personality traits."}}}}}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"agent_id":{"type":"string","title":"Agent Id"},"name":{"type":"string","title":"Name"},"personality":{"properties":{"openness":{"type":"number","maximum":1,"minimum":0,"title":"Openness","description":"Openness to experience (0-1)"},"conscientiousness":{"type":"number","maximum":1,"minimum":0,"title":"Conscientiousness","description":"Conscientiousness (0-1)"},"extraversion":{"type":"number","maximum":1,"minimum":0,"title":"Extraversion","description":"Extraversion (0-1)"},"agreeableness":{"type":"number","maximum":1,"minimum":0,"title":"Agreeableness","description":"Agreeableness (0-1)"},"neuroticism":{"type":"number","maximum":1,"minimum":0,"title":"Neuroticism","description":"Neuroticism (0-1)"},"bias_strength":{"type":"number","maximum":1,"minimum":0,"title":"Bias Strength","description":"How strongly personality influences opinions (0-1)"}},"type":"object","required":["openness","conscientiousness","extraversion","agreeableness","neuroticism","bias_strength"],"title":"PersonalityTraits","description":"Personality traits based on Big Five model.","example":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}},"background":{"type":"string","title":"Background"}},"type":"object","required":["agent_id","name","personality","background"],"title":"AgentProfileResponse","description":"Response model for agent profile.","example":{"agent_id":"user123","background":"I am a software engineer with 10 years of experience in startups","name":"Alice","personality":{"agreeableness":0.7,"bias_strength":0.7,"conscientiousness":0.6,"extraversion":0.5,"neuroticism":0.3,"openness":0.8}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}}}
>
</StatusCodes>

View file

@ -0,0 +1,41 @@
---
sidebar_position: 1
---
# API Reference
Complete reference for Memora's HTTP and MCP APIs.
## HTTP API
The HTTP API reference is automatically generated from our OpenAPI specification. Browse the endpoints in the sidebar to see request/response details, parameters, and examples.
**Base URL:** `http://localhost:8080`
| Category | Endpoints |
|----------|-----------|
| **Memory Operations** | Store, search, list, delete memories |
| **Reasoning** | Think and generate personality-aware responses |
| **Agent Management** | Create, update, list agents and profiles |
| **Documents** | Manage document groupings |
| **Visualization** | Get entity graph data |
## MCP API
The MCP (Model Context Protocol) API exposes Memora tools for AI assistants like Claude Desktop.
| Tool | Description |
|------|-------------|
| `memora_search` | Search memories |
| `memora_think` | Generate personality-aware response |
| `memora_store` | Store new memory |
| `memora_agents` | List available agents |
[MCP Tools Reference →](./mcp)
## OpenAPI / Swagger
Interactive API documentation available when the server is running:
- **Swagger UI:** [http://localhost:8080/docs](http://localhost:8080/docs)
- **OpenAPI JSON:** [http://localhost:8080/openapi.json](http://localhost:8080/openapi.json)

View file

@ -0,0 +1,176 @@
---
sidebar_position: 3
---
# MCP API
Model Context Protocol (MCP) tools exposed by the Memora MCP server.
## Available Tools
### memora_search
Search memories for an agent.
**Parameters:**
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `query` | string | yes | Search query |
| `agent_id` | string | no | Agent ID (uses default if not specified) |
| `top_k` | integer | no | Number of results (default: 10) |
**Example:**
```json
{
"name": "memora_search",
"arguments": {
"query": "What does Alice do for work?",
"top_k": 5
}
}
```
**Response:**
```json
{
"results": [
{
"text": "Alice works at Google as a software engineer",
"weight": 0.95,
"fact_type": "world"
}
]
}
```
---
### memora_think
Generate a personality-aware response using retrieved memories.
**Parameters:**
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `query` | string | yes | Question or prompt |
| `agent_id` | string | no | Agent ID (uses default if not specified) |
| `thinking_budget` | integer | no | Tokens for reasoning (default: 100) |
**Example:**
```json
{
"name": "memora_think",
"arguments": {
"query": "What should I recommend to Alice?"
}
}
```
**Response:**
```json
{
"text": "Based on Alice's interest in machine learning and her work at Google, I would recommend...",
"based_on": [
{"text": "Alice works at Google", "weight": 0.95}
],
"new_opinions": []
}
```
---
### memora_store
Store a new memory.
**Parameters:**
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `content` | string | yes | Memory content to store |
| `agent_id` | string | no | Agent ID (uses default if not specified) |
| `context` | string | no | Context or topic of the memory |
**Example:**
```json
{
"name": "memora_store",
"arguments": {
"content": "User prefers Python for data analysis",
"context": "programming discussion"
}
}
```
**Response:**
```json
{
"success": true,
"message": "Memory stored successfully"
}
```
---
### memora_agents
List all available agents.
**Parameters:** None
**Example:**
```json
{
"name": "memora_agents",
"arguments": {}
}
```
**Response:**
```json
{
"agents": [
{"agent_id": "default"},
{"agent_id": "assistant"},
{"agent_id": "researcher"}
]
}
```
---
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `MEMORA_API_URL` | Memora API URL | `http://localhost:8080` |
| `MEMORA_AGENT_ID` | Default agent ID | Required |
## Error Responses
MCP tools return errors in the standard MCP error format:
```json
{
"error": {
"code": "NOT_FOUND",
"message": "Agent 'unknown-agent' not found"
}
}
```
| Code | Description |
|------|-------------|
| `INVALID_PARAMS` | Missing or invalid parameters |
| `NOT_FOUND` | Agent or resource not found |
| `INTERNAL_ERROR` | Server error |

View file

@ -0,0 +1,7 @@
---
sidebar_position: 1
---
# Changelog
Coming soon.

View file

@ -0,0 +1,7 @@
---
sidebar_position: 1
---
# Cookbook
Coming soon.

View file

@ -0,0 +1,336 @@
---
sidebar_position: 6
---
# Agent Identity
Configure agent personality, background, and behavior.
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
## Creating an Agent
<Tabs>
<TabItem value="python" label="Python">
```python
from memora_client import Memora
client = Memora(base_url="http://localhost:8080")
client.create_agent(
agent_id="my-agent",
name="Research Assistant",
background="I am a research assistant specializing in machine learning",
personality={
"openness": 0.8,
"conscientiousness": 0.7,
"extraversion": 0.5,
"agreeableness": 0.6,
"neuroticism": 0.3,
"bias_strength": 0.5
}
)
```
</TabItem>
<TabItem value="node" label="Node.js">
```typescript
import { OpenAPI, ManagementService } from '@memora/client';
OpenAPI.BASE = 'http://localhost:8080';
await ManagementService.createAgentApiAgentsAgentIdPut('my-agent', {
name: 'Research Assistant',
background: 'I am a research assistant specializing in machine learning',
personality: {
openness: 0.8,
conscientiousness: 0.7,
extraversion: 0.5,
agreeableness: 0.6,
neuroticism: 0.3,
bias_strength: 0.5
}
});
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
# Set background
memora agent background my-agent "I am a research assistant specializing in ML"
# Set personality
memora agent personality my-agent \
--openness 0.8 \
--conscientiousness 0.7 \
--extraversion 0.5 \
--agreeableness 0.6 \
--neuroticism 0.3 \
--bias-strength 0.5
```
</TabItem>
</Tabs>
## Personality Traits (Big Five)
Each trait is scored 0.0 to 1.0:
| Trait | Low (0.0) | High (1.0) |
|-------|-----------|------------|
| **Openness** | Conventional, prefers proven methods | Curious, embraces new ideas |
| **Conscientiousness** | Flexible, spontaneous | Organized, systematic |
| **Extraversion** | Reserved, independent | Outgoing, collaborative |
| **Agreeableness** | Direct, analytical | Cooperative, diplomatic |
| **Neuroticism** | Calm, optimistic | Risk-aware, cautious |
### How Traits Affect Behavior
**Openness** influences how the agent weighs new vs. established ideas:
```python
# High openness agent
"Let's try this new framework—it looks promising!"
# Low openness agent
"Let's stick with the proven solution we know works."
```
**Conscientiousness** affects structure and thoroughness:
```python
# High conscientiousness agent
"Here's a detailed, step-by-step analysis..."
# Low conscientiousness agent
"Quick take: this should work, let's try it."
```
**Extraversion** shapes collaboration preferences:
```python
# High extraversion agent
"We should get the team together to discuss this."
# Low extraversion agent
"I'll analyze this independently and share my findings."
```
**Agreeableness** affects how disagreements are handled:
```python
# High agreeableness agent
"That's a valid point. Perhaps we can find a middle ground..."
# Low agreeableness agent
"Actually, the data doesn't support that conclusion."
```
**Neuroticism** influences risk assessment:
```python
# High neuroticism agent
"We should consider what could go wrong here..."
# Low neuroticism agent
"The risks seem manageable, let's proceed."
```
## Background
The background is a first-person narrative providing agent context:
<Tabs>
<TabItem value="python" label="Python">
```python
client.create_agent(
agent_id="financial-advisor",
background="""I am a conservative financial advisor with 20 years of experience.
I prioritize capital preservation over aggressive growth.
I have seen multiple market crashes and believe in diversification."""
)
```
</TabItem>
</Tabs>
Background influences:
- How questions are interpreted
- Perspective in responses
- Opinion formation context
### Merging Background
New background information is merged intelligently:
<Tabs>
<TabItem value="python" label="Python">
```python
# Original background
client.create_agent(
agent_id="assistant",
background="I am a helpful AI assistant"
)
# Add more context (merged, not replaced)
client.update_background(
agent_id="assistant",
background="I specialize in Python programming"
)
# Result: "I am a helpful AI assistant. I specialize in Python programming."
```
</TabItem>
</Tabs>
Merging rules:
- **Conflicts**: New overwrites old
- **Additions**: Non-conflicting info is added
- **Normalization**: "You are..." → "I am..."
## Getting Agent Profile
<Tabs>
<TabItem value="python" label="Python">
```python
profile = client.get_profile(agent_id="my-agent")
print(f"Background: {profile['background']}")
print(f"Personality: {profile['personality']}")
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
memora agent profile my-agent
```
</TabItem>
</Tabs>
## Updating Personality
<Tabs>
<TabItem value="python" label="Python">
```python
client.update_personality(
agent_id="my-agent",
openness=0.9,
conscientiousness=0.8
)
```
</TabItem>
</Tabs>
## Listing Agents
<Tabs>
<TabItem value="python" label="Python">
```python
agents = client.list_agents()
for agent in agents:
print(agent["agent_id"])
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
memora agent list
```
</TabItem>
</Tabs>
## Default Values
If not specified, agents use neutral defaults:
```python
{
"openness": 0.5,
"conscientiousness": 0.5,
"extraversion": 0.5,
"agreeableness": 0.5,
"neuroticism": 0.5,
"bias_strength": 0.5,
"background": ""
}
```
## Personality Templates
Common personality configurations:
| Use Case | O | C | E | A | N | Bias |
|----------|---|---|---|---|---|------|
| **Customer Support** | 0.5 | 0.7 | 0.6 | 0.9 | 0.3 | 0.4 |
| **Code Reviewer** | 0.4 | 0.9 | 0.3 | 0.4 | 0.5 | 0.6 |
| **Creative Writer** | 0.9 | 0.4 | 0.7 | 0.6 | 0.5 | 0.7 |
| **Risk Analyst** | 0.3 | 0.9 | 0.3 | 0.4 | 0.8 | 0.6 |
| **Research Assistant** | 0.8 | 0.8 | 0.4 | 0.5 | 0.4 | 0.5 |
| **Neutral (default)** | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 |
<Tabs>
<TabItem value="python" label="Python">
```python
# Customer support agent
client.create_agent(
agent_id="support",
background="I am a friendly customer support agent",
personality={
"openness": 0.5,
"conscientiousness": 0.7,
"extraversion": 0.6,
"agreeableness": 0.9, # Very diplomatic
"neuroticism": 0.3, # Calm under pressure
"bias_strength": 0.4
}
)
# Code reviewer agent
client.create_agent(
agent_id="reviewer",
background="I am a thorough code reviewer focused on quality",
personality={
"openness": 0.4, # Prefers proven patterns
"conscientiousness": 0.9, # Very thorough
"extraversion": 0.3,
"agreeableness": 0.4, # Direct feedback
"neuroticism": 0.5,
"bias_strength": 0.6
}
)
```
</TabItem>
</Tabs>
## Agent Isolation
Each agent has:
- **Separate memories** — agents don't share memories
- **Own personality** — traits are per-agent
- **Independent opinions** — formed from their own experiences
```python
# Store to agent A
client.store(agent_id="agent-a", content="Python is great")
# Agent B doesn't see it
results = client.search(agent_id="agent-b", query="Python")
# Returns empty
```

View file

@ -0,0 +1,215 @@
---
sidebar_position: 1
---
# Ingest Data
Store memories, conversations, and documents into Memora.
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
## Installation
<Tabs>
<TabItem value="python" label="Python">
```bash
pip install memora-client
```
</TabItem>
<TabItem value="node" label="Node.js">
```bash
npm install @memora/client
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
cd memora-cli && cargo build --release
```
</TabItem>
</Tabs>
## Store a Single Memory
<Tabs>
<TabItem value="python" label="Python">
```python
from memora_client import Memora
client = Memora(base_url="http://localhost:8080")
client.store(
agent_id="my-agent",
content="Alice works at Google as a software engineer"
)
```
</TabItem>
<TabItem value="node" label="Node.js">
```typescript
import { OpenAPI, MemoryStorageService } from '@memora/client';
OpenAPI.BASE = 'http://localhost:8080';
await MemoryStorageService.putApiPutPost({
agent_id: 'my-agent',
content: 'Alice works at Google as a software engineer'
});
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
memora memory put my-agent "Alice works at Google as a software engineer"
```
</TabItem>
</Tabs>
## Store with Context and Date
Add context and event dates for better retrieval:
<Tabs>
<TabItem value="python" label="Python">
```python
client.store(
agent_id="my-agent",
content="Alice got promoted to senior engineer",
context="career update",
event_date="2024-03-15T10:00:00Z"
)
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
memora memory put my-agent "Alice got promoted" \
--context "career update" \
--event-date "2024-03-15"
```
</TabItem>
</Tabs>
The `event_date` enables temporal queries like "What happened last spring?"
## Batch Ingestion
Store multiple memories in a single request:
<Tabs>
<TabItem value="python" label="Python">
```python
client.store_batch(
agent_id="my-agent",
items=[
{"content": "Alice works at Google", "context": "career"},
{"content": "Bob is a data scientist at Meta", "context": "career"},
{"content": "Alice and Bob are friends", "context": "relationship"}
],
document_id="conversation_001"
)
```
</TabItem>
<TabItem value="node" label="Node.js">
```typescript
await MemoryStorageService.batchApiMemoriesBatchPost({
agent_id: 'my-agent',
items: [
{ content: 'Alice works at Google', context: 'career' },
{ content: 'Bob is a data scientist at Meta', context: 'career' }
],
document_id: 'conversation_001'
});
```
</TabItem>
</Tabs>
The `document_id` groups related memories for later management.
## Store from Files
<Tabs>
<TabItem value="cli" label="CLI">
```bash
# Single file
memora memory put-files my-agent document.txt
# Multiple files
memora memory put-files my-agent doc1.txt doc2.md notes.txt
# With document ID
memora memory put-files my-agent report.pdf --document-id "q4-report"
```
</TabItem>
</Tabs>
## What Happens During Ingestion
When you store content, Memora:
1. **Extracts facts** using an LLM — converts raw text into structured narrative facts
2. **Identifies entities** — people, places, organizations, concepts
3. **Resolves entities** — "Alice" and "Alice Chen" become the same entity
4. **Builds graph links** — connects memories through shared entities
5. **Generates embeddings** — 384-dim vectors for semantic search
6. **Stores to PostgreSQL** — with vector and full-text indexes
```mermaid
graph LR
A[Raw Content] --> B[LLM Extraction]
B --> C[Entity Resolution]
C --> D[Graph Construction]
D --> E[Embedding]
E --> F[(PostgreSQL)]
```
## Async Ingestion
For large batches, use async ingestion:
<Tabs>
<TabItem value="python" label="Python">
```python
# Start async ingestion
operation = client.store_batch_async(
agent_id="my-agent",
items=[...large batch...],
document_id="large-doc"
)
# Check status
status = client.get_operation(operation["operation_id"])
print(status["status"]) # "pending", "processing", "completed", "failed"
```
</TabItem>
</Tabs>
## Best Practices
| Do | Don't |
|----|-------|
| Include context for better retrieval | Store raw unstructured dumps |
| Use document_id to group related content | Mix unrelated content in one batch |
| Add event_date for temporal queries | Omit dates if time matters |
| Store conversations as they happen | Wait to batch everything |

View file

@ -0,0 +1,201 @@
---
sidebar_position: 5
---
# Opinions
How agents form, store, and evolve beliefs.
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
## What Are Opinions?
Opinions are beliefs formed by the agent based on evidence and personality. Unlike world facts (objective information received) or agent facts (actions taken), opinions are **judgments** with confidence scores.
| Type | Example | Confidence |
|------|---------|------------|
| World Fact | "Python was created in 1991" | — |
| Agent Fact | "I recommended Python to Bob" | — |
| Opinion | "Python is the best language for data science" | 0.85 |
## How Opinions Form
Opinions are created during `think` operations when the agent:
1. Retrieves relevant facts
2. Applies personality traits
3. Forms a judgment
4. Assigns a confidence score
```mermaid
graph LR
F[Facts] --> P[Personality Filter]
P --> J[Judgment]
J --> O[Opinion + Confidence]
O --> S[(Store)]
```
<Tabs>
<TabItem value="python" label="Python">
```python
# Ask a question that might form an opinion
answer = client.think(
agent_id="my-agent",
query="What do you think about functional programming?"
)
# Check if new opinions were formed
for opinion in answer["new_opinions"]:
print(f"New opinion: {opinion['text']}")
print(f"Confidence: {opinion['confidence']}")
```
</TabItem>
</Tabs>
## Searching Opinions
<Tabs>
<TabItem value="python" label="Python">
```python
# Search only opinions
opinions = client.search_memories(
agent_id="my-agent",
query="programming languages",
fact_type=["opinion"]
)
for op in opinions:
print(f"{op['text']} (confidence: {op['confidence_score']:.2f})")
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
memora memory search my-agent "programming" --fact-type opinion
```
</TabItem>
</Tabs>
## Opinion Evolution
Opinions change as new evidence arrives:
| Evidence Type | Effect |
|---------------|--------|
| **Reinforcing** | Confidence increases (+0.1) |
| **Weakening** | Confidence decreases (-0.15) |
| **Contradicting** | Opinion revised, confidence reset |
**Example evolution:**
```
t=0: "Python is best for data science" (0.70)
↓ New evidence: Python dominates ML libraries
t=1: "Python is best for data science" (0.85)
↓ New evidence: Julia is 10x faster for numerical computing
t=2: "Python is best for data science, though Julia is faster" (0.75)
↓ New evidence: Most teams still use Python
t=3: "Python is best for data science" (0.82)
```
## Personality Influence
Different personalities form different opinions from the same facts:
<Tabs>
<TabItem value="python" label="Python">
```python
# Create two agents with different personalities
client.create_agent(
agent_id="open-minded",
personality={"openness": 0.9, "conscientiousness": 0.3, "bias_strength": 0.7}
)
client.create_agent(
agent_id="conservative",
personality={"openness": 0.2, "conscientiousness": 0.9, "bias_strength": 0.7}
)
# Store the same facts to both
facts = [
"Rust has better memory safety than C++",
"C++ has a larger ecosystem and more libraries",
"Rust compile times are longer than C++"
]
for fact in facts:
client.store(agent_id="open-minded", content=fact)
client.store(agent_id="conservative", content=fact)
# Ask both the same question
q = "Should we rewrite our C++ codebase in Rust?"
answer1 = client.think(agent_id="open-minded", query=q)
# Likely: "Yes, Rust's safety benefits outweigh migration costs"
answer2 = client.think(agent_id="conservative", query=q)
# Likely: "No, C++'s ecosystem and our team's expertise make it the safer choice"
```
</TabItem>
</Tabs>
## Bias Strength
The `bias_strength` parameter (0-1) controls how much personality influences opinions:
| Value | Behavior |
|-------|----------|
| 0.0 | Pure evidence-based reasoning |
| 0.5 | Balanced personality + evidence |
| 1.0 | Strongly personality-driven |
```python
# Evidence-focused agent
client.create_agent(
agent_id="analyst",
personality={"bias_strength": 0.2} # Low bias
)
# Personality-driven agent
client.create_agent(
agent_id="advisor",
personality={"bias_strength": 0.8} # High bias
)
```
## Opinions in Think Responses
When `think` uses opinions, they appear in `based_on`:
```python
answer = client.think(agent_id="my-agent", query="What language should I learn?")
print("World facts used:")
for f in answer["based_on"]["world"]:
print(f" {f['text']}")
print("\nOpinions used:")
for o in answer["based_on"]["opinion"]:
print(f" {o['text']} (confidence: {o['confidence_score']})")
```
## Confidence Thresholds
Opinions below a confidence threshold may be:
- Excluded from responses
- Marked as uncertain
- Revised more easily
```python
# Low confidence opinions are held loosely
# "I think Python might be good for this" (0.45)
# High confidence opinions are stated firmly
# "Python is definitely the right choice" (0.92)
```

View file

@ -0,0 +1,236 @@
---
sidebar_position: 2
---
# Search Facts
Retrieve memories using multi-strategy search.
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
## Basic Search
<Tabs>
<TabItem value="python" label="Python">
```python
from memora_client import Memora
client = Memora(base_url="http://localhost:8080")
results = client.search(
agent_id="my-agent",
query="What does Alice do?"
)
for r in results:
print(f"{r['text']} (score: {r['weight']:.2f})")
```
</TabItem>
<TabItem value="node" label="Node.js">
```typescript
import { OpenAPI, SearchService } from '@memora/client';
OpenAPI.BASE = 'http://localhost:8080';
const results = await SearchService.searchApiSearchPost({
agent_id: 'my-agent',
query: 'What does Alice do?'
});
for (const r of results.results) {
console.log(`${r.text} (score: ${r.weight})`);
}
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
memora memory search my-agent "What does Alice do?"
```
</TabItem>
</Tabs>
## Search Parameters
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `query` | string | required | Natural language query |
| `top_k` | int | 10 | Maximum results to return |
| `thinking_budget` | int | 100 | Tokens for graph traversal |
| `fact_type` | list | all | Filter: `world`, `agent`, `opinion` |
| `max_tokens` | int | 4096 | Token budget for results |
<Tabs>
<TabItem value="python" label="Python">
```python
results = client.search_memories(
agent_id="my-agent",
query="What does Alice do?",
top_k=20,
thinking_budget=150,
fact_type=["world", "agent"],
max_tokens=8000
)
```
</TabItem>
</Tabs>
## Temporal Queries
Memora automatically detects time expressions and activates temporal search:
<Tabs>
<TabItem value="python" label="Python">
```python
# These queries activate temporal-graph retrieval
results = client.search(agent_id="my-agent", query="What did Alice do last spring?")
results = client.search(agent_id="my-agent", query="What happened in June?")
results = client.search(agent_id="my-agent", query="Events from last year")
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
memora memory search my-agent "What did Alice do last spring?"
memora memory search my-agent "What happened between March and May?"
```
</TabItem>
</Tabs>
Supported temporal expressions:
| Expression | Parsed As |
|------------|-----------|
| "last spring" | March 1 - May 31 (previous year) |
| "in June" | June 1-30 (current/nearest year) |
| "last year" | Jan 1 - Dec 31 (previous year) |
| "last week" | 7 days ago - today |
| "between March and May" | March 1 - May 31 |
## Filter by Fact Type
Search specific memory networks:
<Tabs>
<TabItem value="python" label="Python">
```python
# Only world facts (objective information)
world_facts = client.search_memories(
agent_id="my-agent",
query="Where does Alice work?",
fact_type=["world"]
)
# Only agent facts (agent's own experiences)
agent_facts = client.search_memories(
agent_id="my-agent",
query="What have I recommended?",
fact_type=["agent"]
)
# Only opinions (formed beliefs)
opinions = client.search_memories(
agent_id="my-agent",
query="What do I think about Python?",
fact_type=["opinion"]
)
# World and agent facts (exclude opinions)
facts = client.search_memories(
agent_id="my-agent",
query="What happened?",
fact_type=["world", "agent"]
)
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
memora memory search my-agent "Python" --fact-type opinion
memora memory search my-agent "Alice" --fact-type world,agent
```
</TabItem>
</Tabs>
## How Search Works
Search runs four strategies in parallel:
```mermaid
graph LR
Q[Query] --> S[Semantic<br/>Vector similarity]
Q --> K[Keyword<br/>BM25 exact match]
Q --> G[Graph<br/>Entity traversal]
Q --> T[Temporal<br/>Time-filtered]
S --> RRF[RRF Fusion]
K --> RRF
G --> RRF
T --> RRF
RRF --> CE[Cross-Encoder<br/>Rerank]
CE --> R[Results]
```
| Strategy | When it helps |
|----------|---------------|
| **Semantic** | Conceptual matches, paraphrasing |
| **Keyword** | Names, technical terms, exact phrases |
| **Graph** | Related entities, indirect connections |
| **Temporal** | "last spring", "in June", time ranges |
## Response Format
```python
{
"results": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"text": "Alice works at Google as a software engineer",
"context": "career discussion",
"event_date": "2024-01-15T10:00:00Z",
"weight": 0.95,
"fact_type": "world"
}
]
}
```
| Field | Description |
|-------|-------------|
| `id` | Unique memory ID |
| `text` | Memory content |
| `context` | Original context (if provided) |
| `event_date` | When the event occurred |
| `weight` | Relevance score (0-1) |
| `fact_type` | `world`, `agent`, or `opinion` |
## Thinking Budget
The `thinking_budget` controls graph traversal depth:
- **Low (50)**: Fast, shallow search — good for simple lookups
- **Medium (100)**: Balanced — default for most queries
- **High (200+)**: Deep exploration — finds indirect connections
```python
# Quick lookup
results = client.search(agent_id="my-agent", query="Alice's email", thinking_budget=50)
# Deep exploration
results = client.search(agent_id="my-agent", query="How are Alice and Bob connected?", thinking_budget=200)
```

View file

@ -0,0 +1,153 @@
---
sidebar_position: 4
---
# Think vs Search
When to use `search` vs `think`.
## Quick Comparison
| | Search | Think |
|---|--------|-------|
| **Returns** | Raw memory results | Generated response |
| **Use case** | Retrieval, lookup | Q&A, reasoning |
| **LLM calls** | 0 (retrieval only) | 1+ (generation) |
| **Speed** | Fast (~100-200ms) | Slower (~500-2000ms) |
| **Opinions** | Returns existing | Can form new ones |
| **Personality** | Not applied | Applied to response |
## When to Use Search
**Use Search when you need:**
- Raw facts for your own processing
- Fast retrieval without generation
- To populate context for another LLM
- To check what's in memory
- Debugging retrieval quality
```python
# Get raw facts to inject into your own prompt
results = client.search(agent_id="my-agent", query="Alice's preferences")
context = "\n".join([r["text"] for r in results])
# Use context in your own LLM call
```
**Examples:**
```python
# Lookup — just get the facts
results = client.search(agent_id="my-agent", query="Alice's email address")
# Context building — feed into another system
results = client.search(agent_id="my-agent", query="Recent project discussions")
context = format_for_prompt(results)
# Verification — check what's stored
results = client.search(agent_id="my-agent", query="What do I know about Bob?")
```
## When to Use Think
**Use Think when you need:**
- A natural language response
- Personality-aware answers
- Opinion formation
- Reasoning over multiple facts
- Source attribution
```python
# Get a complete answer with personality
answer = client.think(agent_id="my-agent", query="What should I recommend to Alice?")
print(answer["text"]) # Natural language response
print(answer["based_on"]) # Sources used
```
**Examples:**
```python
# Q&A — need a response, not just facts
answer = client.think(agent_id="my-agent", query="What does Alice do for work?")
# Reasoning — synthesize multiple facts
answer = client.think(agent_id="my-agent", query="How are Alice and Bob connected?")
# Opinion — agent forms a view
answer = client.think(agent_id="my-agent", query="What do you think about Python?")
# Recommendation — personality-influenced
answer = client.think(agent_id="my-agent", query="What book should I read next?")
```
## Performance Comparison
```mermaid
graph LR
subgraph Search
S1[Query] --> S2[4-way Retrieval]
S2 --> S3[RRF + Rerank]
S3 --> S4[Results]
end
subgraph Think
T1[Query] --> T2[4-way Retrieval]
T2 --> T3[RRF + Rerank]
T3 --> T4[Load Personality]
T4 --> T5[LLM Generation]
T5 --> T6[Store Opinions]
T6 --> T7[Response]
end
```
| Operation | Search | Think |
|-----------|--------|-------|
| Retrieval | ~100ms | ~100ms |
| Reranking | ~35ms | ~35ms |
| LLM Generation | — | ~500-1500ms |
| Opinion Storage | — | ~50ms |
| **Total** | **~135ms** | **~700-1700ms** |
## Hybrid Pattern
Use Search for context, Think for final response:
```python
# First: fast search to check relevance
results = client.search(agent_id="my-agent", query="Alice project status")
if len(results) > 0:
# Only call Think if we have relevant memories
answer = client.think(agent_id="my-agent", query="Summarize Alice's project status")
else:
answer = {"text": "I don't have information about Alice's projects."}
```
## Decision Flowchart
```mermaid
graph TD
A[Need memory access] --> B{Need natural language response?}
B -->|No| C[Use Search]
B -->|Yes| D{Need personality/opinions?}
D -->|No| E{Building context for another LLM?}
E -->|Yes| C
E -->|No| F[Use Think]
D -->|Yes| F
```
## Cost Considerations
| Factor | Search | Think |
|--------|--------|-------|
| API calls | 1 | 1 |
| LLM tokens | 0 | 500-2000 |
| Latency | Low | Medium |
| Cost | Low | Higher (LLM usage) |
If you're making many requests or building a high-throughput system, consider:
- Use Search for bulk operations
- Use Think for user-facing responses
- Cache Think responses when appropriate

View file

@ -0,0 +1,207 @@
---
sidebar_position: 3
---
# Think
Generate personality-aware responses using retrieved memories.
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
## Basic Usage
<Tabs>
<TabItem value="python" label="Python">
```python
from memora_client import Memora
client = Memora(base_url="http://localhost:8080")
answer = client.think(
agent_id="my-agent",
query="What should I know about Alice?"
)
print(answer["text"])
```
</TabItem>
<TabItem value="node" label="Node.js">
```typescript
import { OpenAPI, ReasoningService } from '@memora/client';
OpenAPI.BASE = 'http://localhost:8080';
const response = await ReasoningService.thinkApiThinkPost({
agent_id: 'my-agent',
query: 'What should I know about Alice?'
});
console.log(response.text);
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
memora memory think my-agent "What should I know about Alice?"
# Verbose output shows reasoning and sources
memora memory think my-agent "What should I know about Alice?" -v
```
</TabItem>
</Tabs>
## Response Format
```python
{
"text": "Alice is a software engineer at Google who joined last year...",
"based_on": {
"world": [
{"text": "Alice works at Google", "weight": 0.95, "id": "..."}
],
"agent": [],
"opinion": [
{"text": "Alice is very competent", "weight": 0.82, "id": "..."}
]
},
"new_opinions": [
{"text": "Alice would be good for the ML project", "confidence": 0.75}
]
}
```
| Field | Description |
|-------|-------------|
| `text` | Generated response |
| `based_on` | Memories used, grouped by type |
| `new_opinions` | New opinions formed during reasoning |
## Parameters
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `query` | string | required | Question or prompt |
| `thinking_budget` | int | 100 | Tokens for retrieval + reasoning |
| `top_k` | int | 10 | Max memories to retrieve |
<Tabs>
<TabItem value="python" label="Python">
```python
answer = client.think(
agent_id="my-agent",
query="What do you think about remote work?",
thinking_budget=150,
top_k=20
)
```
</TabItem>
</Tabs>
## What Think Does
```mermaid
sequenceDiagram
participant C as Client
participant A as Memora API
participant M as Memory Store
participant L as LLM
C->>A: think("What about Alice?")
A->>M: Search all networks
M-->>A: World + Agent + Opinion facts
A->>A: Load agent personality
A->>L: Generate with personality context
L-->>A: Response + new opinions
A->>M: Store new opinions
A-->>C: Response + sources + new opinions
```
1. **Retrieves** relevant memories from all three networks
2. **Loads** agent personality (Big Five traits + background)
3. **Generates** response influenced by personality
4. **Forms opinions** if the query warrants it
5. **Returns** response with sources and any new opinions
## Opinion Formation
Think can form new opinions based on evidence:
<Tabs>
<TabItem value="python" label="Python">
```python
answer = client.think(
agent_id="my-agent",
query="What do you think about Python vs JavaScript for data science?"
)
# Response might include:
# text: "Based on what I know about data science workflows..."
# new_opinions: [
# {"text": "Python is better for data science", "confidence": 0.85}
# ]
```
</TabItem>
</Tabs>
New opinions are automatically stored and influence future responses.
## Personality Influence
The agent's personality affects Think responses:
| Trait | Effect on Think |
|-------|-----------------|
| High **Openness** | More willing to consider new ideas |
| High **Conscientiousness** | More structured, methodical responses |
| High **Extraversion** | More collaborative suggestions |
| High **Agreeableness** | More diplomatic, harmony-seeking |
| High **Neuroticism** | More risk-aware, cautious |
```python
# Create an agent with specific personality
client.create_agent(
agent_id="cautious-advisor",
background="I am a risk-aware financial advisor",
personality={
"openness": 0.3,
"conscientiousness": 0.9,
"neuroticism": 0.8,
"bias_strength": 0.7
}
)
# Think responses will reflect this personality
answer = client.think(
agent_id="cautious-advisor",
query="Should I invest in crypto?"
)
# Response will likely emphasize risks and caution
```
## Using Sources
The `based_on` field shows which memories informed the response:
```python
answer = client.think(agent_id="my-agent", query="Tell me about Alice")
print("Response:", answer["text"])
print("\nBased on:")
for fact in answer["based_on"]["world"]:
print(f" - {fact['text']} (relevance: {fact['weight']:.2f})")
```
This enables:
- **Transparency** — users see why the agent said something
- **Verification** — check if the response is grounded in facts
- **Debugging** — understand retrieval quality

View file

@ -0,0 +1,112 @@
---
sidebar_position: 2
---
# Architecture
Memora's architecture consists of three main pipelines: ingestion, retrieval, and reasoning.
## Memory Ingestion
When content is stored, Memora processes it through an LLM-powered extraction pipeline.
### Narrative Fact Extraction
Unlike traditional systems that create atomic fragments, Memora extracts **comprehensive narrative facts** that preserve context:
**Fragmented (traditional)**:
- "Bob suggested Summer Vibes"
- "Alice wanted something unique"
- "They chose Beach Beats"
**Narrative (Memora)**:
- "Alice and Bob discussed naming their summer party playlist. Bob suggested 'Summer Vibes' because it's catchy, but Alice wanted something unique. They ultimately decided on 'Beach Beats' for its playful tone."
This approach:
- Preserves conversational flow and reasoning
- Resolves pronouns ("she" → "Alice")
- Normalizes temporal expressions ("last year" → "2024")
- Reduces fact count while maintaining context
### Entity Extraction
The LLM identifies entities in each fact:
| Type | Examples |
|------|----------|
| PERSON | "Alice", "Bob Chen" |
| ORGANIZATION | "Google", "Stanford" |
| LOCATION | "Yosemite", "California" |
| PRODUCT | "Python", "TensorFlow" |
| CONCEPT | "machine learning", "remote work" |
### Entity Resolution
Multiple mentions are resolved to canonical entities:
- "Alice" + "Alice Chen" + "Alice C." → single entity
- "Bob" + "Robert Chen" → single entity (nicknames)
- Context-aware: "Apple (company)" vs "apple (fruit)"
### Graph Construction
Three types of links connect memories:
**Entity Links** (`weight=1.0`)
- Connect all memories mentioning the same entity
- Enable "tell me everything about X" queries
**Temporal Links** (`weight=0.3-1.0`)
- Connect memories close in time
- Weight decays with time distance
- Enable "what happened around then?" queries
**Semantic Links** (`weight=0.7-1.0`)
- Connect semantically similar memories
- Based on embedding cosine similarity
- Enable "tell me about similar topics" queries
**Causal Links** (`weight=1.0`, boosted 2x in retrieval)
- Connect cause-effect relationships
- Types: `causes`, `caused_by`, `enables`, `prevents`
- Enable "why did this happen?" queries
## Memory Unit Structure
Each stored memory contains:
```python
{
"id": "uuid",
"agent_id": "my-agent",
"text": "Alice works at Google as a software engineer...",
"fact_type": "world", # world, agent, or opinion
"confidence_score": 0.85, # only for opinions
"embedding": [0.12, -0.34, ...], # 384-dim vector
"occurred_start": "2023-11-01", # when fact started
"occurred_end": "2023-11-01", # when fact ended
"mentioned_at": "2024-01-15", # when we learned it
"entities": ["Alice", "Google"]
}
```
## Temporal Model
Memora distinguishes **when facts occurred** from **when they were mentioned**:
- `occurred_start/end`: When the fact/event actually happened
- `mentioned_at`: When the agent learned about it
This enables:
- Accurate temporal queries: "What did Alice do in 2020?"
- Recency-aware ranking: Recent mentions get priority
- Historical queries without losing old information
## Storage
PostgreSQL with pgvector provides:
- **HNSW Index**: Fast approximate nearest neighbor search
- **GIN Index**: Full-text search with BM25 ranking
- **Entity Graph**: Adjacency list for graph traversal
- **ACID Transactions**: Consistent memory updates

View file

@ -0,0 +1,219 @@
---
sidebar_position: 1
slug: /
---
# Overview
## Why Memora?
AI assistants forget everything between sessions. Every conversation starts from zero—no context about who you are, what you've discussed, or what the agent has learned. This isn't just inconvenient; it fundamentally limits what AI agents can do.
**The problem is harder than it looks:**
- **Simple vector search isn't enough** — "What did Alice do last spring?" requires temporal reasoning, not just semantic similarity
- **Facts get disconnected** — Knowing "Alice works at Google" and "Google is in Mountain View" should let you answer "Where does Alice work?" even if you never stored that directly
- **Agents need opinions** — A coding assistant that remembers "the user prefers functional programming" should weigh that when making recommendations
- **Context matters** — The same information means different things to different agents with different personalities
Memora solves these problems with a memory system designed specifically for AI agents.
## What Memora Does
```mermaid
graph LR
subgraph Clients
A[Python Client]
B[Node.js Client]
C[CLI]
D[AI Assistants]
end
subgraph Memora Server
E[HTTP API]
F[MCP API]
end
A --> E
B --> E
C --> E
D --> F
E --> G[Memory Engine]
F --> G
G --> H[(PostgreSQL + pgvector)]
```
**Store** conversations and documents → **Search** with multi-strategy retrieval → **Think** with personality-aware reasoning
## Architecture
```mermaid
graph TB
subgraph Input
I1[Raw Text]
I2[Conversations]
I3[Documents]
end
subgraph Ingestion
E1[LLM Extraction]
E2[Entity Resolution]
E3[Graph Construction]
end
subgraph Storage
S1[World Facts]
S2[Agent Facts]
S3[Opinions]
S4[Entity Graph]
end
subgraph Retrieval
R1[Semantic Search]
R2[Keyword Search]
R3[Graph Traversal]
R4[Temporal Search]
R5[RRF Fusion]
R6[Cross-Encoder Rerank]
end
subgraph Output
O1[Search Results]
O2[Think Response]
end
I1 --> E1
I2 --> E1
I3 --> E1
E1 --> E2
E2 --> E3
E3 --> S1
E3 --> S2
E3 --> S3
E3 --> S4
S1 --> R1
S1 --> R2
S4 --> R3
S1 --> R4
R1 --> R5
R2 --> R5
R3 --> R5
R4 --> R5
R5 --> R6
R6 --> O1
R6 --> O2
```
## Key Components
### Three Memory Networks
Memora separates memories by type for epistemic clarity:
| Network | What it stores | Example |
|---------|----------------|---------|
| **World** | Objective facts received | "Alice works at Google" |
| **Agent** | Agent's own actions | "I recommended Python to Bob" |
| **Opinion** | Formed beliefs + confidence | "Python is best for ML" (0.85) |
### Multi-Strategy Retrieval (TEMPR)
Four search strategies run in parallel:
```mermaid
graph LR
Q[Query] --> S[Semantic]
Q --> K[Keyword]
Q --> G[Graph]
Q --> T[Temporal]
S --> RRF[RRF Fusion]
K --> RRF
G --> RRF
T --> RRF
RRF --> CE[Cross-Encoder]
CE --> R[Results]
```
| Strategy | Best for |
|----------|----------|
| **Semantic** | Conceptual similarity, paraphrasing |
| **Keyword (BM25)** | Names, technical terms, exact matches |
| **Graph** | Related entities, indirect connections |
| **Temporal** | "last spring", "in June", time ranges |
### Personality Framework (CARA)
Agents have Big Five personality traits that influence opinion formation:
| Trait | Low | High |
|-------|-----|------|
| **Openness** | Prefers proven methods | Embraces new ideas |
| **Conscientiousness** | Flexible, spontaneous | Systematic, organized |
| **Extraversion** | Independent | Collaborative |
| **Agreeableness** | Direct, analytical | Diplomatic, harmonious |
| **Neuroticism** | Calm, optimistic | Risk-aware, cautious |
The `bias_strength` parameter (0-1) controls how much personality influences opinions.
## Client-Server Interaction
```mermaid
sequenceDiagram
participant C as Client
participant A as Memora API
participant DB as PostgreSQL
C->>A: store("Alice works at Google")
A->>A: Extract facts & entities
A->>A: Build graph links
A->>DB: Store memory units
A-->>C: Success
C->>A: search("What does Alice do?")
A->>DB: 4-way parallel search
A->>A: RRF fusion + rerank
A-->>C: Ranked results
C->>A: think("Tell me about Alice")
A->>DB: Retrieve relevant memories
A->>A: Generate with personality
A-->>C: Response + sources
```
## Quick Start
```bash
pip install memora-client
```
```python
from memora_client import Memora
client = Memora(base_url="http://localhost:8080")
# Store
client.store(agent_id="my-agent", content="Alice works at Google")
# Search
results = client.search(agent_id="my-agent", query="What does Alice do?")
# Think (personality-aware response)
answer = client.think(agent_id="my-agent", query="Tell me about Alice")
print(answer["text"])
```
## Next Steps
- [Architecture](./developer/architecture) — Deep dive into ingestion, storage, and graph construction
- [Retrieval](./developer/retrieval) — How TEMPR's 4-way search works
- [Personality](./developer/personality) — CARA framework and opinion formation
- [Ingest Data](./developer/api/ingest) — Store memories, conversations, and documents
- [Search Facts](./developer/api/search) — Multi-strategy retrieval
- [Think](./developer/api/think) — Personality-aware response generation
- [Server Administration](./developer/server) — Deployment and configuration

View file

@ -0,0 +1,181 @@
---
sidebar_position: 4
---
# Personality
Memora's personality framework (CARA) uses the Big Five model to influence how agents form and express opinions.
## Big Five Traits
Each trait is scored 0.0 to 1.0:
| Trait | Low (0.0) | High (1.0) |
|-------|-----------|------------|
| **Openness** | Conventional, practical | Curious, creative |
| **Conscientiousness** | Flexible, spontaneous | Organized, disciplined |
| **Extraversion** | Reserved, reflective | Outgoing, energetic |
| **Agreeableness** | Analytical, direct | Cooperative, diplomatic |
| **Neuroticism** | Calm, stable | Risk-aware, cautious |
## Bias Strength
The `bias_strength` parameter (0.0-1.0) controls personality influence:
- **0.0**: Purely evidence-based reasoning
- **0.5**: Balanced personality/evidence mix
- **1.0**: Strongly personality-driven opinions
## Opinion Formation
When agents encounter information:
1. Evidence is retrieved from memory
2. Personality traits weight different aspects
3. Confidence score reflects evidence + personality alignment
**Example**: Two agents given the same facts about remote work:
**Agent A** (openness=0.9, conscientiousness=0.2):
> "Remote work unlocks creative flexibility and spontaneous innovation."
**Agent B** (openness=0.2, conscientiousness=0.9):
> "Remote work lacks the structure and accountability needed for consistent performance."
Same facts, different conclusions based on personality.
## Opinion Reinforcement
Opinions evolve as new evidence arrives:
| Evidence Type | Effect |
|---------------|--------|
| **Reinforcing** | Confidence increases (+0.1) |
| **Weakening** | Confidence decreases (-0.15) |
| **Contradicting** | Opinion revised, confidence reset |
**Example Evolution**:
```
t=0: "Python is best for data science" (0.70)
t=1: New evidence: Python dominates ML → (0.85)
t=2: New evidence: Julia is 10x faster → (0.75, text revised)
t=3: New evidence: Rust taking over production → (0.55, text revised)
```
## Agent Profile
### Setting Personality
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
<Tabs>
<TabItem value="python" label="Python">
```python
from memora_client import Memora
client = Memora(base_url="http://localhost:8080")
client.create_agent(
agent_id="my-agent",
name="Creative Assistant",
background="I am a creative AI interested in new ideas",
personality={
"openness": 0.8,
"conscientiousness": 0.6,
"extraversion": 0.5,
"agreeableness": 0.7,
"neuroticism": 0.3,
"bias_strength": 0.7
}
)
```
</TabItem>
<TabItem value="node" label="Node.js">
```typescript
import { OpenAPI, ManagementService } from '@memora/client';
OpenAPI.BASE = 'http://localhost:8080';
await ManagementService.createAgentApiAgentsAgentIdPut('my-agent', {
name: 'Creative Assistant',
background: 'I am a creative AI interested in new ideas',
personality: {
openness: 0.8,
conscientiousness: 0.6,
extraversion: 0.5,
agreeableness: 0.7,
neuroticism: 0.3,
bias_strength: 0.7
}
});
```
</TabItem>
<TabItem value="cli" label="CLI">
```bash
memora agent background my-agent "I am a creative AI interested in new ideas"
memora agent personality my-agent \
--openness 0.8 \
--conscientiousness 0.6 \
--extraversion 0.5 \
--agreeableness 0.7 \
--neuroticism 0.3 \
--bias-strength 0.7
```
</TabItem>
</Tabs>
### Background
First-person narrative providing agent context:
```python
client.create_agent(
agent_id="my-agent",
background="I am a senior software architect with 15 years of distributed systems experience. I prefer simplicity over cutting-edge technology."
)
```
Background influences:
- How questions are interpreted
- Perspective in responses
- Opinion formation context
### Background Merging
New background info is merged intelligently:
- **Conflicts**: New overwrites old
- **Additions**: Non-conflicting info is added
- **Normalization**: Converts to first-person ("You are..." → "I am...")
## Default Personality
If unspecified, agents default to neutral (0.5):
```json
{
"openness": 0.5,
"conscientiousness": 0.5,
"extraversion": 0.5,
"agreeableness": 0.5,
"neuroticism": 0.5,
"bias_strength": 0.5
}
```
## Use Case Examples
| Use Case | Recommended Traits |
|----------|-------------------|
| Customer Support | High agreeableness, low neuroticism |
| Code Review | High conscientiousness, low agreeableness |
| Creative Writing | High openness, high extraversion |
| Risk Analysis | High neuroticism, high conscientiousness |

View file

@ -0,0 +1,146 @@
---
sidebar_position: 3
---
# Retrieval
Memora's retrieval architecture (TEMPR) runs four search strategies in parallel and fuses results for optimal recall and precision.
## Pipeline Overview
```
Query → Embedding + Temporal Parse
├─→ Semantic Search (pgvector)
├─→ Keyword Search (BM25)
├─→ Graph Traversal (spreading activation)
└─→ Temporal-Graph (time-filtered)
RRF Fusion
Cross-Encoder Rerank
Token Budget Filter → Results
```
## Four Strategies
### 1. Semantic Search
Vector similarity using pgvector HNSW index.
```sql
SELECT * FROM memories
WHERE (1 - (embedding <=> query_embedding)) >= 0.3
ORDER BY embedding <=> query_embedding
LIMIT 100
```
**Strengths**: Conceptual matches, paraphrasing, synonyms
**Example**: "Alice's job" → "Alice works as a software engineer"
### 2. Keyword Search (BM25)
PostgreSQL full-text search with BM25 ranking.
```sql
SELECT *, ts_rank_cd(search_vector, to_tsquery('english', query)) AS score
FROM memories
WHERE search_vector @@ to_tsquery('english', query)
ORDER BY score DESC
```
**Strengths**: Exact names, technical terms, proper nouns
**Example**: "Google" → all mentions of "Google"
### 3. Graph Traversal
Spreading activation from semantic entry points through the entity graph.
```python
1. Find top-5 semantic matches (similarity ≥ 0.5)
2. Initialize activation = similarity_score
3. For each node (up to thinking_budget):
- Propagate: neighbor.activation = current × edge.weight × 0.8
- Causal links get 2x boost
4. Return nodes with activation scores
```
**Strengths**: Indirect relationships, entity connections, causal reasoning
**Example**: "What does Alice do?" → Alice → Google → Google's products
### 4. Temporal-Graph Search
Activated when temporal expressions are detected. Uses T5-small for parsing.
| Expression | Parsed Range |
|------------|--------------|
| "last spring" | March 1 - May 31 (prev year) |
| "in June" | June 1-30 |
| "last year" | Jan 1 - Dec 31 (prev year) |
| "between March and May" | March 1 - May 31 |
**Strengths**: Historical queries, time-bounded search
**Example**: "What did Alice do last spring?" → Events in March-May range
## Result Fusion (RRF)
Reciprocal Rank Fusion combines ranked lists without score normalization:
```
RRF_score(d) = Σ 1/(60 + rank_i(d))
```
Items appearing in multiple lists rank higher than single-list items.
## Cross-Encoder Reranking
Neural reranking with temporal awareness:
```python
input = f"[Date: {date_readable}] {memory_text}"
score = cross_encoder.predict([(query, input)])
```
Model: `cross-encoder/ms-marco-MiniLM-L-6-v2`
## Token Budget Filtering
Final stage ensures results fit LLM context windows:
```python
for result in reranked_results:
tokens = len(tokenizer.encode(result.text))
if total_tokens + tokens <= max_tokens:
filtered.append(result)
total_tokens += tokens
```
## Search Parameters
| Parameter | Default | Description |
|-----------|---------|-------------|
| `thinking_budget` | 100 | Max nodes to explore in graph |
| `max_tokens` | 4096 | Token limit for results |
| `fact_type` | all | Filter: world, agent, opinion |
## Performance
Typical latency breakdown (p50):
| Stage | Time |
|-------|------|
| Query embedding | ~12ms |
| Semantic search | ~35ms |
| BM25 search | ~8ms |
| Graph traversal | ~42ms |
| RRF fusion | ~2ms |
| Cross-encoder | ~35ms |
| **Total** | **~135ms** |

View file

@ -0,0 +1,317 @@
---
sidebar_position: 6
---
# Server Administration
Guide to deploying and configuring the Memora server.
## Architecture Overview
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ CLIENTS │
├─────────────────┬─────────────────┬─────────────────┬───────────────────────┤
│ Python Client │ Node.js Client │ CLI │ AI Assistants │
│ memora-client │ @memora/client │ memora-cli │ (Claude, etc.) │
└────────┬────────┴────────┬────────┴────────┬────────┴───────────┬───────────┘
│ │ │ │
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ MEMORA API SERVER │
│ (localhost:8080) │
├─────────────────────────────────┬───────────────────────────────────────────┤
│ HTTP API │ MCP API │
│ /api/memories/* │ MCP Server (stdio) │
│ /api/agents/* │ memora_search, memora_think, │
│ /api/search, /api/think │ memora_store, memora_agents │
└─────────────────────────────────┴───────────────────────────────────────────┘
│ │
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ PROCESSING PIPELINE │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ INGESTION │ │ RETRIEVAL │ │ REASONING │ │
│ │ │ │ (TEMPR) │ │ (CARA) │ │
│ │ LLM Extract │ │ │ │ │ │
│ │ Entity Res. │ │ 4-way Search│ │ Personality │ │
│ │ Graph Build │ │ RRF Fusion │ │ Opinion Gen │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ ML MODELS │
├───────────────────┬───────────────────┬─────────────────────────────────────┤
│ Embeddings │ Cross-Encoder │ LLM Provider │
│ all-MiniLM-L6-v2 │ ms-marco-MiniLM │ OpenAI / Groq / Ollama │
│ (384-dim) │ (reranking) │ (extraction, reasoning) │
└───────────────────┴───────────────────┴─────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ POSTGRESQL + PGVECTOR │
│ (localhost:5432) │
├─────────────────────────────────────────────────────────────────────────────┤
│ • Memory Units (facts, opinions) • HNSW Vector Index │
│ • Entity Graph (nodes, edges) • GIN Full-Text Index │
│ • Agent Profiles • Temporal Indexes │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ CONTROL PLANE (Optional) │
│ (localhost:3000) │
├─────────────────────────────────────────────────────────────────────────────┤
│ • Web UI for administration • Agent management │
│ • Memory visualization • Graph explorer │
│ • Connects to API Server • Monitoring dashboard │
└─────────────────────────────────────────────────────────────────────────────┘
```
## Quick Start
### Docker (Recommended)
```bash
# Clone the repository
git clone https://github.com/memora/memora.git
cd memora
# Create environment file
cp .env.example .env
# Edit .env with your LLM API key
# Start all services
cd docker
./start.sh
```
Services will be available at:
- **API Server**: http://localhost:8080
- **Control Plane**: http://localhost:3000
- **Swagger UI**: http://localhost:8080/docs
### Local Development
```bash
# Install dependencies
uv sync
# Start PostgreSQL only (via Docker)
cd docker && docker-compose up -d postgres
# Start the API server
./scripts/start-server.sh --env local
```
## Environment Variables
### API Server (`MEMORA_API_*`)
| Variable | Description | Default |
|----------|-------------|---------|
| `MEMORA_API_DATABASE_URL` | PostgreSQL connection string | Required |
| `MEMORA_API_LLM_PROVIDER` | LLM provider: `openai`, `groq`, `ollama` | `groq` |
| `MEMORA_API_LLM_API_KEY` | API key for LLM provider | Required (except ollama) |
| `MEMORA_API_LLM_MODEL` | Model name | `openai/gpt-oss-20b` |
| `MEMORA_API_LLM_BASE_URL` | Custom LLM endpoint | Provider default |
| `MEMORA_API_HOST` | Server bind address | `0.0.0.0` |
| `MEMORA_API_PORT` | Server port | `8080` |
| `MEMORA_API_MCP_ENABLED` | Enable MCP server | `true` |
### Control Plane (`MEMORA_CP_*`)
| Variable | Description | Default |
|----------|-------------|---------|
| `MEMORA_CP_DATAPLANE_API_URL` | API server URL | `http://localhost:8080` |
| `MEMORA_CP_HOSTNAME` | Server bind address | `0.0.0.0` |
| `MEMORA_CP_PORT` | Server port | `3000` |
### Example Configuration
```bash
# .env file
# Database
MEMORA_API_DATABASE_URL=postgresql://memora:memora_dev@localhost:5432/memora
# LLM - Using Groq (fast inference)
MEMORA_API_LLM_PROVIDER=groq
MEMORA_API_LLM_API_KEY=gsk_xxxxxxxxxxxx
MEMORA_API_LLM_MODEL=llama-3.1-70b-versatile
# LLM - Using OpenAI
# MEMORA_API_LLM_PROVIDER=openai
# MEMORA_API_LLM_API_KEY=sk-xxxxxxxxxxxx
# MEMORA_API_LLM_MODEL=gpt-4o
# LLM - Using Ollama (local, no API key)
# MEMORA_API_LLM_PROVIDER=ollama
# MEMORA_API_LLM_BASE_URL=http://localhost:11434/v1
# MEMORA_API_LLM_MODEL=llama3.1
# Control Plane
MEMORA_CP_DATAPLANE_API_URL=http://localhost:8080
```
## ML Models
Memora uses several ML models for different stages of the pipeline:
### Embedding Model
| Model | Dimensions | Purpose |
|-------|------------|---------|
| `all-MiniLM-L6-v2` | 384 | Semantic vector embeddings |
Downloaded automatically on first run. Used for:
- Memory vectorization
- Query embedding
- Semantic similarity search
### Cross-Encoder (Reranking)
| Model | Purpose |
|-------|---------|
| `cross-encoder/ms-marco-MiniLM-L-6-v2` | Neural reranking |
Reranks search results for precision after initial retrieval. Includes temporal context in input.
### Temporal Parser
| Model | Purpose |
|-------|---------|
| `t5-small` | Temporal expression parsing |
Parses natural language time expressions like "last spring" or "in June 2024".
### LLM (Configurable)
Used for:
- Fact extraction from raw content
- Entity extraction and resolution
- Opinion generation with personality
- Think/reasoning responses
Supported providers:
- **OpenAI**: GPT-4, GPT-4o, GPT-3.5-turbo
- **Groq**: Llama 3.1, Mixtral (fast inference)
- **Ollama**: Any local model
## Database Schema
PostgreSQL with pgvector extension:
```sql
-- Memory units (facts and opinions)
CREATE TABLE memory_units (
id UUID PRIMARY KEY,
agent_id VARCHAR NOT NULL,
text TEXT NOT NULL,
fact_type VARCHAR NOT NULL, -- 'world', 'agent', 'opinion'
confidence_score FLOAT,
embedding VECTOR(384),
occurred_start DATE,
occurred_end DATE,
mentioned_at TIMESTAMP,
context VARCHAR,
document_id VARCHAR
);
-- Entity graph
CREATE TABLE entities (
id UUID PRIMARY KEY,
agent_id VARCHAR NOT NULL,
name VARCHAR NOT NULL,
entity_type VARCHAR NOT NULL,
canonical_name VARCHAR
);
CREATE TABLE entity_links (
memory_id UUID REFERENCES memory_units(id),
entity_id UUID REFERENCES entities(id),
PRIMARY KEY (memory_id, entity_id)
);
-- Agent profiles
CREATE TABLE agent_profiles (
agent_id VARCHAR PRIMARY KEY,
background TEXT,
openness FLOAT DEFAULT 0.5,
conscientiousness FLOAT DEFAULT 0.5,
extraversion FLOAT DEFAULT 0.5,
agreeableness FLOAT DEFAULT 0.5,
neuroticism FLOAT DEFAULT 0.5,
bias_strength FLOAT DEFAULT 0.5
);
```
### Indexes
- **HNSW Index**: Fast approximate nearest neighbor for vector search
- **GIN Index**: Full-text search with BM25 ranking
- **B-tree Indexes**: Agent ID, timestamps, entity lookups
## Docker Services
```yaml
services:
postgres: # pgvector/pgvector:pg16
api: # Memora API server
control-plane: # Admin UI (optional)
```
### Commands
```bash
# Start all services
cd docker && ./start.sh
# Stop services
cd docker && ./stop.sh
# Clean all data
cd docker && ./clean.sh
# View logs
docker-compose logs -f api
docker-compose logs -f control-plane
```
## Health Checks
### API Server
```bash
curl http://localhost:8080/api/v1/agents
```
### Control Plane
```bash
curl http://localhost:3000/
```
## Production Deployment
For production deployments:
1. **Use managed PostgreSQL** with pgvector extension
2. **Set proper secrets** via environment variables or secrets manager
3. **Configure resource limits** for ML model inference
4. **Set up monitoring** for API latency and error rates
5. **Use HTTPS** with proper TLS certificates
6. **Configure rate limiting** at load balancer level
### Resource Requirements
| Component | CPU | Memory | Notes |
|-----------|-----|--------|-------|
| API Server | 2+ cores | 4GB+ | ML models loaded in memory |
| PostgreSQL | 2+ cores | 4GB+ | Depends on data size |
| Control Plane | 1 core | 512MB | Lightweight Next.js app |

View file

@ -0,0 +1,256 @@
---
sidebar_position: 3
---
# CLI Reference
The Memora CLI provides command-line access to memory operations and agent management.
## Installation
### Pre-built Binaries
Download from the releases page:
```bash
# macOS (Apple Silicon)
curl -L https://github.com/memora/memora/releases/latest/download/memora-macos-arm64 -o memora
chmod +x memora
sudo mv memora /usr/local/bin/
```
### Build from Source
```bash
cd memora-cli-rust
cargo build --release
cp target/release/memora /usr/local/bin/
```
## Configuration
Set environment variables or use command flags:
```bash
export MEMORA_API_URL=http://localhost:8080
export MEMORA_AGENT_ID=my-agent
```
## Commands
### Memory Operations
#### put
Store a memory:
```bash
memora put <agent_id> "Alice works at Google as a software engineer"
# With context
memora put <agent_id> "Bob loves hiking" --context "hobby discussion"
# With event date
memora put <agent_id> "Meeting with Carol" --date "2024-01-15"
```
#### put-files
Store file contents as memories:
```bash
# Store a single file
memora put-files <agent_id> notes.txt
# Store multiple files
memora put-files <agent_id> file1.txt file2.md file3.json
# With context
memora put-files <agent_id> meeting-notes.txt --context "team meeting"
```
#### search
Search memories:
```bash
memora search <agent_id> "What does Alice do?"
# With options
memora search <agent_id> "hiking recommendations" --budget 100 --top-k 5
# Verbose output
memora search <agent_id> "query" -v
```
#### think
Generate a response using memories and opinions:
```bash
memora think <agent_id> "What do you know about Alice?"
# Verbose mode shows reasoning
memora think <agent_id> "Should I recommend Python or Java?" -v
```
### Agent Management
#### agents
List all agents:
```bash
memora agents
```
Output:
```
Available agents:
- alice-agent
- bob-agent
- tech-advisor
```
#### profile
View agent profile:
```bash
memora profile <agent_id>
```
Output:
```
Agent: my-agent
Personality:
Openness: 0.80
Conscientiousness: 0.60
Extraversion: 0.50
Agreeableness: 0.70
Neuroticism: 0.30
Bias Strength: 0.70
Background:
I am a helpful AI assistant interested in technology.
```
#### set-personality
Update personality traits:
```bash
memora set-personality <agent_id> \
--openness 0.8 \
--conscientiousness 0.6 \
--extraversion 0.5 \
--agreeableness 0.7 \
--neuroticism 0.3 \
--bias-strength 0.7
```
#### background
Add or merge background:
```bash
# Set/merge background
memora background <agent_id> "I have expertise in distributed systems"
```
### MCP Server
Start the MCP server:
```bash
memora mcp-server
# With custom configuration
MEMORA_API_URL=http://api.example.com memora mcp-server
```
## Output Formats
### Pretty (Default)
Human-readable formatted output:
```bash
memora search <agent_id> "query"
```
### JSON
Machine-readable JSON output:
```bash
memora search <agent_id> "query" -o json
```
### YAML
YAML formatted output:
```bash
memora search <agent_id> "query" -o yaml
```
## Verbose Mode
Add `-v` or `--verbose` for detailed output:
```bash
memora search <agent_id> "query" -v
```
Shows:
- Request payload
- Response details
- Timing information
## Global Options
| Flag | Description |
|------|-------------|
| `-v, --verbose` | Verbose output |
| `-o, --output <format>` | Output format: pretty, json, yaml |
| `--api-url <url>` | Override API URL |
| `--help` | Show help |
| `--version` | Show version |
## Examples
### Full Workflow
```bash
# Create an agent
curl -X PUT http://localhost:8080/api/agents/demo-agent \
-H "Content-Type: application/json" \
-d '{"background": "Demo agent"}'
# Store memories
memora put demo-agent "Alice works at Google"
memora put demo-agent "Bob is a data scientist"
memora put demo-agent "Alice and Bob are colleagues"
# Search
memora search demo-agent "Who works with Alice?"
# Think (with opinions)
memora think demo-agent "What do you know about the team?"
# Update personality
memora set-personality demo-agent \
--openness 0.9 \
--conscientiousness 0.7 \
--extraversion 0.6 \
--agreeableness 0.8 \
--neuroticism 0.2 \
--bias-strength 0.6
# Check profile
memora profile demo-agent
```

View file

@ -0,0 +1,138 @@
---
sidebar_position: 3
---
# LangGraph
Memora provides a `BaseStore` implementation for LangGraph's memory system.
## Installation
```bash
cd memora-langmem && uv pip install -e .
```
## Quick Start
```python
from memora_langmem import MemoraStore
# Create store
store = MemoraStore(
base_url="http://localhost:8080",
default_agent_id="my-agent",
)
# Store data
store.put(
namespace=("user", "preferences"),
key="language",
value={"language": "Python", "reason": "data science"}
)
# Retrieve data
item = store.get(namespace=("user", "preferences"), key="language")
print(item.value) # {"language": "Python", "reason": "data science"}
# Search
results = store.search(
namespace_prefix=("user",),
query="programming language",
limit=10
)
```
## How It Works
`MemoraStore` implements LangGraph's `BaseStore` interface:
- **Namespaces** map to Memora agent IDs (joined with `__`)
- **Keys** map to document IDs
- **Values** are stored as JSON in memory content
## BaseStore Interface
### put
Store an item:
```python
store.put(
namespace=("user", "session-123"),
key="preferences",
value={"theme": "dark", "language": "en"}
)
```
### get
Retrieve an item:
```python
item = store.get(namespace=("user", "session-123"), key="preferences")
if item:
print(item.value) # {"theme": "dark", "language": "en"}
print(item.created_at)
print(item.updated_at)
```
### search
Search within a namespace:
```python
results = store.search(
namespace_prefix=("user",),
query="theme preferences",
limit=10,
offset=0
)
for item in results:
print(f"{item.key}: {item.value}")
```
### delete
Delete an item:
```python
store.delete(namespace=("user", "session-123"), key="preferences")
```
## Async Support
All operations have async variants:
```python
await store.aput(namespace, key, value)
item = await store.aget(namespace, key)
results = await store.asearch(namespace_prefix, query)
await store.adelete(namespace, key)
```
## With LangGraph
```python
from langgraph.graph import StateGraph
from memora_langmem import MemoraStore
store = MemoraStore(base_url="http://localhost:8080")
# Use store in your graph
graph = StateGraph()
# ... configure graph with store
```
## Namespace Mapping
Namespaces are converted to Memora agent IDs:
| Namespace | Agent ID |
|-----------|----------|
| `("user",)` | `user` |
| `("user", "session")` | `user__session` |
| `("app", "v1", "data")` | `app__v1__data` |
| `()` | `default_agent_id` |
Agents are created automatically if they don't exist.

View file

@ -0,0 +1,125 @@
---
sidebar_position: 4
---
# MCP Server
Model Context Protocol server for AI assistants like Claude Desktop.
## Installation
```bash
cd memora-cli && cargo build --release
```
## Claude Desktop Setup
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"memora": {
"command": "/path/to/memora",
"args": ["mcp-server"],
"env": {
"MEMORA_API_URL": "http://localhost:8080",
"MEMORA_AGENT_ID": "claude-agent"
}
}
}
}
```
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `MEMORA_API_URL` | Memora API URL | `http://localhost:8080` |
| `MEMORA_AGENT_ID` | Default agent ID | Required |
## Available Tools
### memora_search
Search memories:
```json
{
"name": "memora_search",
"arguments": {
"query": "What does Alice do for work?",
"top_k": 5
}
}
```
### memora_think
Generate response using memories:
```json
{
"name": "memora_think",
"arguments": {
"query": "What should I recommend to Alice?"
}
}
```
### memora_store
Store new memory:
```json
{
"name": "memora_store",
"arguments": {
"content": "User prefers Python for data analysis",
"context": "programming discussion"
}
}
```
### memora_agents
List available agents:
```json
{
"name": "memora_agents",
"arguments": {}
}
```
## Usage Example
Once configured, Claude can use Memora naturally:
**User**: "Remember that I prefer morning meetings"
**Claude**: *Uses memora_store*
> "I've noted that you prefer morning meetings."
---
**User**: "What do you know about my preferences?"
**Claude**: *Uses memora_search*
> "Based on our conversations, you prefer morning meetings and like Python for data analysis."
## Testing
Run standalone:
```bash
memora mcp-server
```
Debug mode:
```bash
RUST_LOG=debug memora mcp-server
```

View file

@ -0,0 +1,231 @@
---
sidebar_position: 2
---
# Node.js Client
Official TypeScript/JavaScript client for the Memora API.
## Installation
```bash
npm install @memora/client
```
## Quick Start
```typescript
import { OpenAPI, MemoryStorageService, SearchService } from '@memora/client';
// Configure base URL
OpenAPI.BASE = 'http://localhost:8080';
// Store a memory
await MemoryStorageService.putApiPutPost({
agent_id: 'my-agent',
content: 'Alice works at Google as a software engineer',
});
// Search memories
const results = await SearchService.searchApiSearchPost({
agent_id: 'my-agent',
query: 'What does Alice do?',
});
console.log(results);
```
## Configuration
```typescript
import { OpenAPI } from '@memora/client';
OpenAPI.BASE = 'http://localhost:8080';
OpenAPI.TOKEN = 'your-api-token'; // If authentication is enabled
```
## Memory Operations
### Store Memory
```typescript
import { MemoryStorageService } from '@memora/client';
await MemoryStorageService.putApiPutPost({
agent_id: 'my-agent',
content: 'Alice works at Google as a software engineer',
context: 'career discussion',
event_date: '2024-01-15T10:00:00Z',
});
```
### Store Batch
```typescript
await MemoryStorageService.batchApiMemoriesBatchPost({
agent_id: 'my-agent',
items: [
{ content: 'Alice works at Google', context: 'career' },
{ content: 'Bob is a data scientist', context: 'career' },
],
document_id: 'conversation_001',
});
```
## Search Operations
### Basic Search
```typescript
import { SearchService } from '@memora/client';
const results = await SearchService.searchApiSearchPost({
agent_id: 'my-agent',
query: 'What does Alice do?',
});
for (const r of results.results) {
console.log(`${r.text} (weight: ${r.weight})`);
}
```
### Advanced Search
```typescript
const results = await SearchService.searchApiSearchPost({
agent_id: 'my-agent',
query: 'What does Alice do?',
thinking_budget: 100,
top_k: 10,
});
```
### Search World Facts
```typescript
const worldFacts = await SearchService.worldSearchApiWorldSearchPost({
agent_id: 'my-agent',
query: 'Who works at Google?',
});
```
### Search Opinions
```typescript
const opinions = await SearchService.opinionSearchApiOpinionSearchPost({
agent_id: 'my-agent',
query: 'What do I think about Python?',
});
```
## Think (Generate Response)
```typescript
import { ReasoningService } from '@memora/client';
const response = await ReasoningService.thinkApiThinkPost({
agent_id: 'my-agent',
query: 'What should I know about Alice?',
thinking_budget: 100,
});
console.log(response.text); // Generated response
console.log(response.based_on); // Memories used
console.log(response.new_opinions); // New opinions formed
```
## Agent Management
### Create Agent
```typescript
import { ManagementService } from '@memora/client';
await ManagementService.createAgentApiAgentsAgentIdPut('my-agent', {
name: 'Assistant',
background: 'I am a helpful AI assistant',
personality: {
openness: 0.7,
conscientiousness: 0.8,
extraversion: 0.5,
agreeableness: 0.6,
neuroticism: 0.3,
bias_strength: 0.5,
},
});
```
### Get Profile
```typescript
const profile = await ManagementService.getProfileApiAgentsAgentIdProfileGet('my-agent');
console.log(profile.personality);
console.log(profile.background);
```
### List Agents
```typescript
const agents = await ManagementService.listAgentsApiAgentsGet();
for (const agent of agents.agents) {
console.log(agent.agent_id);
}
```
### Update Personality
```typescript
await ManagementService.updatePersonalityApiAgentsAgentIdProfilePut('my-agent', {
openness: 0.9,
conscientiousness: 0.7,
});
```
### Merge Background
```typescript
await ManagementService.mergeBackgroundApiAgentsAgentIdBackgroundPost('my-agent', {
background: 'Additional context to merge',
});
```
## Error Handling
```typescript
import { ApiError } from '@memora/client';
try {
await SearchService.searchApiSearchPost({
agent_id: 'unknown-agent',
query: 'test',
});
} catch (error) {
if (error instanceof ApiError) {
console.log(`Error: ${error.message}`);
console.log(`Status: ${error.status}`);
}
}
```
## TypeScript Types
The client exports all types for full TypeScript support:
```typescript
import type {
AgentProfile,
SearchResult,
ThinkResponse,
MemoryItem,
PersonalityTraits,
} from '@memora/client';
const personality: PersonalityTraits = {
openness: 0.7,
conscientiousness: 0.8,
extraversion: 0.5,
agreeableness: 0.6,
neuroticism: 0.3,
bias_strength: 0.5,
};
```

View file

@ -0,0 +1,112 @@
---
sidebar_position: 2
---
# OpenAI
Drop-in replacement for the OpenAI Python client with automatic memory integration.
## Installation
```bash
cd memora-openai && uv pip install -e .
```
## Quick Start
```python
from memora_openai import configure, OpenAI
# Configure once
configure(
memora_api_url="http://localhost:8080",
agent_id="my-agent",
)
# Use OpenAI client normally
client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "What did we discuss about AI?"}]
)
```
## How It Works
The wrapper intercepts OpenAI calls:
1. **Before**: Retrieves relevant memories and injects as system message
2. **After**: Stores conversation to Memora
Your code works exactly as before, but now has memory.
## Configuration
```python
configure(
memora_api_url="http://localhost:8080", # Memora API
agent_id="my-agent", # Required
store_conversations=True, # Store conversations
inject_memories=True, # Inject memories into prompts
document_id="session-123", # Group by document
enabled=True, # Master switch
)
```
## Memory Injection
When enabled, memories are automatically injected:
```python
# Your code
messages = [{"role": "user", "content": "What trails did Alice recommend?"}]
# What gets sent to OpenAI
messages = [
{
"role": "system",
"content": "Relevant context:\n- Alice loves hiking in Yosemite\n- Alice recommended Half Dome trail"
},
{"role": "user", "content": "What trails did Alice recommend?"}
]
```
## Async Support
```python
from memora_openai import configure, AsyncOpenAI
configure(memora_api_url="http://localhost:8080", agent_id="my-agent")
client = AsyncOpenAI(api_key="sk-...")
response = await client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "Tell me about my preferences"}]
)
```
## Streaming
Fully supported:
```python
stream = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "Tell me a story"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")
```
## Disable Temporarily
```python
from memora_openai import configure
configure(enabled=False) # Disable
configure(enabled=True) # Re-enable
```

View file

@ -0,0 +1,217 @@
---
sidebar_position: 1
---
# Python Client
Official Python client for the Memora API.
## Installation
```bash
pip install memora-client
```
## Quick Start
```python
from memora_client import Memora
client = Memora(base_url="http://localhost:8080")
# Store a memory
client.store(agent_id="my-agent", content="Alice works at Google")
# Search memories
results = client.search(agent_id="my-agent", query="What does Alice do?")
for r in results:
print(r["text"], r["weight"])
# Generate response with personality
answer = client.think(agent_id="my-agent", query="Tell me about Alice")
print(answer["text"])
```
## Client Initialization
```python
from memora_client import Memora
client = Memora(
base_url="http://localhost:8080", # Memora API URL
timeout=30.0, # Request timeout in seconds
)
```
## Memory Operations
### Store Single Memory
```python
client.store(
agent_id="my-agent",
content="Alice works at Google as a software engineer",
context="career discussion", # Optional context
event_date="2024-01-15T10:00:00Z", # Optional event date
)
```
### Store Batch
```python
client.store_batch(
agent_id="my-agent",
items=[
{"content": "Alice works at Google", "context": "career"},
{"content": "Bob is a data scientist", "context": "career"},
],
document_id="conversation_001", # Optional grouping
)
```
## Search Operations
### Basic Search
```python
results = client.search(
agent_id="my-agent",
query="What does Alice do?",
)
for r in results:
print(f"{r['text']} (weight: {r['weight']})")
```
### Advanced Search
```python
results = client.search_memories(
agent_id="my-agent",
query="What does Alice do?",
fact_type=["world", "agent"], # Filter by type
max_tokens=4096, # Token budget for results
top_k=10, # Max results
)
```
### Search by Fact Type
```python
# Search only world facts
world_facts = client.search_memories(
agent_id="my-agent",
query="Who works at Google?",
fact_type=["world"],
)
# Search only opinions
opinions = client.search_memories(
agent_id="my-agent",
query="What do I think about Python?",
fact_type=["opinion"],
)
```
## Think (Generate Response)
Generate personality-aware responses using retrieved memories:
```python
answer = client.think(
agent_id="my-agent",
query="What should I know about Alice?",
thinking_budget=100, # Tokens for query understanding
)
print(answer["text"]) # Generated response
print(answer["based_on"]) # Memories used
print(answer["new_opinions"]) # New opinions formed
```
## Agent Management
### Create Agent
```python
client.create_agent(
agent_id="my-agent",
name="Assistant",
background="I am a helpful AI assistant",
personality={
"openness": 0.7,
"conscientiousness": 0.8,
"extraversion": 0.5,
"agreeableness": 0.6,
"neuroticism": 0.3,
"bias_strength": 0.5,
},
)
```
### Get Profile
```python
profile = client.get_profile(agent_id="my-agent")
print(profile["personality"])
print(profile["background"])
```
### List Agents
```python
agents = client.list_agents()
for agent in agents:
print(agent["agent_id"])
```
### Update Personality
```python
client.update_personality(
agent_id="my-agent",
openness=0.9,
conscientiousness=0.7,
)
```
### Update Background
```python
client.update_background(
agent_id="my-agent",
background="Additional context to merge with existing background",
)
```
## Error Handling
```python
from memora_client import Memora, MemoraError
client = Memora(base_url="http://localhost:8080")
try:
results = client.search(agent_id="unknown", query="test")
except MemoraError as e:
print(f"Error: {e.message}")
print(f"Status: {e.status}")
```
## Async Support
```python
import asyncio
from memora_client import AsyncMemora
async def main():
client = AsyncMemora(base_url="http://localhost:8080")
# All methods have async versions
await client.store(agent_id="my-agent", content="Hello world")
results = await client.search(agent_id="my-agent", query="Hello")
print(results)
asyncio.run(main())
```

View file

@ -0,0 +1,191 @@
import {themes as prismThemes} from 'prism-react-renderer';
import type {Config} from '@docusaurus/types';
import type * as Preset from '@docusaurus/preset-classic';
import type * as OpenApiPlugin from 'docusaurus-plugin-openapi-docs';
const config: Config = {
title: 'Memora',
tagline: 'Entity-Aware Memory System for AI Agents',
favicon: 'img/favicon.ico',
future: {
v4: true,
},
markdown: {
mermaid: true,
},
url: 'https://memora.dev',
baseUrl: '/',
organizationName: 'memora',
projectName: 'memora',
onBrokenLinks: 'throw',
i18n: {
defaultLocale: 'en',
locales: ['en'],
},
headTags: [
{
tagName: 'link',
attributes: {
rel: 'preconnect',
href: 'https://fonts.googleapis.com',
},
},
{
tagName: 'link',
attributes: {
rel: 'preconnect',
href: 'https://fonts.gstatic.com',
crossorigin: 'anonymous',
},
},
{
tagName: 'link',
attributes: {
rel: 'stylesheet',
href: 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Nunito+Sans:wght@400;500;600;700;800&display=swap',
},
},
],
presets: [
[
'classic',
{
docs: {
sidebarPath: './sidebars.ts',
editUrl: 'https://github.com/memora/memora/tree/main/memora-docs/',
routeBasePath: '/',
docItemComponent: '@theme/ApiItem',
},
blog: false,
theme: {
customCss: './src/css/custom.css',
},
} satisfies Preset.Options,
],
],
plugins: [
[
'docusaurus-plugin-openapi-docs',
{
id: 'api',
docsPluginId: 'default',
config: {
memora: {
specPath: 'openapi.json',
outputDir: 'docs/api-reference/endpoints',
sidebarOptions: {
groupPathsBy: 'tag',
},
} satisfies OpenApiPlugin.Options,
},
},
],
],
themes: ['docusaurus-theme-openapi-docs', '@docusaurus/theme-mermaid'],
themeConfig: {
image: 'img/memora-social-card.jpg',
colorMode: {
defaultMode: 'dark',
respectPrefersColorScheme: true,
},
navbar: {
title: 'Memora',
logo: {
alt: 'Memora Logo',
src: 'img/logo.svg',
},
items: [
{
type: 'custom-iconLink',
position: 'left',
icon: 'code',
label: 'Developer',
to: '/',
},
{
type: 'custom-iconLink',
position: 'left',
icon: 'package',
label: 'SDKs',
to: '/sdks/python',
},
{
type: 'custom-iconLink',
position: 'left',
icon: 'file-code',
label: 'API Reference',
to: '/api-reference',
},
{
type: 'custom-iconLink',
position: 'left',
icon: 'book-open',
label: 'Cookbook',
to: '/cookbook',
},
{
type: 'custom-iconLink',
position: 'left',
icon: 'clock',
label: 'Changelog',
to: '/changelog',
},
{
href: 'https://github.com/memora/memora',
label: 'GitHub',
position: 'right',
},
],
},
footer: {
style: 'dark',
links: [
{
title: 'Documentation',
items: [
{
label: 'Introduction',
to: '/',
},
{
label: 'SDKs',
to: '/sdks/python',
},
{
label: 'API Reference',
to: '/api-reference',
},
],
},
{
title: 'More',
items: [
{
label: 'GitHub',
href: 'https://github.com/memora/memora',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} Memora. Built with Docusaurus.`,
},
prism: {
theme: prismThemes.github,
darkTheme: prismThemes.dracula,
additionalLanguages: ['bash', 'json', 'python', 'rust'],
},
} satisfies Preset.ThemeConfig,
};
export default config;

2156
memora-docs/openapi.json Normal file

File diff suppressed because it is too large Load diff

23331
memora-docs/package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

52
memora-docs/package.json Normal file
View file

@ -0,0 +1,52 @@
{
"name": "memora-docs",
"version": "0.0.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
"start": "docusaurus start",
"build": "docusaurus build",
"swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
},
"dependencies": {
"@docusaurus/core": "3.9.2",
"@docusaurus/preset-classic": "3.9.2",
"@docusaurus/theme-common": "^3.9.2",
"@docusaurus/theme-mermaid": "^3.9.2",
"@mdx-js/react": "^3.0.0",
"@phosphor-icons/react": "^2.1.10",
"clsx": "^2.0.0",
"docusaurus-plugin-openapi-docs": "^4.5.1",
"docusaurus-theme-openapi-docs": "^4.5.1",
"prism-react-renderer": "^2.3.0",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.9.2",
"@docusaurus/tsconfig": "3.9.2",
"@docusaurus/types": "3.9.2",
"typescript": "~5.6.2"
},
"browserslist": {
"production": [
">0.5%",
"not dead",
"not op_mini all"
],
"development": [
"last 3 chrome version",
"last 3 firefox version",
"last 5 safari version"
]
},
"engines": {
"node": ">=20.0"
}
}

170
memora-docs/sidebars.ts Normal file
View file

@ -0,0 +1,170 @@
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
import apiSidebar from './docs/api-reference/endpoints/sidebar';
const sidebars: SidebarsConfig = {
developerSidebar: [
{
type: 'category',
label: 'Concepts',
collapsible: false,
items: [
{
type: 'doc',
id: 'developer/index',
label: 'Overview',
},
{
type: 'doc',
id: 'developer/architecture',
label: 'Architecture',
},
{
type: 'doc',
id: 'developer/retrieval',
label: 'Retrieval',
},
{
type: 'doc',
id: 'developer/personality',
label: 'Personality',
},
],
},
{
type: 'category',
label: 'API',
collapsible: false,
items: [
{
type: 'doc',
id: 'developer/api/ingest',
label: 'Ingest Data',
},
{
type: 'doc',
id: 'developer/api/search',
label: 'Search Facts',
},
{
type: 'doc',
id: 'developer/api/think',
label: 'Think',
},
{
type: 'doc',
id: 'developer/api/think-vs-search',
label: 'Think vs Search',
},
{
type: 'doc',
id: 'developer/api/opinions',
label: 'Opinions',
},
{
type: 'doc',
id: 'developer/api/agent-identity',
label: 'Agent Identity',
},
],
},
{
type: 'category',
label: 'Server',
collapsible: false,
items: [
{
type: 'doc',
id: 'developer/server',
label: 'Administration',
},
],
},
],
sdksSidebar: [
{
type: 'category',
label: 'Clients',
collapsible: false,
items: [
{
type: 'doc',
id: 'sdks/python',
label: 'Python',
},
{
type: 'doc',
id: 'sdks/nodejs',
label: 'Node.js',
},
{
type: 'doc',
id: 'sdks/cli',
label: 'CLI',
},
],
},
{
type: 'category',
label: 'Integrations',
collapsible: false,
items: [
{
type: 'doc',
id: 'sdks/openai',
label: 'OpenAI',
},
{
type: 'doc',
id: 'sdks/langgraph',
label: 'LangGraph',
},
{
type: 'doc',
id: 'sdks/mcp',
label: 'MCP Server',
},
],
},
],
apiReferenceSidebar: [
{
type: 'doc',
id: 'api-reference/index',
label: 'Overview',
},
{
type: 'category',
label: 'HTTP API',
collapsible: false,
items: apiSidebar,
},
{
type: 'category',
label: 'MCP API',
collapsible: false,
items: [
{
type: 'doc',
id: 'api-reference/mcp',
label: 'Tools Reference',
},
],
},
],
cookbookSidebar: [
{
type: 'doc',
id: 'cookbook/index',
label: 'Cookbook',
},
],
changelogSidebar: [
{
type: 'doc',
id: 'changelog/index',
label: 'Changelog',
},
],
};
export default sidebars;

View file

@ -0,0 +1,42 @@
import React from 'react';
import Link from '@docusaurus/Link';
import {
House,
Code,
Package,
FileCode,
BookOpen,
ClockCounterClockwise,
} from '@phosphor-icons/react';
const iconMap = {
house: House,
code: Code,
package: Package,
'file-code': FileCode,
'book-open': BookOpen,
clock: ClockCounterClockwise,
};
export default function NavbarIconLink({
icon,
label,
to,
className,
}: {
icon: keyof typeof iconMap;
label: string;
to: string;
className?: string;
}) {
const IconComponent = iconMap[icon];
return (
<Link to={to} className={`navbar__link ${className || ''}`}>
{IconComponent && (
<IconComponent size={16} weight="bold" style={{ marginRight: '6px', verticalAlign: 'middle' }} />
)}
<span style={{ verticalAlign: 'middle' }}>{label}</span>
</Link>
);
}

View file

@ -0,0 +1,333 @@
/**
* Memora custom theme - Modern, clean style
*/
/* Primary colors - Teal/Cyan theme */
:root {
--ifm-color-primary: #0d9488;
--ifm-color-primary-dark: #0f766e;
--ifm-color-primary-darker: #115e59;
--ifm-color-primary-darkest: #134e4a;
--ifm-color-primary-light: #14b8a6;
--ifm-color-primary-lighter: #2dd4bf;
--ifm-color-primary-lightest: #5eead4;
--ifm-code-font-size: 90%;
--docusaurus-highlighted-code-line-bg: rgba(13, 148, 136, 0.1);
/* Typography - Avenir Book */
--ifm-font-family-base: 'Avenir Book', 'Avenir', 'Nunito Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
--ifm-heading-font-family: 'Avenir', 'Avenir Book', 'Nunito Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
--ifm-font-family-monospace: 'JetBrains Mono', 'Fira Code', 'SF Mono', Monaco, 'Cascadia Code', Consolas, monospace;
--ifm-font-weight-semibold: 600;
--ifm-font-size-base: 96%;
/* Spacing */
--ifm-spacing-horizontal: 1.5rem;
--ifm-navbar-height: 3.5rem;
/* Borders */
--ifm-global-radius: 0.5rem;
}
[data-theme='dark'] {
--ifm-color-primary: #2dd4bf;
--ifm-color-primary-dark: #14b8a6;
--ifm-color-primary-darker: #0d9488;
--ifm-color-primary-darkest: #0f766e;
--ifm-color-primary-light: #5eead4;
--ifm-color-primary-lighter: #99f6e4;
--ifm-color-primary-lightest: #ccfbf1;
--docusaurus-highlighted-code-line-bg: rgba(45, 212, 191, 0.15);
--ifm-background-color: #09090b;
--ifm-background-surface-color: #18181b;
--ifm-navbar-background-color: #09090b;
--ifm-footer-background-color: #09090b;
--ifm-toc-border-color: #27272a;
}
/* Navbar styling */
.navbar {
box-shadow: none;
border-bottom: 1px solid var(--ifm-toc-border-color);
padding: 0 1rem;
}
.navbar__title {
font-weight: 700;
font-size: 1.125rem;
}
.navbar__items {
gap: 0.25rem;
}
.navbar__link {
font-weight: 500;
font-size: 0.8125rem;
padding: 0.5rem 0.75rem;
border-radius: 0.375rem;
transition: background-color 0.15s ease;
}
.navbar__link:hover {
background-color: var(--ifm-background-surface-color);
}
.navbar__link--active {
color: var(--ifm-color-primary);
}
[data-theme='dark'] .navbar__link:hover {
background-color: #27272a;
}
/* Hero section */
.hero {
padding: 4rem 0;
}
.hero--primary {
background: linear-gradient(135deg, var(--ifm-color-primary-darkest) 0%, var(--ifm-color-primary-dark) 100%);
}
[data-theme='dark'] .hero--primary {
background: linear-gradient(135deg, #0f1419 0%, #0d1117 100%);
}
.hero__title {
font-size: 3rem;
font-weight: 800;
margin-bottom: 1rem;
}
.hero__subtitle {
font-size: 1.125rem;
opacity: 0.9;
}
/* Buttons */
.button {
border-radius: 0.5rem;
font-weight: 600;
transition: all 0.2s ease;
}
.button--primary {
background: var(--ifm-color-primary);
border-color: var(--ifm-color-primary);
}
.button--primary:hover {
background: var(--ifm-color-primary-dark);
border-color: var(--ifm-color-primary-dark);
}
.button--secondary {
background: transparent;
border: 2px solid currentColor;
}
/* Sidebar */
.menu__link {
border-radius: 0.375rem;
font-weight: 500;
font-size: 0.8125rem;
}
.menu__link--active {
background: var(--ifm-color-primary-lightest);
color: var(--ifm-color-primary-darkest);
}
[data-theme='dark'] .menu__link--active {
background: rgba(45, 212, 191, 0.12);
color: var(--ifm-color-primary-light);
}
/* Non-collapsible category styling */
.menu__list-item-collapsible {
font-weight: 600;
font-size: 0.6875rem;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--ifm-color-emphasis-600);
margin-top: 1rem;
margin-bottom: 0.25rem;
}
.menu__list-item-collapsible:first-child {
margin-top: 0;
}
.menu__list-item-collapsible .menu__link {
padding: 0.25rem 0.75rem;
}
.menu__list-item-collapsible .menu__link:hover {
background: transparent;
}
[data-theme='dark'] .menu__list-item-collapsible {
color: var(--ifm-color-emphasis-500);
}
/* Code blocks */
.prism-code {
border-radius: 0.5rem;
font-size: 0.875rem;
line-height: 1.6;
font-family: var(--ifm-font-family-monospace);
padding: 1rem !important;
}
/* Inline code */
code {
border-radius: 0.375rem;
padding: 0.2rem 0.45rem;
font-size: 0.875em;
font-family: var(--ifm-font-family-monospace);
background-color: #f1f5f9;
color: #0f172a;
font-weight: 500;
}
[data-theme='dark'] code {
background-color: #1e293b;
color: #e2e8f0;
}
/* Don't apply inline styles to code inside pre blocks */
pre code {
background-color: transparent;
border: none;
padding: 0;
font-size: inherit;
color: inherit;
font-weight: normal;
}
/* Code block container */
div[class*="codeBlockContainer"] {
border-radius: 0.5rem;
border: 1px solid var(--ifm-toc-border-color);
overflow: hidden;
background: #f8fafc;
}
[data-theme='dark'] div[class*="codeBlockContainer"] {
background: #0f172a;
}
div[class*="codeBlockTitle"] {
font-size: 0.75rem;
padding: 0.5rem 1rem;
border-bottom: 1px solid var(--ifm-toc-border-color);
font-family: var(--ifm-font-family-monospace);
}
/* Code block content area */
div[class*="codeBlockContent"] {
background: #f8fafc;
}
[data-theme='dark'] div[class*="codeBlockContent"] {
background: #0f172a;
}
/* Cards/Features */
.features {
padding: 4rem 0;
}
/* Docs page */
.theme-doc-markdown {
max-width: 100%;
}
article h1 {
font-size: 2.25rem;
font-weight: 800;
margin-bottom: 1.25rem;
}
article h2 {
font-size: 1.5rem;
font-weight: 700;
margin-top: 2rem;
margin-bottom: 0.75rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--ifm-toc-border-color);
}
article h3 {
font-size: 1.125rem;
font-weight: 600;
margin-top: 1.25rem;
}
article p {
font-size: 0.9375rem;
line-height: 1.7;
}
/* Admonitions */
.admonition {
border-radius: 0.5rem;
border-left-width: 4px;
}
/* Tables - Compact styling */
table {
display: table;
width: 100%;
font-size: 0.8125rem;
margin: 1rem 0;
}
th, td {
border: 1px solid var(--ifm-toc-border-color);
padding: 0.5rem 0.75rem;
}
th {
background: var(--ifm-background-surface-color);
font-weight: 600;
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.025em;
}
/* Footer */
.footer {
border-top: 1px solid var(--ifm-toc-border-color);
}
.footer__title {
font-weight: 700;
}
/* Tabs styling */
.tabs-container {
margin: 1rem 0;
}
.tabs__item {
font-size: 0.8125rem;
padding: 0.5rem 1rem;
}
/* Smooth scrolling */
html {
scroll-behavior: smooth;
}
/* List styling */
article ul, article ol {
font-size: 0.9375rem;
}
article li {
margin-bottom: 0.25rem;
}

View file

@ -0,0 +1,7 @@
import ComponentTypes from '@theme-original/NavbarItem/ComponentTypes';
import NavbarIconLink from '@site/src/components/NavbarIconLink';
export default {
...ComponentTypes,
'custom-iconLink': NavbarIconLink,
};

View file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View file

@ -0,0 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#7c3aed;stop-opacity:1" />
<stop offset="100%" style="stop-color:#a78bfa;stop-opacity:1" />
</linearGradient>
</defs>
<circle cx="50" cy="50" r="45" fill="url(#grad)"/>
<circle cx="50" cy="35" r="12" fill="white" opacity="0.9"/>
<circle cx="35" cy="55" r="8" fill="white" opacity="0.7"/>
<circle cx="65" cy="55" r="8" fill="white" opacity="0.7"/>
<circle cx="50" cy="70" r="6" fill="white" opacity="0.5"/>
<line x1="50" y1="47" x2="35" y2="55" stroke="white" stroke-width="2" opacity="0.6"/>
<line x1="50" y1="47" x2="65" y2="55" stroke="white" stroke-width="2" opacity="0.6"/>
<line x1="35" y1="55" x2="50" y2="70" stroke="white" stroke-width="2" opacity="0.5"/>
<line x1="65" y1="55" x2="50" y2="70" stroke="white" stroke-width="2" opacity="0.5"/>
</svg>

After

Width:  |  Height:  |  Size: 968 B

View file

@ -0,0 +1,171 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1088" height="687.962" viewBox="0 0 1088 687.962">
<title>Easy to Use</title>
<g id="Group_12" data-name="Group 12" transform="translate(-57 -56)">
<g id="Group_11" data-name="Group 11" transform="translate(57 56)">
<path id="Path_83" data-name="Path 83" d="M1017.81,560.461c-5.27,45.15-16.22,81.4-31.25,110.31-20,38.52-54.21,54.04-84.77,70.28a193.275,193.275,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.282,657.282,0,0,0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07,5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12,52.29-235.46,134.74-296.47,155.97-115.41,369.76-110.57,523.43,7.88C941.15,276.621,1036.99,396.031,1017.81,560.461Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_84" data-name="Path 84" d="M986.56,670.771c-20,38.52-47.21,64.04-77.77,80.28a193.272,193.272,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.3,657.3,0,0,0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25,1.72c-100.17,7.36-253.82-6.43-321.42-143.29L382,283.981,444.95,445.6l20.09,51.59,55.37-75.98L549,381.981l130.2,149.27,36.8-81.27L970.78,657.9l14.21,11.59Z" transform="translate(-56 -106.019)" fill="#f2f2f2"/>
<path id="Path_85" data-name="Path 85" d="M302,282.962l26-57,36,83-31-60Z" opacity="0.1"/>
<path id="Path_86" data-name="Path 86" d="M610.5,753.821q-14.97-.675-29.97-.67L465.04,497.191Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<path id="Path_87" data-name="Path 87" d="M464.411,315.191,493,292.962l130,150-132-128Z" opacity="0.1"/>
<path id="Path_88" data-name="Path 88" d="M908.79,751.051a193.265,193.265,0,0,1-27.46,11.94L679.2,531.251Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<circle id="Ellipse_11" data-name="Ellipse 11" cx="3" cy="3" r="3" transform="translate(479 98.962)" fill="#f2f2f2"/>
<circle id="Ellipse_12" data-name="Ellipse 12" cx="3" cy="3" r="3" transform="translate(396 201.962)" fill="#f2f2f2"/>
<circle id="Ellipse_13" data-name="Ellipse 13" cx="2" cy="2" r="2" transform="translate(600 220.962)" fill="#f2f2f2"/>
<circle id="Ellipse_14" data-name="Ellipse 14" cx="2" cy="2" r="2" transform="translate(180 265.962)" fill="#f2f2f2"/>
<circle id="Ellipse_15" data-name="Ellipse 15" cx="2" cy="2" r="2" transform="translate(612 96.962)" fill="#f2f2f2"/>
<circle id="Ellipse_16" data-name="Ellipse 16" cx="2" cy="2" r="2" transform="translate(736 192.962)" fill="#f2f2f2"/>
<circle id="Ellipse_17" data-name="Ellipse 17" cx="2" cy="2" r="2" transform="translate(858 344.962)" fill="#f2f2f2"/>
<path id="Path_89" data-name="Path 89" d="M306,121.222h-2.76v-2.76h-1.48v2.76H299V122.7h2.76v2.759h1.48V122.7H306Z" fill="#f2f2f2"/>
<path id="Path_90" data-name="Path 90" d="M848,424.222h-2.76v-2.76h-1.48v2.76H841V425.7h2.76v2.759h1.48V425.7H848Z" fill="#f2f2f2"/>
<path id="Path_91" data-name="Path 91" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_92" data-name="Path 92" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<ellipse id="Ellipse_18" data-name="Ellipse 18" cx="544" cy="30" rx="544" ry="30" transform="translate(0 583.962)" fill="#3f3d56"/>
<path id="Path_93" data-name="Path 93" d="M624,677.981c0,33.137-14.775,24-33,24s-33,9.137-33-24,33-96,33-96S624,644.844,624,677.981Z" transform="translate(-56 -106.019)" fill="#ff6584"/>
<path id="Path_94" data-name="Path 94" d="M606,690.66c0,15.062-6.716,10.909-15,10.909s-15,4.153-15-10.909,15-43.636,15-43.636S606,675.6,606,690.66Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<rect id="Rectangle_97" data-name="Rectangle 97" width="92" height="18" rx="9" transform="translate(489 604.962)" fill="#2f2e41"/>
<rect id="Rectangle_98" data-name="Rectangle 98" width="92" height="18" rx="9" transform="translate(489 586.962)" fill="#2f2e41"/>
<path id="Path_95" data-name="Path 95" d="M193,596.547c0,55.343,34.719,100.126,77.626,100.126" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_96" data-name="Path 96" d="M270.626,696.673c0-55.965,38.745-101.251,86.626-101.251" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_97" data-name="Path 97" d="M221.125,601.564c0,52.57,22.14,95.109,49.5,95.109" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_98" data-name="Path 98" d="M270.626,696.673c0-71.511,44.783-129.377,100.126-129.377" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_99" data-name="Path 99" d="M254.3,697.379s11.009-.339,14.326-2.7,16.934-5.183,17.757-1.395,16.544,18.844,4.115,18.945-28.879-1.936-32.19-3.953S254.3,697.379,254.3,697.379Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_100" data-name="Path 100" d="M290.716,710.909c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7,8.879,4.009,10.9,19.761,4.053,32.19,3.953c3.588-.029,4.827-1.305,4.759-3.2C294.755,710.174,293.386,710.887,290.716,710.909Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_101" data-name="Path 101" d="M777.429,633.081c0,38.029,23.857,68.8,53.341,68.8" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_102" data-name="Path 102" d="M830.769,701.882c0-38.456,26.623-69.575,59.525-69.575" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_103" data-name="Path 103" d="M796.755,636.528c0,36.124,15.213,65.354,34.014,65.354" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_104" data-name="Path 104" d="M830.769,701.882c0-49.139,30.773-88.9,68.8-88.9" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_105" data-name="Path 105" d="M819.548,702.367s7.565-.233,9.844-1.856,11.636-3.562,12.2-.958,11.368,12.949,2.828,13.018-19.844-1.33-22.119-2.716S819.548,702.367,819.548,702.367Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_106" data-name="Path 106" d="M844.574,711.664c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479,6.1,2.755,7.487,13.579,2.785,22.119,2.716c2.465-.02,3.317-.9,3.27-2.2C847.349,711.159,846.409,711.649,844.574,711.664Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_107" data-name="Path 107" d="M949.813,724.718s11.36-1.729,14.5-4.591,16.89-7.488,18.217-3.667,19.494,17.447,6.633,19.107-30.153,1.609-33.835-.065S949.813,724.718,949.813,724.718Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_108" data-name="Path 108" d="M989.228,734.173c-12.86,1.659-30.153,1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833,9.109,5.516,10.783,20.975,1.725,33.835.065c3.712-.479,4.836-1.956,4.529-3.906C993.319,732.907,991.991,733.817,989.228,734.173Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_109" data-name="Path 109" d="M670.26,723.9s9.587-1.459,12.237-3.875,14.255-6.32,15.374-3.095,16.452,14.725,5.6,16.125-25.448,1.358-28.555-.055S670.26,723.9,670.26,723.9Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_110" data-name="Path 110" d="M703.524,731.875c-10.853,1.4-25.448,1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547,7.687,4.655,9.1,17.7,1.456,28.555.055c3.133-.4,4.081-1.651,3.822-3.3C706.977,730.807,705.856,731.575,703.524,731.875Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_111" data-name="Path 111" d="M178.389,719.109s7.463-1.136,9.527-3.016,11.1-4.92,11.969-2.409,12.808,11.463,4.358,12.553-19.811,1.057-22.23-.043S178.389,719.109,178.389,719.109Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_112" data-name="Path 112" d="M204.285,725.321c-8.449,1.09-19.811,1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2,5.984,3.624,7.085,13.781,1.133,22.23.043c2.439-.315,3.177-1.285,2.976-2.566C206.973,724.489,206.1,725.087,204.285,725.321Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_113" data-name="Path 113" d="M439.7,707.337c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873,42.118-36.793,93.694-36.793S439.7,677.117,439.7,707.337Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<path id="Path_114" data-name="Path 114" d="M439.7,699.9c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873S295.04,663.1,346.616,663.1,439.7,669.676,439.7,699.9Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
</g>
<g id="docusaurus_keytar" transform="translate(312.271 493.733)">
<path id="Path_40" data-name="Path 40" d="M99,52h91.791V89.153H99Z" transform="translate(5.904 -14.001)" fill="#fff" fill-rule="evenodd"/>
<path id="Path_41" data-name="Path 41" d="M24.855,163.927A21.828,21.828,0,0,1,5.947,153a21.829,21.829,0,0,0,18.908,32.782H46.71V163.927Z" transform="translate(-3 -4.634)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_42" data-name="Path 42" d="M121.861,61.1l76.514-4.782V45.39A21.854,21.854,0,0,0,176.52,23.535H78.173L75.441,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L64.513,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L53.586,18.8a3.154,3.154,0,0,0-5.464,0L45.39,23.535c-.024,0-.046,0-.071,0l-4.526-4.525a3.153,3.153,0,0,0-5.276,1.414l-1.5,5.577-5.674-1.521a3.154,3.154,0,0,0-3.863,3.864L26,34.023l-5.575,1.494a3.155,3.155,0,0,0-1.416,5.278l4.526,4.526c0,.023,0,.046,0,.07L18.8,48.122a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,59.05a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,69.977a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,80.9a3.154,3.154,0,0,0,0,5.464L23.535,89.1,18.8,91.832a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,102.76a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,113.687a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,124.615a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,135.542a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,146.469a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,157.4a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,168.324a3.154,3.154,0,0,0,0,5.464l4.732,2.732A21.854,21.854,0,0,0,45.39,198.375H176.52a21.854,21.854,0,0,0,21.855-21.855V89.1l-76.514-4.782a11.632,11.632,0,0,1,0-23.219" transform="translate(-1.681 -17.226)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_43" data-name="Path 43" d="M143,186.71h32.782V143H143Z" transform="translate(9.984 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_44" data-name="Path 44" d="M196.71,159.855a5.438,5.438,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(10.912 -6.025)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_45" data-name="Path 45" d="M153,124.855h32.782V103H153Z" transform="translate(10.912 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_46" data-name="Path 46" d="M194.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.814,2.814,0,0,0,.349.035" transform="translate(12.767 -9.377)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_47" data-name="Path 47" d="M65.087,56.891a2.732,2.732,0,0,1-2.732-2.732,8.2,8.2,0,0,0-16.391,0,2.732,2.732,0,0,1-5.464,0,13.659,13.659,0,0,1,27.319,0,2.732,2.732,0,0,1-2.732,2.732" transform="translate(0.478 -15.068)" fill-rule="evenodd"/>
<path id="Path_48" data-name="Path 48" d="M103,191.347h65.565a21.854,21.854,0,0,0,21.855-21.855V93H124.855A21.854,21.854,0,0,0,103,114.855Z" transform="translate(6.275 -10.199)" fill="#ffff50" fill-rule="evenodd"/>
<path id="Path_49" data-name="Path 49" d="M173.216,129.787H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0-54.434H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.652H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186M189.585,61.611c-.013,0-.024-.007-.037-.005-3.377.115-4.974,3.492-6.384,6.472-1.471,3.114-2.608,5.139-4.473,5.078-2.064-.074-3.244-2.406-4.494-4.874-1.436-2.835-3.075-6.049-6.516-5.929-3.329.114-4.932,3.053-6.346,5.646-1.5,2.762-2.529,4.442-4.5,4.364-2.106-.076-3.225-1.972-4.52-4.167-1.444-2.443-3.112-5.191-6.487-5.1-3.272.113-4.879,2.606-6.3,4.808-1.5,2.328-2.552,3.746-4.551,3.662-2.156-.076-3.27-1.65-4.558-3.472-1.447-2.047-3.077-4.363-6.442-4.251-3.2.109-4.807,2.153-6.224,3.954-1.346,1.709-2.4,3.062-4.621,2.977a1.093,1.093,0,0,0-.079,2.186c3.3.11,4.967-1.967,6.417-3.81,1.286-1.635,2.4-3.045,4.582-3.12,2.1-.09,3.091,1.218,4.584,3.327,1.417,2,3.026,4.277,6.263,4.394,3.391.114,5.022-2.42,6.467-4.663,1.292-2,2.406-3.734,4.535-3.807,1.959-.073,3.026,1.475,4.529,4.022,1.417,2.4,3.023,5.121,6.324,5.241,3.415.118,5.064-2.863,6.5-5.5,1.245-2.282,2.419-4.437,4.5-4.509,1.959-.046,2.981,1.743,4.492,4.732,1.412,2.79,3.013,5.95,6.365,6.071l.185,0c3.348,0,4.937-3.36,6.343-6.331,1.245-2.634,2.423-5.114,4.444-5.216Z" transform="translate(7.109 -13.11)" fill-rule="evenodd"/>
<path id="Path_50" data-name="Path 50" d="M83,186.71h43.71V143H83Z" transform="translate(4.42 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
<g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 109.327, 91.085)">
<rect id="Rectangle_3" data-name="Rectangle 3" width="92.361" height="36.462" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
<g id="Group_2" data-name="Group 2" transform="translate(1.531 23.03)">
<rect id="Rectangle_4" data-name="Rectangle 4" width="5.336" height="5.336" rx="1" transform="translate(16.797 0)" fill="#4a4a4a"/>
<rect id="Rectangle_5" data-name="Rectangle 5" width="5.336" height="5.336" rx="1" transform="translate(23.12 0)" fill="#4a4a4a"/>
<rect id="Rectangle_6" data-name="Rectangle 6" width="5.336" height="5.336" rx="1" transform="translate(29.444 0)" fill="#4a4a4a"/>
<rect id="Rectangle_7" data-name="Rectangle 7" width="5.336" height="5.336" rx="1" transform="translate(35.768 0)" fill="#4a4a4a"/>
<rect id="Rectangle_8" data-name="Rectangle 8" width="5.336" height="5.336" rx="1" transform="translate(42.091 0)" fill="#4a4a4a"/>
<rect id="Rectangle_9" data-name="Rectangle 9" width="5.336" height="5.336" rx="1" transform="translate(48.415 0)" fill="#4a4a4a"/>
<rect id="Rectangle_10" data-name="Rectangle 10" width="5.336" height="5.336" rx="1" transform="translate(54.739 0)" fill="#4a4a4a"/>
<rect id="Rectangle_11" data-name="Rectangle 11" width="5.336" height="5.336" rx="1" transform="translate(61.063 0)" fill="#4a4a4a"/>
<rect id="Rectangle_12" data-name="Rectangle 12" width="5.336" height="5.336" rx="1" transform="translate(67.386 0)" fill="#4a4a4a"/>
<path id="Path_51" data-name="Path 51" d="M1.093,0H14.518a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0ZM75,0H88.426a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H75a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,75,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_3" data-name="Group 3" transform="translate(1.531 10.261)">
<path id="Path_52" data-name="Path 52" d="M1.093,0H6.218A1.093,1.093,0,0,1,7.31,1.093V4.242A1.093,1.093,0,0,1,6.218,5.335H1.093A1.093,1.093,0,0,1,0,4.242V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_13" data-name="Rectangle 13" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_14" data-name="Rectangle 14" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_15" data-name="Rectangle 15" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_16" data-name="Rectangle 16" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_17" data-name="Rectangle 17" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_18" data-name="Rectangle 18" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_19" data-name="Rectangle 19" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_20" data-name="Rectangle 20" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_21" data-name="Rectangle 21" width="5.336" height="5.336" rx="1" transform="translate(58.888 0)" fill="#4a4a4a"/>
<rect id="Rectangle_22" data-name="Rectangle 22" width="5.336" height="5.336" rx="1" transform="translate(65.212 0)" fill="#4a4a4a"/>
<rect id="Rectangle_23" data-name="Rectangle 23" width="5.336" height="5.336" rx="1" transform="translate(71.536 0)" fill="#4a4a4a"/>
<rect id="Rectangle_24" data-name="Rectangle 24" width="5.336" height="5.336" rx="1" transform="translate(77.859 0)" fill="#4a4a4a"/>
<rect id="Rectangle_25" data-name="Rectangle 25" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
</g>
<g id="Group_4" data-name="Group 4" transform="translate(91.05 9.546) rotate(180)">
<path id="Path_53" data-name="Path 53" d="M1.093,0H6.219A1.093,1.093,0,0,1,7.312,1.093v3.15A1.093,1.093,0,0,1,6.219,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_26" data-name="Rectangle 26" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_27" data-name="Rectangle 27" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_28" data-name="Rectangle 28" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_29" data-name="Rectangle 29" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_30" data-name="Rectangle 30" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_31" data-name="Rectangle 31" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_32" data-name="Rectangle 32" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_33" data-name="Rectangle 33" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_34" data-name="Rectangle 34" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
<rect id="Rectangle_35" data-name="Rectangle 35" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
<rect id="Rectangle_36" data-name="Rectangle 36" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
<rect id="Rectangle_37" data-name="Rectangle 37" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
<rect id="Rectangle_38" data-name="Rectangle 38" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
<rect id="Rectangle_39" data-name="Rectangle 39" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_40" data-name="Rectangle 40" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_41" data-name="Rectangle 41" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_42" data-name="Rectangle 42" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_43" data-name="Rectangle 43" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_44" data-name="Rectangle 44" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_45" data-name="Rectangle 45" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_46" data-name="Rectangle 46" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_47" data-name="Rectangle 47" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
<rect id="Rectangle_48" data-name="Rectangle 48" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
<rect id="Rectangle_49" data-name="Rectangle 49" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
<rect id="Rectangle_50" data-name="Rectangle 50" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
<rect id="Rectangle_51" data-name="Rectangle 51" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
</g>
<g id="Group_6" data-name="Group 6" transform="translate(1.531 16.584)">
<path id="Path_54" data-name="Path 54" d="M1.093,0h7.3A1.093,1.093,0,0,1,9.485,1.093v3.15A1.093,1.093,0,0,1,8.392,5.336h-7.3A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<g id="Group_5" data-name="Group 5" transform="translate(10.671 0)">
<rect id="Rectangle_52" data-name="Rectangle 52" width="5.336" height="5.336" rx="1" fill="#4a4a4a"/>
<rect id="Rectangle_53" data-name="Rectangle 53" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
<rect id="Rectangle_54" data-name="Rectangle 54" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
<rect id="Rectangle_55" data-name="Rectangle 55" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
<rect id="Rectangle_56" data-name="Rectangle 56" width="5.336" height="5.336" rx="1" transform="translate(25.295 0)" fill="#4a4a4a"/>
<rect id="Rectangle_57" data-name="Rectangle 57" width="5.336" height="5.336" rx="1" transform="translate(31.619 0)" fill="#4a4a4a"/>
<rect id="Rectangle_58" data-name="Rectangle 58" width="5.336" height="5.336" rx="1" transform="translate(37.942 0)" fill="#4a4a4a"/>
<rect id="Rectangle_59" data-name="Rectangle 59" width="5.336" height="5.336" rx="1" transform="translate(44.265 0)" fill="#4a4a4a"/>
<rect id="Rectangle_60" data-name="Rectangle 60" width="5.336" height="5.336" rx="1" transform="translate(50.589 0)" fill="#4a4a4a"/>
<rect id="Rectangle_61" data-name="Rectangle 61" width="5.336" height="5.336" rx="1" transform="translate(56.912 0)" fill="#4a4a4a"/>
<rect id="Rectangle_62" data-name="Rectangle 62" width="5.336" height="5.336" rx="1" transform="translate(63.236 0)" fill="#4a4a4a"/>
</g>
<path id="Path_55" data-name="Path 55" d="M1.094,0H8A1.093,1.093,0,0,1,9.091,1.093v3.15A1.093,1.093,0,0,1,8,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(80.428 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_7" data-name="Group 7" transform="translate(1.531 29.627)">
<rect id="Rectangle_63" data-name="Rectangle 63" width="5.336" height="5.336" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_64" data-name="Rectangle 64" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
<rect id="Rectangle_65" data-name="Rectangle 65" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
<rect id="Rectangle_66" data-name="Rectangle 66" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
<path id="Path_56" data-name="Path 56" d="M1.093,0H31.515a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.244V1.093A1.093,1.093,0,0,1,1.093,0ZM34.687,0h3.942a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H34.687a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,34.687,0Z" transform="translate(25.294 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_67" data-name="Rectangle 67" width="5.336" height="5.336" rx="1" transform="translate(66.003 0)" fill="#4a4a4a"/>
<rect id="Rectangle_68" data-name="Rectangle 68" width="5.336" height="5.336" rx="1" transform="translate(72.327 0)" fill="#4a4a4a"/>
<rect id="Rectangle_69" data-name="Rectangle 69" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
<path id="Path_57" data-name="Path 57" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(83.59 2.273) rotate(180)" fill="#4a4a4a"/>
<path id="Path_58" data-name="Path 58" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(78.255 3.063)" fill="#4a4a4a"/>
</g>
<rect id="Rectangle_70" data-name="Rectangle 70" width="88.927" height="2.371" rx="1.085" transform="translate(1.925 1.17)" fill="#4a4a4a"/>
<rect id="Rectangle_71" data-name="Rectangle 71" width="4.986" height="1.581" rx="0.723" transform="translate(4.1 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_72" data-name="Rectangle 72" width="4.986" height="1.581" rx="0.723" transform="translate(10.923 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_73" data-name="Rectangle 73" width="4.986" height="1.581" rx="0.723" transform="translate(16.173 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_74" data-name="Rectangle 74" width="4.986" height="1.581" rx="0.723" transform="translate(21.421 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_75" data-name="Rectangle 75" width="4.986" height="1.581" rx="0.723" transform="translate(26.671 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_76" data-name="Rectangle 76" width="4.986" height="1.581" rx="0.723" transform="translate(33.232 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_77" data-name="Rectangle 77" width="4.986" height="1.581" rx="0.723" transform="translate(38.48 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_78" data-name="Rectangle 78" width="4.986" height="1.581" rx="0.723" transform="translate(43.73 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_79" data-name="Rectangle 79" width="4.986" height="1.581" rx="0.723" transform="translate(48.978 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_80" data-name="Rectangle 80" width="4.986" height="1.581" rx="0.723" transform="translate(55.54 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_81" data-name="Rectangle 81" width="4.986" height="1.581" rx="0.723" transform="translate(60.788 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_82" data-name="Rectangle 82" width="4.986" height="1.581" rx="0.723" transform="translate(66.038 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_83" data-name="Rectangle 83" width="4.986" height="1.581" rx="0.723" transform="translate(72.599 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_84" data-name="Rectangle 84" width="4.986" height="1.581" rx="0.723" transform="translate(77.847 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_85" data-name="Rectangle 85" width="4.986" height="1.581" rx="0.723" transform="translate(83.097 1.566)" fill="#d8d8d8" opacity="0.136"/>
</g>
<path id="Path_59" data-name="Path 59" d="M146.71,159.855a5.439,5.439,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(6.275 -6.025)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_60" data-name="Path 60" d="M83,124.855h43.71V103H83Z" transform="translate(4.42 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_61" data-name="Path 61" d="M134.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.811,2.811,0,0,0,.349.035" transform="translate(7.202 -9.377)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_62" data-name="Path 62" d="M143.232,42.33a2.967,2.967,0,0,1-.535-.055,2.754,2.754,0,0,1-.514-.153,2.838,2.838,0,0,1-.471-.251,4.139,4.139,0,0,1-.415-.339,3.2,3.2,0,0,1-.338-.415A2.7,2.7,0,0,1,140.5,39.6a2.968,2.968,0,0,1,.055-.535,3.152,3.152,0,0,1,.152-.514,2.874,2.874,0,0,1,.252-.47,2.633,2.633,0,0,1,.753-.754,2.837,2.837,0,0,1,.471-.251,2.753,2.753,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,4.019,4.019,0,0,1,.339.415,2.786,2.786,0,0,1,.251.47,2.864,2.864,0,0,1,.208,1.049,2.77,2.77,0,0,1-.8,1.934,4.139,4.139,0,0,1-.415.339,2.722,2.722,0,0,1-1.519.459m21.855-1.366a2.789,2.789,0,0,1-1.935-.8,4.162,4.162,0,0,1-.338-.415,2.7,2.7,0,0,1-.459-1.519,2.789,2.789,0,0,1,.8-1.934,4.139,4.139,0,0,1,.415-.339,2.838,2.838,0,0,1,.471-.251,2.752,2.752,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,2.79,2.79,0,0,1,.8,1.934,3.069,3.069,0,0,1-.055.535,2.779,2.779,0,0,1-.153.514,3.885,3.885,0,0,1-.251.47,4.02,4.02,0,0,1-.339.415,4.138,4.138,0,0,1-.415.339,2.722,2.722,0,0,1-1.519.459" transform="translate(9.753 -15.532)" fill-rule="evenodd"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 31 KiB

View file

@ -0,0 +1,170 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1041.277" height="554.141" viewBox="0 0 1041.277 554.141">
<title>Powered by React</title>
<g id="Group_24" data-name="Group 24" transform="translate(-440 -263)">
<g id="Group_23" data-name="Group 23" transform="translate(439.989 262.965)">
<path id="Path_299" data-name="Path 299" d="M1040.82,611.12q-1.74,3.75-3.47,7.4-2.7,5.67-5.33,11.12c-.78,1.61-1.56,3.19-2.32,4.77-8.6,17.57-16.63,33.11-23.45,45.89A73.21,73.21,0,0,1,942.44,719l-151.65,1.65h-1.6l-13,.14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107,1.16-95.51,1-11.11.12-69,.75H429l-44.75.48h-.48l-141.5,1.53-42.33.46a87.991,87.991,0,0,1-10.79-.54h0c-1.22-.14-2.44-.3-3.65-.49a87.38,87.38,0,0,1-51.29-27.54C116,678.37,102.75,655,93.85,629.64q-1.93-5.49-3.6-11.12C59.44,514.37,97,380,164.6,290.08q4.25-5.64,8.64-11l.07-.08c20.79-25.52,44.1-46.84,68.93-62,44-26.91,92.75-34.49,140.7-11.9,40.57,19.12,78.45,28.11,115.17,30.55,3.71.24,7.42.42,11.11.53,84.23,2.65,163.17-27.7,255.87-47.29,3.69-.78,7.39-1.55,11.12-2.28,66.13-13.16,139.49-20.1,226.73-5.51a189.089,189.089,0,0,1,26.76,6.4q5.77,1.86,11.12,4c41.64,16.94,64.35,48.24,74,87.46q1.37,5.46,2.37,11.11C1134.3,384.41,1084.19,518.23,1040.82,611.12Z" transform="translate(-79.34 -172.91)" fill="#f2f2f2"/>
<path id="Path_300" data-name="Path 300" d="M576.36,618.52a95.21,95.21,0,0,1-1.87,11.12h93.7V618.52Zm-78.25,62.81,11.11-.09V653.77c-3.81-.17-7.52-.34-11.11-.52ZM265.19,618.52v11.12h198.5V618.52ZM1114.87,279h-74V191.51q-5.35-2.17-11.12-4V279H776.21V186.58c-3.73.73-7.43,1.5-11.12,2.28V279H509.22V236.15c-3.69-.11-7.4-.29-11.11-.53V279H242.24V217c-24.83,15.16-48.14,36.48-68.93,62h-.07v.08q-4.4,5.4-8.64,11h8.64V618.52h-83q1.66,5.63,3.6,11.12h79.39v93.62a87,87,0,0,0,12.2,2.79c1.21.19,2.43.35,3.65.49h0a87.991,87.991,0,0,0,10.79.54l42.33-.46v-97H498.11v94.21l11.11-.12V629.64H765.09V721l11.12-.12V629.64H1029.7v4.77c.76-1.58,1.54-3.16,2.32-4.77q2.63-5.45,5.33-11.12,1.73-3.64,3.47-7.4v-321h76.42Q1116.23,284.43,1114.87,279ZM242.24,618.52V290.08H498.11V618.52Zm267,0V290.08H765.09V618.52Zm520.48,0H776.21V290.08H1029.7Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_301" data-name="Path 301" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" fill="#65617d"/>
<path id="Path_302" data-name="Path 302" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" opacity="0.2"/>
<path id="Path_303" data-name="Path 303" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<path id="Path_304" data-name="Path 304" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_305" data-name="Path 305" d="M377.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<rect id="Rectangle_137" data-name="Rectangle 137" width="47.17" height="31.5" transform="translate(680.92 483.65)" fill="#3f3d56"/>
<rect id="Rectangle_138" data-name="Rectangle 138" width="47.17" height="31.5" transform="translate(680.92 483.65)" opacity="0.1"/>
<rect id="Rectangle_139" data-name="Rectangle 139" width="47.17" height="31.5" transform="translate(678.92 483.65)" fill="#3f3d56"/>
<path id="Path_306" data-name="Path 306" d="M298.09,483.65v4.97l-47.17,1.26v-6.23Z" opacity="0.1"/>
<path id="Path_307" data-name="Path 307" d="M460.69,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6a4,4,0,0,1,3.95,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_308" data-name="Path 308" d="M265.19,481.32v181.2h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_309" data-name="Path 309" d="M194.59,319.15h177.5V467.4l-177.5,4Z" fill="#39374d"/>
<path id="Path_310" data-name="Path 310" d="M726.09,483.65v6.41l-47.17-1.26v-5.15Z" opacity="0.1"/>
<path id="Path_311" data-name="Path 311" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0L672,657.42a4,4,0,0,1-3.85-3.95V485.27a4,4,0,0,1,3.95-3.95H863.7a4,4,0,0,1,3.99,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_312" data-name="Path 312" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0V481.32h0a4,4,0,0,1,4,3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_313" data-name="Path 313" d="M775.59,319.15H598.09V467.4l177.5,4Z" fill="#39374d"/>
<path id="Path_314" data-name="Path 314" d="M663.19,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h0a4,4,0,0,1-4-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6A4,4,0,0,1,663.19,485.27Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_315" data-name="Path 315" d="M397.09,319.15h177.5V467.4l-177.5,4Z" fill="#4267b2"/>
<path id="Path_316" data-name="Path 316" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5,4.4-.02.98-.01Z" opacity="0.1"/>
<circle id="Ellipse_111" data-name="Ellipse 111" cx="51.33" cy="51.33" r="51.33" transform="translate(435.93 246.82)" fill="#fbbebe"/>
<path id="Path_317" data-name="Path 317" d="M617.94,550.07s-99.5,12-90,0c3.44-4.34,4.39-17.2,4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41,77-8.5c-4,13.13-2.69,31.57.35,48.88.89,5.05,1.92,10,3,14.7a344.66,344.66,0,0,0,9.65,33.92Z" transform="translate(-79.34 -172.91)" fill="#fbbebe"/>
<path id="Path_318" data-name="Path 318" d="M585.47,546c11.51-2.13,23.7-6,34.53-1.54,2.85,1.17,5.47,2.88,8.39,3.86s6.12,1.22,9.16,1.91c10.68,2.42,19.34,10.55,24.9,20s8.44,20.14,11.26,30.72l6.9,25.83c6,22.45,12,45.09,13.39,68.3a2437.506,2437.506,0,0,1-250.84,1.43c5.44-10.34,11-21.31,10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34,6.57-13.39,9.64-20.22,8.75-19.52,1.94-45.79,17.32-60.65,6.92-6.68,17-9.21,26.63-8.89,12.28.41,24.85,4.24,37,6.11C555.09,547.48,569.79,548.88,585.47,546Z" transform="translate(-79.34 -172.91)" fill="#ff6584"/>
<path id="Path_319" data-name="Path 319" d="M716.37,657.17l-.1,1.43v.1l-.17,2.3-1.33,18.51-1.61,22.3-.46,6.28-1,13.44v.17l-107,1-175.59,1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53,10.53,0,0,1,11.42-10.17c4.72.4,10.85.89,18.18,1.41l3,.22c42.33,2.94,120.56,6.74,199.5,2,1.66-.09,3.33-.19,5-.31,12.24-.77,24.47-1.76,36.58-3a10.53,10.53,0,0,1,11.6,11.23Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_320" data-name="Path 320" d="M429.08,725.44v-.84l175.62-1.91,107-1h.3v-.17l1-13.44.43-6,1.64-22.61,1.29-17.9v-.44a10.617,10.617,0,0,0-.11-2.47.3.3,0,0,0,0-.1,10.391,10.391,0,0,0-2-4.64,10.54,10.54,0,0,0-9.42-4c-12.11,1.24-24.34,2.23-36.58,3-1.67.12-3.34.22-5,.31-78.94,4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54,10.54,0,0,0-11.24,8.53,11,11,0,0,0-.18,1.64l-.68,22.16L429.54,710l-.44,14.36v1.12Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<path id="Path_321" data-name="Path 321" d="M716.67,664.18l-1.23,15.33-1.83,22.85-.46,5.72-1,12.81-.06.64v.17h0l-.15,1.48.11-1.48h-.29l-107,1-175.65,1.9v-.28l.49-14.36,1-28.06.64-18.65A6.36,6.36,0,0,1,434.3,658a6.25,6.25,0,0,1,3.78-.9c2.1.17,4.68.37,7.69.59,4.89.36,10.92.78,17.94,1.22,13,.82,29.31,1.7,48,2.42,52,2,122.2,2.67,188.88-3.17,3-.26,6.1-.55,9.13-.84a6.26,6.26,0,0,1,3.48.66,5.159,5.159,0,0,1,.86.54,6.14,6.14,0,0,1,2,2.46,3.564,3.564,0,0,1,.25.61A6.279,6.279,0,0,1,716.67,664.18Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_322" data-name="Path 322" d="M377.44,677.87v3.19a6.13,6.13,0,0,1-3.5,5.54l-40.1.77a6.12,6.12,0,0,1-3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_323" data-name="Path 323" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
<path id="Path_324" data-name="Path 324" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" opacity="0.1"/>
<path id="Path_325" data-name="Path 325" d="M300.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
<path id="Path_326" data-name="Path 326" d="M758.56,679.87v3.19a6.13,6.13,0,0,0,3.5,5.54l40.1.77a6.12,6.12,0,0,0,3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_327" data-name="Path 327" d="M678.72,517.57l52.25,1V509.9l-52.25-1Z" opacity="0.1"/>
<path id="Path_328" data-name="Path 328" d="M676.72,517.57l52.25,1V509.9l-52.25-1Z" fill="#3f3d56"/>
<path id="Path_329" data-name="Path 329" d="M534.13,486.79c.08,7-3.16,13.6-5.91,20.07a163.491,163.491,0,0,0-12.66,74.71c.73,11,2.58,22,.73,32.9s-8.43,21.77-19,24.9c17.53,10.45,41.26,9.35,57.76-2.66,8.79-6.4,15.34-15.33,21.75-24.11a97.86,97.86,0,0,1-13.31,44.75A103.43,103.43,0,0,0,637,616.53c4.31-5.81,8.06-12.19,9.72-19.23,3.09-13-1.22-26.51-4.51-39.5a266.055,266.055,0,0,1-6.17-33c-.43-3.56-.78-7.22.1-10.7,1-4.07,3.67-7.51,5.64-11.22,5.6-10.54,5.73-23.3,2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47,1.48-16.14,8.32-22,15.34-4.59,5.46-15.81,15.71-16.6,22.86-.72,6.59,5.1,17.63,6.09,24.58,1.3,9,2.22,6,7.3,11.52C532,478.05,534.07,482,534.13,486.79Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
</g>
<g id="docusaurus_keytar" transform="translate(670.271 615.768)">
<path id="Path_40" data-name="Path 40" d="M99,52h43.635V69.662H99Z" transform="translate(-49.132 -33.936)" fill="#fff" fill-rule="evenodd"/>
<path id="Path_41" data-name="Path 41" d="M13.389,158.195A10.377,10.377,0,0,1,4.4,153a10.377,10.377,0,0,0,8.988,15.584H23.779V158.195Z" transform="translate(-3 -82.47)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_42" data-name="Path 42" d="M66.967,38.083l36.373-2.273V30.615A10.389,10.389,0,0,0,92.95,20.226H46.2l-1.3-2.249a1.5,1.5,0,0,0-2.6,0L41,20.226l-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-.034,0-2.152-2.151a1.5,1.5,0,0,0-2.508.672L25.21,21.4l-2.7-.723a1.5,1.5,0,0,0-1.836,1.837l.722,2.7-2.65.71a1.5,1.5,0,0,0-.673,2.509l2.152,2.152c0,.011,0,.022,0,.033l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6L20.226,41l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3A10.389,10.389,0,0,0,30.615,103.34H92.95A10.389,10.389,0,0,0,103.34,92.95V51.393L66.967,49.12a5.53,5.53,0,0,1,0-11.038" transform="translate(-9.836 -17.226)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_43" data-name="Path 43" d="M143,163.779h15.584V143H143Z" transform="translate(-70.275 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_44" data-name="Path 44" d="M173.779,148.389a2.582,2.582,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-75.08 -75.262)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_45" data-name="Path 45" d="M153,113.389h15.584V103H153Z" transform="translate(-75.08 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_46" data-name="Path 46" d="M183.389,108.944a1.3,1.3,0,1,0,0-2.6,1.336,1.336,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.337,1.337,0,0,0,.166.017" transform="translate(-84.691 -57.894)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_47" data-name="Path 47" d="M52.188,48.292a1.3,1.3,0,0,1-1.3-1.3,3.9,3.9,0,0,0-7.792,0,1.3,1.3,0,1,1-2.6,0,6.493,6.493,0,0,1,12.987,0,1.3,1.3,0,0,1-1.3,1.3" transform="translate(-21.02 -28.41)" fill-rule="evenodd"/>
<path id="Path_48" data-name="Path 48" d="M103,139.752h31.168a10.389,10.389,0,0,0,10.389-10.389V93H113.389A10.389,10.389,0,0,0,103,103.389Z" transform="translate(-51.054 -53.638)" fill="#ffff50" fill-rule="evenodd"/>
<path id="Path_49" data-name="Path 49" d="M141.1,94.017H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0-25.877H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.293H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m7.782-47.993c-.006,0-.011,0-.018,0-1.605.055-2.365,1.66-3.035,3.077-.7,1.48-1.24,2.443-2.126,2.414-.981-.035-1.542-1.144-2.137-2.317-.683-1.347-1.462-2.876-3.1-2.819-1.582.054-2.344,1.451-3.017,2.684-.715,1.313-1.2,2.112-2.141,2.075-1-.036-1.533-.938-2.149-1.981-.686-1.162-1.479-2.467-3.084-2.423-1.555.053-2.319,1.239-2.994,2.286-.713,1.106-1.213,1.781-2.164,1.741-1.025-.036-1.554-.784-2.167-1.65-.688-.973-1.463-2.074-3.062-2.021a3.815,3.815,0,0,0-2.959,1.879c-.64.812-1.14,1.456-2.2,1.415a.52.52,0,0,0-.037,1.039,3.588,3.588,0,0,0,3.05-1.811c.611-.777,1.139-1.448,2.178-1.483,1-.043,1.47.579,2.179,1.582.674.953,1.438,2.033,2.977,2.089,1.612.054,2.387-1.151,3.074-2.217.614-.953,1.144-1.775,2.156-1.81.931-.035,1.438.7,2.153,1.912.674,1.141,1.437,2.434,3.006,2.491,1.623.056,2.407-1.361,3.09-2.616.592-1.085,1.15-2.109,2.14-2.143.931-.022,1.417.829,2.135,2.249.671,1.326,1.432,2.828,3.026,2.886l.088,0c1.592,0,2.347-1.6,3.015-3.01.592-1.252,1.152-2.431,2.113-2.479Z" transform="translate(-55.378 -38.552)" fill-rule="evenodd"/>
<path id="Path_50" data-name="Path 50" d="M83,163.779h20.779V143H83Z" transform="translate(-41.443 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
<g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 51.971, 43.3)">
<rect id="Rectangle_3" data-name="Rectangle 3" width="43.906" height="17.333" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
<g id="Group_2" data-name="Group 2" transform="translate(0.728 10.948)">
<rect id="Rectangle_4" data-name="Rectangle 4" width="2.537" height="2.537" rx="1" transform="translate(7.985 0)" fill="#4a4a4a"/>
<rect id="Rectangle_5" data-name="Rectangle 5" width="2.537" height="2.537" rx="1" transform="translate(10.991 0)" fill="#4a4a4a"/>
<rect id="Rectangle_6" data-name="Rectangle 6" width="2.537" height="2.537" rx="1" transform="translate(13.997 0)" fill="#4a4a4a"/>
<rect id="Rectangle_7" data-name="Rectangle 7" width="2.537" height="2.537" rx="1" transform="translate(17.003 0)" fill="#4a4a4a"/>
<rect id="Rectangle_8" data-name="Rectangle 8" width="2.537" height="2.537" rx="1" transform="translate(20.009 0)" fill="#4a4a4a"/>
<rect id="Rectangle_9" data-name="Rectangle 9" width="2.537" height="2.537" rx="1" transform="translate(23.015 0)" fill="#4a4a4a"/>
<rect id="Rectangle_10" data-name="Rectangle 10" width="2.537" height="2.537" rx="1" transform="translate(26.021 0)" fill="#4a4a4a"/>
<rect id="Rectangle_11" data-name="Rectangle 11" width="2.537" height="2.537" rx="1" transform="translate(29.028 0)" fill="#4a4a4a"/>
<rect id="Rectangle_12" data-name="Rectangle 12" width="2.537" height="2.537" rx="1" transform="translate(32.034 0)" fill="#4a4a4a"/>
<path id="Path_51" data-name="Path 51" d="M.519,0H6.9A.519.519,0,0,1,7.421.52v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0ZM35.653,0h6.383a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H35.652a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,35.652,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_3" data-name="Group 3" transform="translate(0.728 4.878)">
<path id="Path_52" data-name="Path 52" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_13" data-name="Rectangle 13" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_14" data-name="Rectangle 14" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_15" data-name="Rectangle 15" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_16" data-name="Rectangle 16" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_17" data-name="Rectangle 17" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_18" data-name="Rectangle 18" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_19" data-name="Rectangle 19" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_20" data-name="Rectangle 20" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_21" data-name="Rectangle 21" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_22" data-name="Rectangle 22" width="2.537" height="2.537" rx="1" transform="translate(31 0)" fill="#4a4a4a"/>
<rect id="Rectangle_23" data-name="Rectangle 23" width="2.537" height="2.537" rx="1" transform="translate(34.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_24" data-name="Rectangle 24" width="2.537" height="2.537" rx="1" transform="translate(37.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_25" data-name="Rectangle 25" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
</g>
<g id="Group_4" data-name="Group 4" transform="translate(43.283 4.538) rotate(180)">
<path id="Path_53" data-name="Path 53" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_26" data-name="Rectangle 26" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_27" data-name="Rectangle 27" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_28" data-name="Rectangle 28" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_29" data-name="Rectangle 29" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_30" data-name="Rectangle 30" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_31" data-name="Rectangle 31" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_32" data-name="Rectangle 32" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_33" data-name="Rectangle 33" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_34" data-name="Rectangle 34" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_35" data-name="Rectangle 35" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
<rect id="Rectangle_36" data-name="Rectangle 36" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
<rect id="Rectangle_37" data-name="Rectangle 37" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
<rect id="Rectangle_38" data-name="Rectangle 38" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
<rect id="Rectangle_39" data-name="Rectangle 39" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_40" data-name="Rectangle 40" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_41" data-name="Rectangle 41" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_42" data-name="Rectangle 42" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_43" data-name="Rectangle 43" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_44" data-name="Rectangle 44" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_45" data-name="Rectangle 45" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_46" data-name="Rectangle 46" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_47" data-name="Rectangle 47" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_48" data-name="Rectangle 48" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
<rect id="Rectangle_49" data-name="Rectangle 49" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
<rect id="Rectangle_50" data-name="Rectangle 50" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
<rect id="Rectangle_51" data-name="Rectangle 51" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
</g>
<g id="Group_6" data-name="Group 6" transform="translate(0.728 7.883)">
<path id="Path_54" data-name="Path 54" d="M.519,0h3.47a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<g id="Group_5" data-name="Group 5" transform="translate(5.073 0)">
<rect id="Rectangle_52" data-name="Rectangle 52" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_53" data-name="Rectangle 53" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_54" data-name="Rectangle 54" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_55" data-name="Rectangle 55" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
<rect id="Rectangle_56" data-name="Rectangle 56" width="2.537" height="2.537" rx="1" transform="translate(12.025 0)" fill="#4a4a4a"/>
<rect id="Rectangle_57" data-name="Rectangle 57" width="2.537" height="2.537" rx="1" transform="translate(15.031 0)" fill="#4a4a4a"/>
<rect id="Rectangle_58" data-name="Rectangle 58" width="2.537" height="2.537" rx="1" transform="translate(18.037 0)" fill="#4a4a4a"/>
<rect id="Rectangle_59" data-name="Rectangle 59" width="2.537" height="2.537" rx="1" transform="translate(21.042 0)" fill="#4a4a4a"/>
<rect id="Rectangle_60" data-name="Rectangle 60" width="2.537" height="2.537" rx="1" transform="translate(24.049 0)" fill="#4a4a4a"/>
<rect id="Rectangle_61" data-name="Rectangle 61" width="2.537" height="2.537" rx="1" transform="translate(27.055 0)" fill="#4a4a4a"/>
<rect id="Rectangle_62" data-name="Rectangle 62" width="2.537" height="2.537" rx="1" transform="translate(30.061 0)" fill="#4a4a4a"/>
</g>
<path id="Path_55" data-name="Path 55" d="M.52,0H3.8a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(38.234 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_7" data-name="Group 7" transform="translate(0.728 14.084)">
<rect id="Rectangle_63" data-name="Rectangle 63" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_64" data-name="Rectangle 64" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_65" data-name="Rectangle 65" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_66" data-name="Rectangle 66" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
<path id="Path_56" data-name="Path 56" d="M.519,0H14.981A.519.519,0,0,1,15.5.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.018V.519A.519.519,0,0,1,.519,0Zm15.97,0h1.874a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H16.489a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,16.489,0Z" transform="translate(12.024 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_67" data-name="Rectangle 67" width="2.537" height="2.537" rx="1" transform="translate(31.376 0)" fill="#4a4a4a"/>
<rect id="Rectangle_68" data-name="Rectangle 68" width="2.537" height="2.537" rx="1" transform="translate(34.382 0)" fill="#4a4a4a"/>
<rect id="Rectangle_69" data-name="Rectangle 69" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
<path id="Path_57" data-name="Path 57" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(39.736 1.08) rotate(180)" fill="#4a4a4a"/>
<path id="Path_58" data-name="Path 58" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(37.2 1.456)" fill="#4a4a4a"/>
</g>
<rect id="Rectangle_70" data-name="Rectangle 70" width="42.273" height="1.127" rx="0.564" transform="translate(0.915 0.556)" fill="#4a4a4a"/>
<rect id="Rectangle_71" data-name="Rectangle 71" width="2.37" height="0.752" rx="0.376" transform="translate(1.949 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_72" data-name="Rectangle 72" width="2.37" height="0.752" rx="0.376" transform="translate(5.193 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_73" data-name="Rectangle 73" width="2.37" height="0.752" rx="0.376" transform="translate(7.688 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_74" data-name="Rectangle 74" width="2.37" height="0.752" rx="0.376" transform="translate(10.183 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_75" data-name="Rectangle 75" width="2.37" height="0.752" rx="0.376" transform="translate(12.679 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_76" data-name="Rectangle 76" width="2.37" height="0.752" rx="0.376" transform="translate(15.797 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_77" data-name="Rectangle 77" width="2.37" height="0.752" rx="0.376" transform="translate(18.292 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_78" data-name="Rectangle 78" width="2.37" height="0.752" rx="0.376" transform="translate(20.788 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_79" data-name="Rectangle 79" width="2.37" height="0.752" rx="0.376" transform="translate(23.283 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_80" data-name="Rectangle 80" width="2.37" height="0.752" rx="0.376" transform="translate(26.402 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_81" data-name="Rectangle 81" width="2.37" height="0.752" rx="0.376" transform="translate(28.897 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_82" data-name="Rectangle 82" width="2.37" height="0.752" rx="0.376" transform="translate(31.393 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_83" data-name="Rectangle 83" width="2.37" height="0.752" rx="0.376" transform="translate(34.512 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_84" data-name="Rectangle 84" width="2.37" height="0.752" rx="0.376" transform="translate(37.007 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_85" data-name="Rectangle 85" width="2.37" height="0.752" rx="0.376" transform="translate(39.502 0.744)" fill="#d8d8d8" opacity="0.136"/>
</g>
<path id="Path_59" data-name="Path 59" d="M123.779,148.389a2.583,2.583,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-51.054 -75.262)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_60" data-name="Path 60" d="M83,113.389h20.779V103H83Z" transform="translate(-41.443 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_61" data-name="Path 61" d="M123.389,108.944a1.3,1.3,0,1,0,0-2.6,1.338,1.338,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.335,1.335,0,0,0,.166.017" transform="translate(-55.859 -57.894)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_62" data-name="Path 62" d="M141.8,38.745a1.41,1.41,0,0,1-.255-.026,1.309,1.309,0,0,1-.244-.073,1.349,1.349,0,0,1-.224-.119,1.967,1.967,0,0,1-.2-.161,1.52,1.52,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.41,1.41,0,0,1,.026-.255,1.5,1.5,0,0,1,.072-.244,1.364,1.364,0,0,1,.12-.223,1.252,1.252,0,0,1,.358-.358,1.349,1.349,0,0,1,.224-.119,1.309,1.309,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.968,1.968,0,0,1,.2.161,1.908,1.908,0,0,1,.161.2,1.322,1.322,0,0,1,.12.223,1.361,1.361,0,0,1,.1.5,1.317,1.317,0,0,1-.379.919,1.968,1.968,0,0,1-.2.161,1.346,1.346,0,0,1-.223.119,1.332,1.332,0,0,1-.5.1m10.389-.649a1.326,1.326,0,0,1-.92-.379,1.979,1.979,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.326,1.326,0,0,1,.379-.919,1.967,1.967,0,0,1,.2-.161,1.351,1.351,0,0,1,.224-.119,1.308,1.308,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.967,1.967,0,0,1,.2.161,1.326,1.326,0,0,1,.379.919,1.461,1.461,0,0,1-.026.255,1.323,1.323,0,0,1-.073.244,1.847,1.847,0,0,1-.119.223,1.911,1.911,0,0,1-.161.2,1.967,1.967,0,0,1-.2.161,1.294,1.294,0,0,1-.722.218" transform="translate(-69.074 -26.006)" fill-rule="evenodd"/>
</g>
<g id="React-icon" transform="translate(906.3 541.56)">
<path id="Path_330" data-name="Path 330" d="M263.668,117.179c0-5.827-7.3-11.35-18.487-14.775,2.582-11.4,1.434-20.477-3.622-23.382a7.861,7.861,0,0,0-4.016-1v4a4.152,4.152,0,0,1,2.044.466c2.439,1.4,3.5,6.724,2.672,13.574-.2,1.685-.52,3.461-.914,5.272a86.9,86.9,0,0,0-11.386-1.954,87.469,87.469,0,0,0-7.459-8.965c5.845-5.433,11.332-8.41,15.062-8.41V78h0c-4.931,0-11.386,3.514-17.913,9.611-6.527-6.061-12.982-9.539-17.913-9.539v4c3.712,0,9.216,2.959,15.062,8.356a84.687,84.687,0,0,0-7.405,8.947,83.732,83.732,0,0,0-11.4,1.972c-.412-1.793-.717-3.532-.932-5.2-.843-6.85.2-12.175,2.618-13.592a3.991,3.991,0,0,1,2.062-.466v-4h0a8,8,0,0,0-4.052,1c-5.039,2.9-6.168,11.96-3.568,23.328-11.153,3.443-18.415,8.947-18.415,14.757,0,5.828,7.3,11.35,18.487,14.775-2.582,11.4-1.434,20.477,3.622,23.382a7.882,7.882,0,0,0,4.034,1c4.931,0,11.386-3.514,17.913-9.611,6.527,6.061,12.982,9.539,17.913,9.539a8,8,0,0,0,4.052-1c5.039-2.9,6.168-11.96,3.568-23.328C256.406,128.511,263.668,122.988,263.668,117.179Zm-23.346-11.96c-.663,2.313-1.488,4.7-2.421,7.083-.735-1.434-1.506-2.869-2.349-4.3-.825-1.434-1.7-2.833-2.582-4.2C235.517,104.179,237.974,104.645,240.323,105.219Zm-8.212,19.1c-1.4,2.421-2.833,4.716-4.321,6.85-2.672.233-5.379.359-8.1.359-2.708,0-5.415-.126-8.069-.341q-2.232-3.2-4.339-6.814-2.044-3.523-3.73-7.136c1.112-2.4,2.367-4.805,3.712-7.154,1.4-2.421,2.833-4.716,4.321-6.85,2.672-.233,5.379-.359,8.1-.359,2.708,0,5.415.126,8.069.341q2.232,3.2,4.339,6.814,2.044,3.523,3.73,7.136C234.692,119.564,233.455,121.966,232.11,124.315Zm5.792-2.331c.968,2.4,1.793,4.805,2.474,7.136-2.349.574-4.823,1.058-7.387,1.434.879-1.381,1.757-2.8,2.582-4.25C236.4,124.871,237.167,123.419,237.9,121.984ZM219.72,141.116a73.921,73.921,0,0,1-4.985-5.738c1.614.072,3.263.126,4.931.126,1.685,0,3.353-.036,4.985-.126A69.993,69.993,0,0,1,219.72,141.116ZM206.38,130.555c-2.546-.377-5-.843-7.352-1.417.663-2.313,1.488-4.7,2.421-7.083.735,1.434,1.506,2.869,2.349,4.3S205.5,129.192,206.38,130.555ZM219.63,93.241a73.924,73.924,0,0,1,4.985,5.738c-1.614-.072-3.263-.126-4.931-.126-1.686,0-3.353.036-4.985.126A69.993,69.993,0,0,1,219.63,93.241ZM206.362,103.8c-.879,1.381-1.757,2.8-2.582,4.25-.825,1.434-1.6,2.869-2.331,4.3-.968-2.4-1.793-4.805-2.474-7.136C201.323,104.663,203.8,104.179,206.362,103.8Zm-16.227,22.449c-6.348-2.708-10.454-6.258-10.454-9.073s4.106-6.383,10.454-9.073c1.542-.663,3.228-1.255,4.967-1.811a86.122,86.122,0,0,0,4.034,10.92,84.9,84.9,0,0,0-3.981,10.866C193.38,127.525,191.694,126.915,190.134,126.252Zm9.647,25.623c-2.439-1.4-3.5-6.724-2.672-13.574.2-1.686.52-3.461.914-5.272a86.9,86.9,0,0,0,11.386,1.954,87.465,87.465,0,0,0,7.459,8.965c-5.845,5.433-11.332,8.41-15.062,8.41A4.279,4.279,0,0,1,199.781,151.875Zm42.532-13.663c.843,6.85-.2,12.175-2.618,13.592a3.99,3.99,0,0,1-2.062.466c-3.712,0-9.216-2.959-15.062-8.356a84.689,84.689,0,0,0,7.405-8.947,83.731,83.731,0,0,0,11.4-1.972A50.194,50.194,0,0,1,242.313,138.212Zm6.9-11.96c-1.542.663-3.228,1.255-4.967,1.811a86.12,86.12,0,0,0-4.034-10.92,84.9,84.9,0,0,0,3.981-10.866c1.775.556,3.461,1.165,5.039,1.829,6.348,2.708,10.454,6.258,10.454,9.073C259.67,119.994,255.564,123.562,249.216,126.252Z" fill="#61dafb"/>
<path id="Path_331" data-name="Path 331" d="M320.8,78.4Z" transform="translate(-119.082 -0.328)" fill="#61dafb"/>
<circle id="Ellipse_112" data-name="Ellipse 112" cx="8.194" cy="8.194" r="8.194" transform="translate(211.472 108.984)" fill="#61dafb"/>
<path id="Path_332" data-name="Path 332" d="M520.5,78.1Z" transform="translate(-282.975 -0.082)" fill="#61dafb"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 35 KiB

View file

@ -0,0 +1,40 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1129" height="663" viewBox="0 0 1129 663">
<title>Focus on What Matters</title>
<circle cx="321" cy="321" r="321" fill="#f2f2f2" />
<ellipse cx="559" cy="635.49998" rx="514" ry="27.50002" fill="#3f3d56" />
<ellipse cx="558" cy="627" rx="460" ry="22" opacity="0.2" />
<rect x="131" y="152.5" width="840" height="50" fill="#3f3d56" />
<path d="M166.5,727.3299A21.67009,21.67009,0,0,0,188.1701,749H984.8299A21.67009,21.67009,0,0,0,1006.5,727.3299V296h-840Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" opacity="0.2" />
<circle cx="181" cy="147.5" r="13" fill="#3f3d56" />
<circle cx="217" cy="147.5" r="13" fill="#3f3d56" />
<circle cx="253" cy="147.5" r="13" fill="#3f3d56" />
<rect x="168" y="213.5" width="337" height="386" rx="5.33505" fill="#606060" />
<rect x="603" y="272.5" width="284" height="22" rx="5.47638" fill="#2e8555" />
<rect x="537" y="352.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="396.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="440.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="484.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="865" y="552.5" width="88" height="26" rx="7.02756" fill="#3ecc5f" />
<path d="M1088.60287,624.61594a30.11371,30.11371,0,0,0,3.98291-15.266c0-13.79652-8.54358-24.98081-19.08256-24.98081s-19.08256,11.18429-19.08256,24.98081a30.11411,30.11411,0,0,0,3.98291,15.266,31.248,31.248,0,0,0,0,30.53213,31.248,31.248,0,0,0,0,30.53208,31.248,31.248,0,0,0,0,30.53208,30.11408,30.11408,0,0,0-3.98291,15.266c0,13.79652,8.54353,24.98081,19.08256,24.98081s19.08256-11.18429,19.08256-24.98081a30.11368,30.11368,0,0,0-3.98291-15.266,31.248,31.248,0,0,0,0-30.53208,31.248,31.248,0,0,0,0-30.53208,31.248,31.248,0,0,0,0-30.53213Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<ellipse cx="1038.00321" cy="460.31783" rx="19.08256" ry="24.9808" fill="#3f3d56" />
<ellipse cx="1038.00321" cy="429.78574" rx="19.08256" ry="24.9808" fill="#3f3d56" />
<path d="M1144.93871,339.34489a91.61081,91.61081,0,0,0,7.10658-10.46092l-50.141-8.23491,54.22885.4033a91.566,91.566,0,0,0,1.74556-72.42605l-72.75449,37.74139,67.09658-49.32086a91.41255,91.41255,0,1,0-150.971,102.29805,91.45842,91.45842,0,0,0-10.42451,16.66946l65.0866,33.81447-69.40046-23.292a91.46011,91.46011,0,0,0,14.73837,85.83669,91.40575,91.40575,0,1,0,143.68892,0,91.41808,91.41808,0,0,0,0-113.02862Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M981.6885,395.8592a91.01343,91.01343,0,0,0,19.56129,56.51431,91.40575,91.40575,0,1,0,143.68892,0C1157.18982,436.82067,981.6885,385.60008,981.6885,395.8592Z" transform="translate(-35.5 -118.5)" opacity="0.1" />
<path d="M365.62,461.43628H477.094v45.12043H365.62Z" transform="translate(-35.5 -118.5)" fill="#fff" fill-rule="evenodd" />
<path d="M264.76252,608.74122a26.50931,26.50931,0,0,1-22.96231-13.27072,26.50976,26.50976,0,0,0,22.96231,39.81215H291.304V608.74122Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M384.17242,468.57061l92.92155-5.80726V449.49263a26.54091,26.54091,0,0,0-26.54143-26.54143H331.1161l-3.31768-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622-3.31767-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622L301.257,417.205a3.83043,3.83043,0,0,0-6.63536,0L291.304,422.9512c-.02919,0-.05573.004-.08625.004l-5.49674-5.49541a3.8293,3.8293,0,0,0-6.4071,1.71723l-1.81676,6.77338L270.607,424.1031a3.82993,3.82993,0,0,0-4.6912,4.69253l1.84463,6.89148-6.77072,1.81411a3.8315,3.8315,0,0,0-1.71988,6.40975l5.49673,5.49673c0,.02787-.004.05574-.004.08493l-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74621,3.31768L259.0163,466.081a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31767a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31767a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768L259.0163,558.976a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768A26.54091,26.54091,0,0,0,291.304,635.28265H450.55254A26.5409,26.5409,0,0,0,477.094,608.74122V502.5755l-92.92155-5.80727a14.12639,14.12639,0,0,1,0-28.19762" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M424.01111,635.28265h39.81214V582.19979H424.01111Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M490.36468,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15393-.59852A6.62668,6.62668,0,1,0,482.80568,590.21q-.2203-.22491-.44457-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39414-.10218-.59056-.15262a6.63957,6.63957,0,1,0-13.10086,0c-.1964.05042-.39414.09687-.59056.15262a6.62767,6.62767,0,1,0-11.39688,6.56369,26.52754,26.52754,0,1,0,44.23127,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M437.28182,555.65836H477.094V529.11693H437.28182Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M490.36468,545.70532a3.31768,3.31768,0,0,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1.278-6.37923c.02786-.0982.05042-.19907.077-.29859a3.41325,3.41325,0,0,0,.42333.04246" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M317.84538,466.081a3.31768,3.31768,0,0,1-3.31767-3.31768,9.953,9.953,0,1,0-19.90608,0,3.31768,3.31768,0,1,1-6.63535,0,16.58839,16.58839,0,1,1,33.17678,0,3.31768,3.31768,0,0,1-3.31768,3.31768" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
<path d="M370.92825,635.28265h79.62429A26.5409,26.5409,0,0,0,477.094,608.74122v-92.895H397.46968a26.54091,26.54091,0,0,0-26.54143,26.54143Z" transform="translate(-35.5 -118.5)" fill="#ffff50" fill-rule="evenodd" />
<path d="M457.21444,556.98543H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0-66.10674H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.29459H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414M477.094,474.19076c-.01592,0-.0292-.008-.04512-.00663-4.10064.13934-6.04083,4.24132-7.75274,7.86024-1.78623,3.78215-3.16771,6.24122-5.43171,6.16691-2.50685-.09024-3.94007-2.92222-5.45825-5.91874-1.74377-3.44243-3.73438-7.34667-7.91333-7.20069-4.04227.138-5.98907,3.70784-7.70631,6.857-1.82738,3.35484-3.07084,5.39455-5.46887,5.30033-2.55727-.09289-3.91619-2.39536-5.48877-5.06013-1.75306-2.96733-3.77951-6.30359-7.8775-6.18946-3.97326.13669-5.92537,3.16507-7.64791,5.83912-1.82207,2.82666-3.09872,4.5492-5.52725,4.447-2.61832-.09289-3.9706-2.00388-5.53522-4.21611-1.757-2.4856-3.737-5.299-7.82308-5.16231-3.88567.13271-5.83779,2.61434-7.559,4.80135-1.635,2.07555-2.9116,3.71846-5.61218,3.615a1.32793,1.32793,0,1,0-.09555,2.65414c4.00377.134,6.03154-2.38873,7.79257-4.6275,1.562-1.9853,2.91027-3.69855,5.56441-3.78879,2.55594-.10882,3.75429,1.47968,5.56707,4.04093,1.7212,2.43385,3.67465,5.19416,7.60545,5.33616,4.11789.138,6.09921-2.93946,7.8536-5.66261,1.56861-2.43385,2.92221-4.53461,5.50734-4.62352,2.37944-.08892,3.67466,1.79154,5.50072,4.885,1.72121,2.91557,3.67069,6.21865,7.67977,6.36463,4.14709.14332,6.14965-3.47693,7.89475-6.68181,1.51155-2.77092,2.93814-5.38791,5.46621-5.4755,2.37944-.05573,3.62025,2.11668,5.45558,5.74622,1.71459,3.388,3.65875,7.22591,7.73019,7.37321l.22429.004c4.06614,0,5.99571-4.08074,7.70364-7.68905,1.51154-3.19825,2.94211-6.21069,5.3972-6.33411Z" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
<path d="M344.38682,635.28265h53.08286V582.19979H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M424.01111,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15394-.59852A6.62667,6.62667,0,1,0,416.45211,590.21q-.2203-.22491-.44458-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39413-.10218-.59054-.15262a6.63957,6.63957,0,1,0-13.10084,0c-.19641.05042-.39414.09687-.59055.15262a6.62767,6.62767,0,1,0-11.39689,6.56369,26.52755,26.52755,0,1,0,44.2313,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M344.38682,555.65836h53.08286V529.11693H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M410.74039,545.70532a3.31768,3.31768,0,1,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1.278-6.37923c.02786-.0982.05042-.19907.077-.29859a3.41325,3.41325,0,0,0,.42333.04246" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M424.01111,447.8338a3.60349,3.60349,0,0,1-.65028-.06636,3.34415,3.34415,0,0,1-.62372-.18579,3.44679,3.44679,0,0,1-.572-.30522,5.02708,5.02708,0,0,1-.50429-.4114,3.88726,3.88726,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.60248,3.60248,0,0,1,.06636-.65027,3.82638,3.82638,0,0,1,.18447-.62373,3.48858,3.48858,0,0,1,.30656-.57064,3.197,3.197,0,0,1,.91436-.91568,3.44685,3.44685,0,0,1,.572-.30523,3.344,3.344,0,0,1,.62372-.18578,3.06907,3.06907,0,0,1,1.30053,0,3.22332,3.22332,0,0,1,1.19436.491,5.02835,5.02835,0,0,1,.50429.41139,4.8801,4.8801,0,0,1,.41139.50429,3.38246,3.38246,0,0,1,.30522.57064,3.47806,3.47806,0,0,1,.25215,1.274A3.36394,3.36394,0,0,1,426.36,446.865a5.02708,5.02708,0,0,1-.50429.4114,3.3057,3.3057,0,0,1-1.84463.55737m26.54143-1.65884a3.38754,3.38754,0,0,1-2.35024-.96877,5.04185,5.04185,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.38659,3.38659,0,0,1,.96744-2.34892,5.02559,5.02559,0,0,1,.50429-.41139,3.44685,3.44685,0,0,1,.572-.30523,3.3432,3.3432,0,0,1,.62373-.18579,3.06952,3.06952,0,0,1,1.30052,0,3.22356,3.22356,0,0,1,1.19436.491,5.02559,5.02559,0,0,1,.50429.41139,3.38792,3.38792,0,0,1,.96876,2.34892,3.72635,3.72635,0,0,1-.06636.65026,3.37387,3.37387,0,0,1-.18579.62373,4.71469,4.71469,0,0,1-.30522.57064,4.8801,4.8801,0,0,1-.41139.50429,5.02559,5.02559,0,0,1-.50429.41139,3.30547,3.30547,0,0,1-1.84463.55737" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,8 @@
{
// This file is not used in compilation. It is here just for a nice editor experience.
"extends": "@docusaurus/tsconfig",
"compilerOptions": {
"baseUrl": "."
},
"exclude": [".docusaurus", "build"]
}

View file

@ -0,0 +1,32 @@
"""add metadata to memory_units
Revision ID: 4a8b3c5d6e7f
Revises: 217b2227771f
Create Date: 2025-11-21 10:00:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision: str = '4a8b3c5d6e7f'
down_revision: Union[str, Sequence[str], None] = '217b2227771f'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Add metadata column to memory_units table."""
op.add_column(
'memory_units',
sa.Column('metadata', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False)
)
def downgrade() -> None:
"""Remove metadata column from memory_units table."""
op.drop_column('memory_units', 'metadata')