.NET SDK
.NET/C# client SDK for GoodMem with full async support
No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
This C# SDK is automatically generated by the OpenAPI Generator project:
- API version:
- SDK version: 1.0.5
- Generator version: 7.14.0-SNAPSHOT
- Build package: org.openapitools.codegen.languages.CSharpClientCodegen
Frameworks supported
Dependencies
- Json.NET - 13.0.2 or later
- JsonSubTypes - 1.8.0 or later
- System.ComponentModel.Annotations - 5.0.0 or later
The DLLs included in the package may not be the latest version. We recommend using NuGet to obtain the latest version of the packages:
Install-Package Newtonsoft.Json
Install-Package JsonSubTypes
Install-Package System.ComponentModel.AnnotationsInstallation
Run the following command to generate the DLL
- [Mac/Linux]
/bin/sh build.sh - [Windows]
build.bat
Then include the DLL (under the bin folder) in the C# project, and use the namespaces:
using Pairsystems.Goodmem.Client.Api;
using Pairsystems.Goodmem.Client.Client;
using Pairsystems.Goodmem.Client.Model;Packaging
A .nuspec is included with the project. You can follow the Nuget quickstart to create and publish packages.
This .nuspec uses placeholders from the .csproj, so build the .csproj directly:
nuget pack -Build -OutputDirectory out Pairsystems.Goodmem.Client.csprojThen, publish to a local feed or other host and consume the new package via Nuget as usual.
Usage
To use the API client with a HTTP proxy, setup a System.Net.WebProxy
Configuration c = new Configuration();
System.Net.WebProxy webProxy = new System.Net.WebProxy("[http://myProxyUrl:80/](http://myProxyUrl:80/)");
webProxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
c.Proxy = webProxy;Connections
Each ApiClass (properly the ApiClient inside it) will create an instance of HttpClient. It will use that for the entire lifecycle and dispose it when called the Dispose method.
To better manager the connections it's a common practice to reuse the HttpClient and HttpClientHandler (see here for details). To use your own HttpClient instance just pass it to the ApiClass constructor.
HttpClientHandler yourHandler = new HttpClientHandler();
HttpClient yourHttpClient = new HttpClient(yourHandler);
var api = new YourApiClass(yourHttpClient, yourHandler);If you want to use an HttpClient and don't have access to the handler, for example in a DI context in Asp.net Core when using IHttpClientFactory.
HttpClient yourHttpClient = new HttpClient();
var api = new YourApiClass(yourHttpClient);You'll loose some configuration settings, the features affected are: Setting and Retrieving Cookies, Client Certificates, Proxy settings. You need to either manually handle those in your setup of the HttpClient or they won't be available.
Here an example of DI setup in a sample web project:
services.`AddHttpClient<YourApiClass>`(httpClient =>
new PetApi(httpClient));Getting Started
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.Http;
using Pairsystems.Goodmem.Client.Api;
using Pairsystems.Goodmem.Client.Client;
using Pairsystems.Goodmem.Client.Model;
namespace Example
{
public class Example
{
public static void Main()
{
Configuration config = new Configuration();
config.BasePath = "[http://localhost:8080";](http://localhost:8080";)
// create instances of HttpClient, HttpClientHandler to be reused later with different Api classes
var apiInstance = new APIKeysApi(config);
var createApiKeyRequest = new CreateApiKeyRequest(); // CreateApiKeyRequest | API key configuration
try
{
// Create a new API key
CreateApiKeyResponse result = apiInstance.CreateApiKey(createApiKeyRequest);
Debug.WriteLine(result);
}
catch (ApiException e)
{
Debug.Print("Exception when calling APIKeysApi.CreateApiKey: " + e.Message );
Debug.Print("Status Code: "+ e.ErrorCode);
Debug.Print(e.StackTrace);
}
}
}
}Streaming Memory Retrieval
The GoodMem .NET client provides a StreamingClient class for real-time streaming memory retrieval. This is the recommended approach for memory retrieval operations.
Supported Formats
The StreamingClient supports two streaming formats:
- NDJSON (
application/x-ndjson) - Newline-delimited JSON (default, recommended) - SSE (
text/event-stream) - Server-Sent Events
Basic Streaming with ChatPostProcessor
Use RetrieveMemoryStreamChatAsync() for streaming with automatic ChatPostProcessor configuration:
using Pairsystems.Goodmem.Client;
using Pairsystems.Goodmem.Client.Client;
using System;
using System.Collections.Generic;
using System.Threading;
// Configure client
var config = new Configuration();
config.BasePath = "[http://localhost:8080";](http://localhost:8080";)
config.DefaultHeaders["X-API-Key"] = "your-api-key";
config.DefaultHeaders["X-API-Key"] = "your-api-key";
// Create streaming client
var streamingClient = new StreamingClient(config);
// Stream with ChatPostProcessor (NDJSON format)
await foreach (var ev in streamingClient.RetrieveMemoryStreamChatAsync(
"your search query",
new `List<string>` { "space-uuid" },
10, // requested size
true, // fetch memory
false, // fetch memory content
"ndjson", // format (ndjson or sse)
"llm-uuid", // LLM ID
"reranker-uuid", // reranker ID
0.5, // relevance threshold
0.3, // LLM temperature
10, // max results
true, // chronological resort
CancellationToken.None))
{
if (ev.AbstractReply != null)
{
Console.WriteLine($"Abstract: {ev.AbstractReply.Text}");
}
else if (ev.RetrievedItem?.Memory != null)
{
Console.WriteLine($"Memory: {ev.RetrievedItem.Memory}");
}
}Advanced Streaming with Custom Post-Processor
Use RetrieveMemoryStreamAdvancedAsync() for custom post-processor configuration:
// Create advanced request
var request = new AdvancedMemoryStreamRequest
{
Message = "your search query",
SpaceIds = new `List<string>` { "space-uuid" },
RequestedSize = 10,
FetchMemory = true,
FetchMemoryContent = false,
Format = "ndjson", // or "sse"
PostProcessorName = "com.goodmem.retrieval.postprocess.ChatPostProcessorFactory",
PostProcessorConfig = new Dictionary<string, object>
{
["llm_id"] = "llm-uuid",
["reranker_id"] = "reranker-uuid",
["relevance_threshold"] = 0.5,
["llm_temp"] = 0.3,
["max_results"] = 10,
["chronological_resort"] = true
}
};
// Execute streaming
await foreach (var ev in streamingClient.RetrieveMemoryStreamAdvancedAsync(request, CancellationToken.None))
{
if (ev.AbstractReply != null)
{
Console.WriteLine($"Abstract: {ev.AbstractReply.Text}");
}
else if (ev.RetrievedItem != null)
{
Console.WriteLine($"Retrieved: {ev.RetrievedItem}");
}
}Choosing Between NDJSON and SSE
- NDJSON (recommended): Simpler parsing, better for most use cases
- SSE: Standard browser EventSource API compatible, useful for web applications
Documentation for API Endpoints
All URIs are relative to *http://localhost*
| Class | Method | HTTP request | Description |
|---|---|---|---|
| APIKeysApi | CreateApiKey | POST /v1/apikeys | Create a new API key |
| APIKeysApi | DeleteApiKey | DELETE /v1/apikeys/{id} | Delete an API key |
| APIKeysApi | ListApiKeys | GET /v1/apikeys | List API keys |
| APIKeysApi | UpdateApiKey | PUT /v1/apikeys/{id} | Update an API key |
| AdministrationApi | DrainServer | POST /v1/admin:drain | Request the server to enter drain mode |
| AdministrationApi | PurgeBackgroundJobs | POST /v1/admin/background-jobs:purge | Purge completed background jobs |
| AdministrationApi | ReloadLicense | POST /v1/admin/license:reload | Reload the active license from disk |
| EmbeddersApi | CreateEmbedder | POST /v1/embedders | Create a new embedder |
| EmbeddersApi | DeleteEmbedder | DELETE /v1/embedders/{id} | Delete an embedder |
| EmbeddersApi | GetEmbedder | GET /v1/embedders/{id} | Get an embedder by ID |
| EmbeddersApi | ListEmbedders | GET /v1/embedders | List embedders |
| EmbeddersApi | UpdateEmbedder | PUT /v1/embedders/{id} | Update an embedder |
| LLMsApi | CreateLLM | POST /v1/llms | Create a new LLM |
| LLMsApi | DeleteLLM | DELETE /v1/llms/{id} | Delete an LLM |
| LLMsApi | GetLLM | GET /v1/llms/{id} | Get an LLM by ID |
| LLMsApi | ListLLMs | GET /v1/llms | List LLMs |
| LLMsApi | UpdateLLM | PUT /v1/llms/{id} | Update an LLM |
| MemoriesApi | BatchCreateMemory | POST /v1/memories:batchCreate | Create multiple memories in a batch |
| MemoriesApi | BatchDeleteMemory | POST /v1/memories:batchDelete | Delete multiple memories by ID |
| MemoriesApi | BatchGetMemory | POST /v1/memories:batchGet | Get multiple memories by ID |
| MemoriesApi | CreateMemory | POST /v1/memories | Create a new memory |
| MemoriesApi | DeleteMemory | DELETE /v1/memories/{id} | Delete a memory |
| MemoriesApi | GetMemory | GET /v1/memories/{id} | Get a memory by ID |
| MemoriesApi | GetMemoryContent | GET /v1/memories/{id}/content | Download memory content |
| MemoriesApi | ListMemories | GET /v1/spaces/{spaceId}/memories | List memories in a space |
| MemoriesApi | RetrieveMemory | GET /v1/memories:retrieve | Stream semantic memory retrieval |
| MemoriesApi | RetrieveMemoryAdvanced | POST /v1/memories:retrieve | Advanced semantic memory retrieval with JSON |
| RerankersApi | CreateReranker | POST /v1/rerankers | Create a new reranker |
| RerankersApi | DeleteReranker | DELETE /v1/rerankers/{id} | Delete a reranker |
| RerankersApi | GetReranker | GET /v1/rerankers/{id} | Get a reranker by ID |
| RerankersApi | ListRerankers | GET /v1/rerankers | List rerankers |
| RerankersApi | UpdateReranker | PUT /v1/rerankers/{id} | Update a reranker |
| SpacesApi | CreateSpace | POST /v1/spaces | Create a new Space |
| SpacesApi | DeleteSpace | DELETE /v1/spaces/{id} | Delete a space |
| SpacesApi | GetSpace | GET /v1/spaces/{id} | Get a space by ID |
| SpacesApi | ListSpaces | GET /v1/spaces | List spaces |
| SpacesApi | UpdateSpace | PUT /v1/spaces/{id} | Update a space |
| SystemApi | GetSystemInfo | GET /v1/system/info | Retrieve server build metadata |
| SystemApi | InitializeSystem | POST /v1/system/init | Initialize the system |
| UsersApi | GetCurrentUser | GET /v1/users/me | Get current user profile |
| UsersApi | GetUser | GET /v1/users/{id} | Get a user by ID |
| UsersApi | GetUserByEmail | GET /v1/users/email/{email} | Get user by email address |
Documentation for Models
- Model.AbstractReply
- Model.ActiveLicenseMetadata
- Model.AdminDrainRequest
- Model.AdminDrainResponse
- Model.AdminPurgeJobsRequest
- Model.AdminPurgeJobsResponse
- Model.AdminReloadLicenseResponse
- Model.ApiKeyAuth
- Model.ApiKeyResponse
- Model.BackgroundJobAttempt
- Model.BackgroundJobSummary
- Model.BatchMemoryCreationRequest
- Model.BatchMemoryDeletionRequest
- Model.BatchMemoryRetrievalRequest
- Model.BinaryContent
- Model.ChunkReference
- Model.ChunkingConfiguration
- Model.ContextItem
- Model.CreateApiKeyRequest
- Model.CreateApiKeyResponse
- Model.CreateLLMResponse
- Model.CredentialKind
- Model.DistributionType
- Model.EmbedderCreationRequest
- Model.EmbedderResponse
- Model.EmbedderWeight
- Model.EndpointAuthentication
- Model.GcpAdcAuth
- Model.GoodMemStatus
- Model.LLMCapabilities
- Model.LLMCreationRequest
- Model.LLMProviderType
- Model.LLMResponse
- Model.LLMSamplingParams
- Model.LLMUpdateRequest
- Model.LengthMeasurement
- Model.ListApiKeysResponse
- Model.ListEmbeddersResponse
- Model.ListLLMsResponse
- Model.ListRerankersResponse
- Model.ListSpacesResponse
- Model.Memory
- Model.MemoryChunkResponse
- Model.MemoryCreationRequest
- Model.MemoryListResponse
- Model.Modality
- Model.PostProcessor
- Model.ProcessingHistory
- Model.ProviderType
- Model.RecursiveChunkingConfiguration
- Model.RerankerCreationRequest
- Model.RerankerResponse
- Model.ResultSetBoundary
- Model.RetrieveMemoryEvent
- Model.RetrieveMemoryRequest
- Model.RetrievedItem
- Model.SecretReference
- Model.SentenceChunkingConfiguration
- Model.SeparatorKeepStrategy
- Model.Space
- Model.SpaceCreationRequest
- Model.SpaceEmbedder
- Model.SpaceEmbedderConfig
- Model.SpaceKey
- Model.SystemInfoResponse
- Model.SystemInitResponse
- Model.UpdateApiKeyRequest
- Model.UpdateEmbedderRequest
- Model.UpdateRerankerRequest
- Model.UpdateSpaceRequest
- Model.UserResponse
Documentation for Authorization
Endpoints do not require authorization.