![]() |
VOOZH | about |
dotnet add package Shiny.AiConversation.MessageStores.SqliteDocDb --version 1.0.0-beta-0050
NuGet\Install-Package Shiny.AiConversation.MessageStores.SqliteDocDb -Version 1.0.0-beta-0050
<PackageReference Include="Shiny.AiConversation.MessageStores.SqliteDocDb" Version="1.0.0-beta-0050" />
<PackageVersion Include="Shiny.AiConversation.MessageStores.SqliteDocDb" Version="1.0.0-beta-0050" />Directory.Packages.props
<PackageReference Include="Shiny.AiConversation.MessageStores.SqliteDocDb" />Project file
paket add Shiny.AiConversation.MessageStores.SqliteDocDb --version 1.0.0-beta-0050
#r "nuget: Shiny.AiConversation.MessageStores.SqliteDocDb, 1.0.0-beta-0050"
#:package Shiny.AiConversation.MessageStores.SqliteDocDb@1.0.0-beta-0050
#addin nuget:?package=Shiny.AiConversation.MessageStores.SqliteDocDb&version=1.0.0-beta-0050&prereleaseInstall as a Cake Addin
#tool nuget:?package=Shiny.AiConversation.MessageStores.SqliteDocDb&version=1.0.0-beta-0050&prereleaseInstall as a Cake Tool
A centralized AI service library for .NET MAUI apps that orchestrates chat, speech recognition, wake word detection, text-to-speech, and persistent message history into a single IAiConversationService interface.
IContextProvider visitor pattern for populating an AiContext per request. Each provider receives a mutable context containing system prompts, AI tools, quiet words, speech-to-text options, and text-to-speech options. A built-in ContextProvider handles time-based prompts, acknowledgement-aware voice prompts, and DI-registered AITool instances.IMessageStore for storing and querying past conversationsIMessageStore is registered, lets the AI search past conversations on its ownAddVoiceSelectionTools() enables the AI to list voices, play samples, and switch its own TTS voice mid-conversationAiState (Idle / Listening / Thinking / Responding) with eventsAiContext.QuietWords immediately silence TTS and break out of the conversation. Any other speech during TTS interrupts and continues the conversation with the new utterance.SpeechToTextOptions and TextToSpeechOptions via AiContext (culture, silence timeout, voice, speech rate, etc.)dotnet add package Shiny.AiConversation
using Shiny.AiConversation;
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts => { ... });
// Register an IChatClient in DI (from any Microsoft.Extensions.AI-compatible provider)
builder.Services.AddChatClient(new OpenAIClient("your-api-key").GetChatClient("gpt-4o").AsIChatClient());
builder.Services.AddShinyAiConversation(opts =>
{
// Optional — enable persistent history (ChatLookupAITool is added automatically)
opts.SetMessageStore<MyMessageStore>();
});
return builder.Build();
By default, the library resolves IChatClient from DI. Simply register your chat client with the container:
builder.Services.AddChatClient(new OpenAIClient("your-api-key").GetChatClient("gpt-4o").AsIChatClient());
A ready-made static OpenAI provider. Works with any OpenAI-compatible endpoint (OpenAI, Azure OpenAI, Ollama, etc.).
dotnet add package Shiny.AiConversation.OpenAi
builder.Services.AddShinyAiConversation(opts =>
{
opts.AddStaticOpenAIChatClient(
apiToken: "your-api-key",
endpointUri: "https://api.openai.com/v1",
modelName: "gpt-4o"
);
});
A MAUI-specific provider that authenticates via the GitHub device code flow and uses the Copilot API. Tokens are stored in SecureStorage. Authentication is fully self-contained — the library shows a popup with the device code, copies it to the clipboard, and opens the browser for the user to authorize.
dotnet add package Shiny.AiConversation.Maui.GithubCopilot
builder.Services.AddShinyAiConversation(opts =>
{
opts.AddGithubCopilotChatClient();
});
No additional setup is needed — the provider handles the entire OAuth flow, token exchange, caching, and re-authentication on expiry.
For other backends, implement IChatClientProvider:
using Microsoft.Extensions.AI;
using Shiny.AiConversation;
public class MyChatClientProvider : IChatClientProvider
{
public async Task<IChatClient> GetChatClient(CancellationToken cancelToken = default)
{
// Handle auth, token refresh, etc.
return BuildChatClient();
}
}
// Register it:
builder.Services.AddShinyAiConversation(opts =>
{
opts.SetChatClientProvider<MyChatClientProvider>();
});
IMessageStore (optional)Provide persistent storage for chat history. Without this, GetChatHistory and ClearChatHistory will throw.
using Shiny.AiConversation;
public class MyMessageStore : IMessageStore
{
public Task Store(string? userTriggeringMessage, ChatResponse response, CancellationToken cancellationToken)
{
// Persist the complete AI response
}
public Task Clear(DateTimeOffset? beforeDate = null)
{
// Clear all or messages before the given date
}
public Task<IReadOnlyList<AiChatMessage>> Query(
string? messageContains = null,
DateTimeOffset? fromDate = null,
DateTimeOffset? toDate = null,
int? limit = null,
CancellationToken cancellationToken = default)
{
// Query with optional filters, return ordered by timestamp
}
}
public class ChatViewModel(IAiConversationService aiService) : ObservableObject
{
public async Task SendMessage(string text)
{
await aiService.TalkTo(text, CancellationToken.None);
}
public async Task UseMicrophone()
{
var access = await aiService.RequestAccess();
if (access != AccessState.Available)
return;
await aiService.ListenAndTalk(CancellationToken.None);
}
public async Task StartWakeWord()
{
await aiService.StartWakeWord("Hey Assistant");
}
}
| Member | Description |
|---|---|
RequestAccess() |
Check speech-to-text access — returns Available or Restricted |
TalkTo(string, CancellationToken) |
Send a text message to the AI |
ListenAndTalk(CancellationToken) |
Capture speech via microphone and send to AI |
StartWakeWord(string) |
Begin continuous wake word detection |
StopWakeWord() |
Stop wake word detection |
GetChatHistory(...) |
Query persisted chat history with optional filters |
ClearChatHistory(...) |
Clear persisted history (all or before a date) |
ClearCurrentChat() |
Clear in-memory session messages |
Status |
Current AiState (Idle / Listening / Thinking / Responding) |
Acknowledgement |
Get/set the response delivery mode |
StatusChanged |
Event fired with the new AiState on any state change |
AiResponded |
Event fired when the AI completes a response with AiResponse (Response, WasReadAloud, ExpectsResponse) |
The AiContext is a mutable context object populated by IContextProvider implementations before each AI request:
| Property | Description |
|---|---|
Acknowledgement |
The current acknowledgement mode (set by the service before providers run) |
SystemPrompts |
System prompt strings to include in the chat request |
Tools |
AI tools available for the request |
QuietWords |
Words that stop TTS and break the conversation loop (default: cancel, quiet, shut up, stop, nevermind, never mind, hush) |
SpeechToTextOptions |
Options for speech-to-text (culture, silence timeout, prefer on-device) |
TextToSpeechOptions |
Options for text-to-speech (culture, voice, speech rate, pitch, volume) |
| Mode | Behavior |
|---|---|
None |
No audio feedback or text-to-speech |
AudioBlip |
Short sound effects at state transitions |
LessWordy |
Text-to-speech with a "be concise" system prompt |
Full |
Text-to-speech with full unmodified responses |
When an IMessageStore is registered via SetMessageStore<T>(), the built-in ContextProvider automatically adds a ChatLookupAITool (lookup_chat_history) to every request. This allows the AI to autonomously search past conversations when the user asks about previous discussions — no extra code required.
Call AddVoiceSelectionTools() during registration to give the AI three voice-related tools:
| Tool | Description |
|---|---|
get_available_voices |
Lists all available TTS voices, optionally filtered by culture code |
play_voice_sample |
Speaks a sample phrase using a specific voice so the user can hear it |
change_voice |
Switches the AI's speaking voice; persists for the session |
builder.Services.AddShinyAiConversation(opts =>
{
opts.AddStaticOpenAIChatClient(...);
opts.AddVoiceSelectionTools();
});
Once registered, the user can say things like:
The selected voice is written directly to IAiConversationService.TextToSpeechOptions, which the service uses for all subsequent TTS responses. Requires ITextToSpeechService — available automatically when AutoAddSpeechServices is true (the default).
┌─────────────────────────────────────────────────┐
│ IAiConversationService │
│ (orchestrates chat, speech, sounds, history) │
├──────────┬──────────────┬───────────────────────┤
│ │ │ │
│ IChatClientProvider │ IMessageStore │
│ (default: resolves │ (persistence) │
│ IChatClient from DI) │ │
│ │ │ │ │
│ IChatClient ISpeechToText │ ChatLookupAITool
│ (M.E.AI) ITextToSpeech │ (optional AITool)
│ (Shiny.Speech) │ │
│ │ │ │
│ IAudioPlayer │ │
│ (Shiny.Speech) │ │
└─────────────────────────────────────────────────┘
| Package | Purpose |
|---|---|
| Microsoft.Extensions.AI | IChatClient abstraction |
| Shiny.Speech | Speech-to-text, text-to-speech, and audio playback |
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0-beta-0050 | 54 | 6/5/2026 |
| 1.0.0-beta-0049 | 49 | 6/2/2026 |
| 1.0.0-beta-0048 | 48 | 6/2/2026 |
| 1.0.0-beta-0047 | 58 | 5/22/2026 |
| 1.0.0-beta-0046 | 56 | 5/22/2026 |
| 1.0.0-beta-0045 | 53 | 5/21/2026 |
| 1.0.0-beta-0043 | 53 | 5/16/2026 |
| 1.0.0-beta-0042 | 56 | 5/16/2026 |
| 1.0.0-beta-0041 | 65 | 5/13/2026 |
| 1.0.0-beta-0040 | 54 | 5/13/2026 |
| 1.0.0-beta-0039 | 55 | 5/13/2026 |
| 1.0.0-beta-0038 | 51 | 5/13/2026 |
| 1.0.0-beta-0037 | 47 | 5/13/2026 |
| 1.0.0-beta-0035 | 53 | 5/12/2026 |
| 1.0.0-beta-0001 | 55 | 6/11/2026 |