Microsoft.KernelMemory.Core 0.78.241007.1

Prefix Reserved
This package has a SemVer 2.0.0 package version: 0.78.241007.1+2bc6547.
dotnet add package Microsoft.KernelMemory.Core --version 0.78.241007.1                
NuGet\Install-Package Microsoft.KernelMemory.Core -Version 0.78.241007.1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Microsoft.KernelMemory.Core" Version="0.78.241007.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Microsoft.KernelMemory.Core --version 0.78.241007.1                
#r "nuget: Microsoft.KernelMemory.Core, 0.78.241007.1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Microsoft.KernelMemory.Core as a Cake Addin
#addin nuget:?package=Microsoft.KernelMemory.Core&version=0.78.241007.1

// Install Microsoft.KernelMemory.Core as a Cake Tool
#tool nuget:?package=Microsoft.KernelMemory.Core&version=0.78.241007.1                

Kernel Memory

License: MIT Discord

This repository presents best practices and a reference implementation for Memory in specific AI and LLMs application scenarios. Please note that the code provided serves as a demonstration and is not an officially supported Microsoft offering.

Kernel Memory (KM) is a multi-modal AI Service specialized in the efficient indexing of datasets through custom continuous data hybrid pipelines, with support for Retrieval Augmented Generation (RAG), synthetic memory, prompt engineering, and custom semantic memory processing.

KM is available as a Web Service, as a Docker container, a Plugin for ChatGPT/Copilot/Semantic Kernel, and as a .NET library for embedded applications.

Utilizing advanced embeddings and LLMs, the system enables Natural Language querying for obtaining answers from the indexed data, complete with citations and links to the original sources.

Kernel Memory is designed for seamless integration as a Plugin with Semantic Kernel, Microsoft Copilot and ChatGPT.

image

Memory as a Service - Asynchronous API

Depending on your scenarios, you might want to run all the code remotely through an asynchronous and scalable service, or locally inside your process.

image

If you're importing small files, and use only .NET and can block the application process while importing documents, then local-in-process execution can be fine, using the MemoryServerless described below.

However, if you are in one of these scenarios:

  • My app is written in TypeScript, Java, Rust, or some other language
  • I'd just like a web service to import data and send questions to answer
  • I'm importing big documents that can require minutes to process, and I don't want to block the user interface
  • I need memory import to run independently, supporting failures and retry logic
  • I want to define custom pipelines mixing multiple languages like Python, TypeScript, etc

then you're likely looking for a Memory Service, and you can deploy Kernel Memory as a backend service, using the default ingestion logic, or your custom workflow including steps coded in Python/TypeScript/Java/etc., leveraging the asynchronous non-blocking memory encoding process, uploading documents and asking questions using the MemoryWebClient.

image

Here you can find a complete set of instruction about how to run the Kernel Memory service.

Kernel Memory on Azure

Kernel Memory can be deployed in various configurations, including as a Service in Azure. To learn more about deploying Kernel Memory in Azure, please refer to the Azure deployment guide. For detailed instructions on deploying to Azure, you can check the infrastructure documentation.

If you are already familiar with these resources, you can quickly deploy by clicking the following button.

Deploy to Azure

Embedded Memory Component (aka "serverless")

Kernel Memory works and scales at best when running as an asynchronous Web Service, allowing to ingest thousands of documents and information without blocking your app.

However, Kernel Memory can also run in serverless mode, embedding MemoryServerless class instance in .NET backend/console/desktop apps in synchronous mode. Each request is processed immediately, although calling clients are responsible for handling transient errors.

image

Importing documents into your Kernel Memory can be as simple as this:

var memory = new KernelMemoryBuilder()
    .WithOpenAIDefaults(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
    .Build<MemoryServerless>();

// Import a file
await memory.ImportDocumentAsync("meeting-transcript.docx", tags: new() { { "user", "Blake" } });

// Import multiple files and apply multiple tags
await memory.ImportDocumentAsync(new Document("file001")
    .AddFile("business-plan.docx")
    .AddFile("project-timeline.pdf")
    .AddTag("user", "Blake")
    .AddTag("collection", "business")
    .AddTag("collection", "plans")
    .AddTag("fiscalYear", "2023"));

Asking questions:

var answer1 = await memory.AskAsync("How many people attended the meeting?");

var answer2 = await memory.AskAsync("what's the project timeline?", filter: new MemoryFilter().ByTag("user", "Blake"));

The example leverages the default documents ingestion pipeline:

  1. Extract text: recognize the file format and extract the information
  2. Partition the text in small chunks, to optimize search
  3. Extract embedding using an LLM embedding generator
  4. Save embedding into a vector index such as Azure AI Search, Qdrant or other DBs.

In the example, memories are organized by users using tags, safeguarding private information. Furthermore, memories can be categorized and structured using tags, enabling efficient search and retrieval through faceted navigation.

Data lineage, citations, referencing sources:

All memories and answers are fully correlated to the data provided. When producing an answer, Kernel Memory includes all the information needed to verify its accuracy:

await memory.ImportFileAsync("NASA-news.pdf");

var answer = await memory.AskAsync("Any news from NASA about Orion?");

Console.WriteLine(answer.Result + "/n");

foreach (var x in answer.RelevantSources)
{
    Console.WriteLine($"  * {x.SourceName} -- {x.Partitions.First().LastUpdate:D}");
}

Yes, there is news from NASA about the Orion spacecraft. NASA has invited the media to see a new test version [......] For more information about the Artemis program, you can visit the NASA website.

  • NASA-news.pdf -- Tuesday, August 1, 2023

Kernel Memory (KM) and SK Semantic Memory (SM)

Kernel Memory (KM) is a service built on the feedback received and lessons learned from developing Semantic Kernel (SK) and Semantic Memory (SM). It provides several features that would otherwise have to be developed manually, such as storing files, extracting text from files, providing a framework to secure users' data, etc. The KM codebase is entirely in .NET, which eliminates the need to write and maintain features in multiple languages. As a service, KM can be used from any language, tool, or platform, e.g. browser extensions and ChatGPT assistants.

Semantic Memory (SM) is a library for C#, Python, and Java that wraps direct calls to databases and supports vector search. It was developed as part of the Semantic Kernel (SK) project and serves as the first public iteration of long-term memory. The core library is maintained in three languages, while the list of supported storage engines (known as "connectors") varies across languages.

Here's comparison table:

Feature Kernel Memory Semantic Memory
Runtime Memory as a Service Vector store library for .NET / Python / Java
Data formats Web pages, PDF, Images, Word, PowerPoint, Excel, Markdown, Text, JSON, HTML Text only
Search Cosine similarity, Hybrid search, Filters with AND/OR conditions Cosine similarity. Work in progress to support filters.
Language support Any language, command line tools, browser extensions, low-code/no-code apps, chatbots, assistants, etc. .NET, Python, Java
Storage engines Azure AI Search, Elasticsearch, MongoDB Atlas, Postgres+pgvector, Qdrant, Redis, SQL Server, In memory KNN, On disk KNN. Azure AI Search, Chroma, DuckDB, Kusto, Milvus, MongoDB, Pinecone, Postgres, Qdrant, Redis, SQLite, Weaviate
File storage Disk, Azure Blobs, AWS S3, MongoDB Atlas, In memory (volatile) -
RAG Yes, with sources lookup -
Summarization Yes -
OCR Yes via Azure Document Intelligence -
Security Filters Yes No
Large document ingestion Yes, including async processing using queues (Azure Queues, RabbitMQ, File based or In memory queues) -
Document storage Yes -
Custom storage schema some DBs Work in progress
Vector DBs with internal embedding Yes -
Concurrent write to multiple vector DBs Yes -
LLMs Azure OpenAI, OpenAI, Anthropic, Ollama, LLamaSharp, LM Studio, Semantic Kernel connectors Azure OpenAI, OpenAI, Gemini, Hugging Face, ONNX, custom ones, etc.
LLMs with dedicated tokenization Yes No
Cloud deployment Yes -
Web service with OpenAPI Yes -

Quick test using the Docker image

If you want to give the service a quick test, use the following command to start the Kernel Memory Service using OpenAI:

docker run -e OPENAI_API_KEY="..." -it --rm -p 9001:9001 kernelmemory/service

on Linux ARM/MacOS

docker run -e OPENAI_API_KEY="..." -it --rm -p 9001:9001 kernelmemory/service:latest-arm64

If you prefer using custom settings and services such as Azure OpenAI, Azure Document Intelligence, etc., you should create an appsettings.Development.json file overriding the default values set in appsettings.json, or using the configuration wizard included:

cd service/Service
dotnet run setup

Then run this command to start the Docker image with the configuration just created:

on Windows:

docker run --volume .\appsettings.Development.json:/app/appsettings.Production.json -it --rm -p 9001:9001 kernelmemory/service

on Linux (AMD64):

docker run --volume ./appsettings.Development.json:/app/appsettings.Production.json -it --rm -p 9001:9001 kernelmemory/service

on ARM64 / macOS:

docker run --volume ./appsettings.Development.json:/app/appsettings.Production.json -it --rm -p 9001:9001 kernelmemory/service:latest-arm64

Import files using KM web service and MemoryWebClient

#reference clients/WebClient/WebClient.csproj

var memory = new MemoryWebClient("http://127.0.0.1:9001"); // <== URL where the web service is running

// Import a file (default user)
await memory.ImportDocumentAsync("meeting-transcript.docx");

// Import a file specifying a Document ID, User and Tags
await memory.ImportDocumentAsync("business-plan.docx",
    new DocumentDetails("user@some.email", "file001")
        .AddTag("collection", "business")
        .AddTag("collection", "plans")
        .AddTag("fiscalYear", "2023"));

Get answers via the web service

curl http://127.0.0.1:9001/ask -d'{"query":"Any news from NASA about Orion?"}' -H 'Content-Type: application/json'
{
  "Query": "Any news from NASA about Orion?",
  "Text": "Yes, there is news from NASA about the Orion spacecraft. NASA has invited the media to see a new test version [......] For more information about the Artemis program, you can visit the NASA website.",
  "RelevantSources": [
    {
      "Link": "...",
      "SourceContentType": "application/pdf",
      "SourceName": "file5-NASA-news.pdf",
      "Partitions": [
        {
          "Text": "Skip to main content\nJul 28, 2023\nMEDIA ADVISORY M23-095\nNASA Invites Media to See Recovery Craft for\nArtemis Moon Mission\n(/sites/default/files/thumbnails/image/ksc-20230725-ph-fmx01_0003orig.jpg)\nAboard the [......] to Mars (/topics/moon-to-\nmars/),Orion Spacecraft (/exploration/systems/orion/index.html)\nNASA Invites Media to See Recovery Craft for Artemis Moon Miss... https://www.nasa.gov/press-release/nasa-invites-media-to-see-recov...\n2 of 3 7/28/23, 4:51 PM",
          "Relevance": 0.8430657,
          "SizeInTokens": 863,
          "LastUpdate": "2023-08-01T08:15:02-07:00"
        }
      ]
    }
  ]
}

You can find a full example here.

Custom memory ingestion pipelines

On the other hand, if you need a custom data pipeline, you can also customize the steps, which will be handled by your custom business logic:

// Memory setup, e.g. how to calculate and where to store embeddings
var memoryBuilder = new KernelMemoryBuilder()
    .WithoutDefaultHandlers()
    .WithOpenAIDefaults(Environment.GetEnvironmentVariable("OPENAI_API_KEY"));

var memory = memoryBuilder.Build();

// Plug in custom .NET handlers
memory.Orchestrator.AddHandler<MyHandler1>("step1");
memory.Orchestrator.AddHandler<MyHandler2>("step2");
memory.Orchestrator.AddHandler<MyHandler3>("step3");

// Use the custom handlers with the memory object
await memory.ImportDocumentAsync(
    new Document("mytest001")
        .AddFile("file1.docx")
        .AddFile("file2.pdf"),
    steps: new[] { "step1", "step2", "step3" });

image

Web API specs with OpenAI swagger

The API schema is available at http://127.0.0.1:9001/swagger/index.html when running the service locally with OpenAPI enabled.

Examples and Tools

Examples

  1. Collection of Jupyter notebooks with various scenarios
  2. Using Kernel Memory web service to upload documents and answer questions
  3. Importing files and asking question without running the service (serverless mode)
  4. Using KM Plugin for Semantic Kernel
  5. Customizations
  6. Local models and external connectors
  7. Upload files and ask questions from command line using curl
  8. Summarizing documents, using synthetic memories
  9. Hybrid Search with Azure AI Search
  10. Running a single asynchronous pipeline handler as a standalone service
  11. Integrating Memory with ASP.NET applications and controllers
  12. Sample code showing how to extract text from files
  13. .NET configuration and logging
  14. Expanding chunks retrieving adjacent partitions
  15. Creating a Memory instance without KernelMemoryBuilder
  16. Intent Detection
  17. Fetching data from Discord
  18. Test project using KM package from nuget.org

Tools

  1. .NET appsettings.json generator
  2. Curl script to upload files
  3. Curl script to ask questions
  4. Curl script to search documents
  5. Script to start Qdrant for development tasks
  6. Script to start Elasticsearch for development tasks
  7. Script to start MS SQL Server for development tasks
  8. Script to start Redis for development tasks
  9. Script to start RabbitMQ for development tasks
  10. Script to start MongoDB Atlas for development tasks

.NET packages

  • Microsoft.KernelMemory.WebClient: .NET web client to call a running instance of Kernel Memory web service.

    Nuget package Example code

  • Microsoft.KernelMemory.Core: Kernel Memory core library including all extensions, can be used to build custom pipelines and handlers, contains also the serverless client to use memory in a synchronous way without the web service.

    Nuget package Example code

  • Microsoft.KernelMemory.Service.AspNetCore: an extension to load Kernel Memory into your ASP.NET apps.

    Nuget package Example code

  • Microsoft.KernelMemory.SemanticKernelPlugin: a Memory plugin for Semantic Kernel, replacing the original Semantic Memory available in SK.

    Nuget package Example code

Packages for Python, Java and other languages

Kernel Memory service offers a Web API out of the box, including the OpenAPI swagger documentation that you can leverage to test the API and create custom web clients. For instance, after starting the service locally, see http://127.0.0.1:9001/swagger/index.html.

A .NET Web Client and a Semantic Kernel plugin are available, see the nugets packages above.

A python package with a Web Client and Semantic Kernel plugin will soon be available. We also welcome PR contributions to support more languages.

Contributors

<img alt="aaronpowell" src="https://avatars.githubusercontent.com/u/434140?v=4&s=110" width="110"> <img alt="afederici75" src="https://avatars.githubusercontent.com/u/13766049?v=4&s=110" width="110"> <img alt="akordowski" src="https://avatars.githubusercontent.com/u/9746197?v=4&s=110" width="110"> <img alt="alexibraimov" src="https://avatars.githubusercontent.com/u/59023460?v=4&s=110" width="110"> <img alt="alkampfergit" src="https://avatars.githubusercontent.com/u/358545?v=4&s=110" width="110"> <img alt="amomra" src="https://avatars.githubusercontent.com/u/11981363?v=4&s=110" width="110">
aaronpowell afederici75 akordowski alexibraimov alkampfergit amomra
<img alt="anthonypuppo" src="https://avatars.githubusercontent.com/u/6828951?v=4&s=110" width="110"> <img alt="chaelli" src="https://avatars.githubusercontent.com/u/878151?v=4&s=110" width="110"> <img alt="cherchyk" src="https://avatars.githubusercontent.com/u/1703275?v=4&s=110" width="110"> <img alt="coryisakson" src="https://avatars.githubusercontent.com/u/303811?v=4&s=110" width="110"> <img alt="crickman" src="https://avatars.githubusercontent.com/u/66376200?v=4&s=110" width="110"> <img alt="dependabot[bot]" src="https://avatars.githubusercontent.com/in/29110?v=4&s=110" width="110">
anthonypuppo chaelli cherchyk coryisakson crickman dependabot[bot]
<img alt="dluc" src="https://avatars.githubusercontent.com/u/371009?v=4&s=110" width="110"> <img alt="DM-98" src="https://avatars.githubusercontent.com/u/10290906?v=4&s=110" width="110"> <img alt="EelcoKoster" src="https://avatars.githubusercontent.com/u/3356003?v=4&s=110" width="110"> <img alt="Foorcee" src="https://avatars.githubusercontent.com/u/5587062?v=4&s=110" width="110"> <img alt="GraemeJones104" src="https://avatars.githubusercontent.com/u/79144786?v=4&s=110" width="110"> <img alt="jurepurgar" src="https://avatars.githubusercontent.com/u/6506920?v=4&s=110" width="110">
dluc DM-98 EelcoKoster Foorcee GraemeJones104 jurepurgar
<img alt="JustinRidings" src="https://avatars.githubusercontent.com/u/49916830?v=4&s=110" width="110"> <img alt="kbeaugrand" src="https://avatars.githubusercontent.com/u/9513635?v=4&s=110" width="110"> <img alt="koteus" src="https://avatars.githubusercontent.com/u/428201?v=4&s=110" width="110"> <img alt="KSemenenko" src="https://avatars.githubusercontent.com/u/4385716?v=4&s=110" width="110"> <img alt="lecramr" src="https://avatars.githubusercontent.com/u/20584823?v=4&s=110" width="110"> <img alt="luismanez" src="https://avatars.githubusercontent.com/u/9392197?v=4&s=110" width="110">
JustinRidings kbeaugrand koteus KSemenenko lecramr luismanez
<img alt="marcominerva" src="https://avatars.githubusercontent.com/u/3522534?v=4&s=110" width="110"> <img alt="neel015" src="https://avatars.githubusercontent.com/u/34688460?v=4&s=110" width="110"> <img alt="pascalberger" src="https://avatars.githubusercontent.com/u/2190718?v=4&s=110" width="110"> <img alt="pawarsum12" src="https://avatars.githubusercontent.com/u/136417839?v=4&s=110" width="110"> <img alt="pradeepr-roboticist" src="https://avatars.githubusercontent.com/u/6598307?v=4&s=110" width="110"> <img alt="qihangnet" src="https://avatars.githubusercontent.com/u/1784873?v=4&s=110" width="110">
marcominerva neel015 pascalberger pawarsum12 pradeepr-roboticist qihangnet
<img alt="roldengarm" src="https://avatars.githubusercontent.com/u/37638588?v=4&s=110" width="110"> <img alt="setuc" src="https://avatars.githubusercontent.com/u/9305355?v=4&s=110" width="110"> <img alt="slapointe" src="https://avatars.githubusercontent.com/u/1054412?v=4&s=110" width="110"> <img alt="slorello89" src="https://avatars.githubusercontent.com/u/42971704?v=4&s=110" width="110"> <img alt="spenavajr" src="https://avatars.githubusercontent.com/u/96045491?v=4&s=110" width="110"> <img alt="TaoChenOSU" src="https://avatars.githubusercontent.com/u/12570346?v=4&s=110" width="110">
roldengarm setuc slapointe slorello89 spenavajr TaoChenOSU
<img alt="teresaqhoang" src="https://avatars.githubusercontent.com/u/125500434?v=4&s=110" width="110"> <img alt="v-msamovendyuk" src="https://avatars.githubusercontent.com/u/61688766?v=4&s=110" width="110"> <img alt="Valkozaur" src="https://avatars.githubusercontent.com/u/58659526?v=4&s=110" width="110"> <img alt="vicperdana" src="https://avatars.githubusercontent.com/u/7114832?v=4&s=110" width="110"> <img alt="walexee" src="https://avatars.githubusercontent.com/u/12895846?v=4&s=110" width="110"> <img alt="westdavidr" src="https://avatars.githubusercontent.com/u/669668?v=4&s=110" width="110">
teresaqhoang v-msamovendyuk Valkozaur vicperdana walexee westdavidr
<img alt="xbotter" src="https://avatars.githubusercontent.com/u/3634877?v=4&s=110" width="110">
xbotter
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (8)

Showing the top 5 NuGet packages that depend on Microsoft.KernelMemory.Core:

Package Downloads
EachShow.AI

OpenAI, ChatGPT

Microsoft.KernelMemory.Service.AspNetCore

This package provide helpers to integrate Kernel Memory into ASP.NET applications, such as builders, web endpoints, HTTP models

Alkampfer.KernelMemory.Extensions

Added some extensions for Kernel Memory.

ManagedCode.KernelMemory.Playwright

Playwright for KernelMemory

Aip.Km.KernelMemoryExtension

Package Description

GitHub repositories (5)

Showing the top 5 popular GitHub repositories that depend on Microsoft.KernelMemory.Core:

Repository Stars
SciSharp/LLamaSharp
A C#/.NET library to run LLM (🦙LLaMA/LLaVA) on your local device efficiently.
microsoft/kernel-memory
RAG architecture: index and query any data using LLM and natural language, track sources, show citations, asynchronous memory patterns.
microsoft/teams-ai
SDK focused on building AI based applications and extensions for Microsoft Teams and other Bot Framework channels
lindexi/lindexi_gd
博客用到的代码
ktutak1337/Stellar-Chat
A versatile multi-modal chat application that enables users to develop custom agents, create images, leverage visual recognition, and engage in voice interactions. It integrates seamlessly with local LLMs and commercial models like OpenAI, Gemini, Perplexity, and Claude, and allows to converse with uploaded documents and websites.
Version Downloads Last updated
0.78.241007.1 467 10/8/2024
0.78.241005.1 318 10/6/2024
0.77.241004.1 140 10/5/2024
0.76.240930.3 1,396 9/30/2024
0.75.240924.1 3,222 9/24/2024
0.74.240919.1 2,505 9/19/2024
0.73.240906.1 13,266 9/7/2024
0.72.240904.1 2,343 9/5/2024
0.71.240820.1 9,034 8/21/2024
0.70.240803.1 19,651 8/3/2024
0.69.240727.1 7,023 7/27/2024
0.68.240722.1 2,874 7/22/2024
0.68.240716.1 1,859 7/16/2024
0.67.240712.1 1,494 7/12/2024
0.66.240709.1 4,499 7/9/2024
0.65.240620.1 27,683 6/21/2024
0.64.240619.1 720 6/20/2024
0.63.240618.1 2,248 6/18/2024
0.62.240605.1 18,772 6/5/2024
0.62.240604.1 472 6/4/2024
0.61.240524.1 9,625 5/24/2024
0.61.240519.2 9,739 5/19/2024
0.60.240517.1 219 5/18/2024
0.51.240513.2 6,346 5/13/2024
0.50.240504.7 4,369 5/4/2024
0.40.240501.1 718 5/1/2024
0.39.240427.1 5,323 4/28/2024
0.38.240425.1 1,198 4/25/2024
0.38.240423.1 1,061 4/24/2024
0.37.240420.2 1,569 4/21/2024
0.36.240416.1 13,581 4/16/2024
0.36.240415.2 1,501 4/16/2024
0.36.240415.1 319 4/15/2024
0.35.240412.2 1,211 4/12/2024
0.35.240321.1 22,140 3/21/2024
0.35.240318.1 15,698 3/18/2024
0.34.240313.1 7,418 3/13/2024
0.33.240312.1 537 3/12/2024
0.32.240308.1 1,753 3/8/2024
0.32.240307.3 606 3/7/2024
0.32.240307.2 380 3/7/2024
0.30.240227.1 18,522 2/28/2024
0.29.240219.2 7,134 2/20/2024
0.28.240212.1 3,624 2/13/2024
0.27.240207.1 1,354 2/7/2024
0.27.240205.2 3,058 2/6/2024
0.27.240205.1 231 2/5/2024
0.26.240121.1 15,442 1/22/2024
0.26.240116.2 2,384 1/16/2024
0.26.240115.4 474 1/16/2024
0.26.240104.1 3,696 1/5/2024
0.25.240103.1 255 1/4/2024
0.24.231228.5 1,530 12/29/2023
0.24.231228.4 147 12/29/2023
0.23.231224.1 8,126 12/24/2023
0.23.231221.1 771 12/22/2023
0.23.231219.1 2,605 12/20/2023
0.22.231217.1 176 12/18/2023
0.21.231214.1 259 12/15/2023
0.20.231212.1 877 12/13/2023
0.19.231211.1 996 12/11/2023