KiteKey.AI 0.1.0

dotnet add package KiteKey.AI --version 0.1.0
                    
NuGet\Install-Package KiteKey.AI -Version 0.1.0
                    
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="KiteKey.AI" Version="0.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="KiteKey.AI" Version="0.1.0" />
                    
Directory.Packages.props
<PackageReference Include="KiteKey.AI" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add KiteKey.AI --version 0.1.0
                    
#r "nuget: KiteKey.AI, 0.1.0"
                    
#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.
#:package KiteKey.AI@0.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=KiteKey.AI&version=0.1.0
                    
Install as a Cake Addin
#tool nuget:?package=KiteKey.AI&version=0.1.0
                    
Install as a Cake Tool

KiteKey.AI

Small, provider-neutral .NET 8 libraries extracted from Delphinium's AI service. MIT licensed.

Package Responsibility
KiteKey.AI.Abstractions Tool dispatch, chat output, text-processing and voice transport contracts; no NuGet dependencies
KiteKey.AI JSON handler base and named tool executor; depends on Abstractions and Microsoft.Extensions.Logging.Abstractions

Install KiteKey.AI to implement and dispatch tools; install just KiteKey.AI.Abstractions for contracts. Neither package registers a model provider or makes network calls.

using KiteKey.AI.Abstractions.Functions;
using KiteKey.AI.Functions;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;

public sealed record WeatherArgs(string City);
public sealed record WeatherResult(string Forecast);

public sealed class WeatherHandler(ILogger<WeatherHandler> logger)
    : FunctionHandlerBase<WeatherArgs, WeatherResult>(logger)
{
    public override string Name => "weather";

    public override Task<WeatherResult> ProcessCore(WeatherArgs args, CancellationToken cancellation)
        => Task.FromResult(new WeatherResult($"Weather for {args.City}"));
}

IFunctionExecutor executor = new FunctionExecutor([new WeatherHandler(NullLogger<WeatherHandler>.Instance)]);
string? json = await executor.TryProcessFunctionCallAsync("weather", """{"city":"Boston"}""", CancellationToken.None);

Pass an optional Func<string, string, CancellationToken, Task<string?>> as the executor's second argument to dispatch unknown tools elsewhere. Without one, unknown tools return null; there is no mandatory webhook. The contextual overload fills missing or placeholder JSON string arguments with trusted channel context. Duplicate handler names throw. Malformed contextual JSON and handler failures propagate exceptions rather than returning success-shaped error JSON.

Migration from Delphinium

Delphinium source New type
Models.Functions.IFunctionHandler, RequiredToolCall KiteKey.AI.Abstractions.Functions
Assistants.IFunctionExecutor KiteKey.AI.Abstractions.Functions.IFunctionExecutor
Assistants.FunctionExecutor KiteKey.AI.Functions.FunctionExecutor
Functions.FunctionHandlerBase<TArgs,TOutput> KiteKey.AI.Functions.FunctionHandlerBase<TArgs,TOutput>
Models.Chats.IChatClient KiteKey.AI.Abstractions.Chats.IChatClient
LanguageProcessing.IGptAgent, ISummarizer, ITextClassifier KiteKey.AI.Abstractions.LanguageProcessing
Models.Voice.IHumanAudioClient and app transcript DTO KiteKey.AI.Abstractions.Voice.IVoiceAudioClient and VoiceTranscript (adapter required)

Namespaces and executor constructor signatures change: update imports and register IFunctionExecutor against FunctionExecutor with your IEnumerable<IFunctionHandler>. The signatures of IFunctionHandler, IFunctionExecutor, RequiredToolCall, and FunctionHandlerBase<TArgs,TOutput> remain source-compatible after namespace changes. Delphinium's handler base used to turn every exception (including cancellation) into {"message":"..."} and returned "Not found" on null results; the new base propagates exceptions and rejects null results. Contextual dispatch likewise rejects malformed JSON instead of silently forwarding it. Consumers should handle these errors at their transport boundary. A former webhook implementation can be explicitly adapted through the optional fallback callback. Existing Delphinium entity-backed function definitions, Azure assistants/voice integrations, native app-specific functions, and Twilio are not included. The browser socket audio class remains deferred; its ChannelStream and app event handling are not shared. See architecture.

Audio transport boundary

IVoiceAudioClient exposes only the conversation ID, speaking state, microphone stream, audio output, playback clearing, status, and transcript delivery used by a voice provider. Its cancellation-aware signatures match the standalone Azure VoiceLive transport, allowing future namespace-only migration once these packages are published. It does not copy the app's lifecycle/disposal APIs or require BinaryData; provider adapters call SendAudioAsync(binaryData.ToArray(), cancellation). In a Delphinium audio adapter, map the neutral transcript into the existing application DTO at the boundary:

public Task SendTranscriptAsync(KiteKey.AI.Abstractions.Voice.VoiceTranscript entry, CancellationToken cancellation)
    => SendToApplicationAsync(new Delphinium.Data.Shared.Models.AudioProcessing.ConversationTranscriptMessage
    {
        MessageId = entry.MessageId,
        Speaker = entry.Speaker,
        Text = entry.Text,
        IsFinal = entry.IsFinal,
        Timestamp = entry.Timestamp,
        ToolName = entry.ToolCall?.Name,
        ToolArguments = entry.ToolCall?.Arguments,
        ToolOutput = entry.ToolCall?.Output
    });

The example is a mapping inside a consumer-owned adapter; SendToApplicationAsync represents that application's existing transcript sink. No Delphinium type is referenced by either NuGet package.

Build and release

Run dotnet test KiteKey.AI.sln -c Release, then dotnet pack KiteKey.AI.sln -c Release --no-build -o artifacts. CI runs both on PRs and main. To release, update both project versions, merge to main, then push a matching vX.Y.Z tag. The release workflow checks tag/version agreement, tests and packs, then uses NuGet trusted publishing (OIDC) to publish both packages.

Before the first release, add a KiteKey NuGet organization trusted publishing policy for GitHub owner Kite-Key, repository ai, workflow release.yml (no environment), and grant its NuGet account permission to publish KiteKey.AI*. Set repository variable NUGET_USERNAME to the NuGet.org username whose organization membership and policy can publish; no permanent API key is needed. Package ownership and policy setup are external prerequisites.

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.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.0 100 9/27/2026