The .NET library to build AI agents with 30+ built-in connectors.
The .NET library to build AI agents with 30+ built-in connectors.
Orchestrator (graph), Runner (node), and Advancer (edge). Comes with handoffs, parallel execution, Mermaid export, and builder pattern to keep it simple.LlmTornado.Mcp.LlmTornado.A2A.LlmTornado.Microsoft.Extensions.AI.LlmTornado.Agents to build their AI Components. /ocr endpoint is implemented for Mistral. /files endpoint support is extended to all supported providers./batch endpoint is implemented for OpenAI, Anthropic, and Google. /videos endpoint now supports OpenAI/Sora./tokenize endpoint is implemented for all Providers supporting the feature./responses exclusive models from /chat endpoint.Install LLM Tornado via NuGet:
dotnet add package LlmTornado
Optional addons:
dotnet add package LlmTornado.Agents # Agentic framework, higher-level abstractions
dotnet add package LlmTornado.Mcp # Model Context Protocol (MCP) integration
dotnet add package LlmTornado.A2A # Agent2Agent (A2A) integration
dotnet add package LlmTornado.Microsoft.Extensions.AI # Semantic Kernel interoperability
dotnet add package LlmTornado.Contrib # productivity, quality of life enhancements
Inferencing across multiple providers is as easy as changing the ChatModel argument. Tornado instance can be constructed with multiple API keys, the correct key is then used based on the model automatically:
…
Instead of passing in a strongly typed model, you can pass a string instead: await api.Chat.CreateConversation("gpt-5-mini"), Tornado will automatically resolve the provider.
OpenAI API keys continue to support normal text and image models, while ChatGPT subscription access for Codex is explained in the Codex guide.
Tornado has a powerful concept of VendorExtensions which can be applied to various endpoints and are strongly typed. Many Providers offer unique/niche APIs, often enabling use cases otherwise unavailable. For example, let's set a reasoning budget for Anthropic's Claude 3.7:
…
Instead of consuming commercial APIs, one can easily roll their inference servers with a plethora of available tools. Here is a simple demo for streaming response with Ollama, but the same approach can be used for any custom provider:
…
https://github.com/user-attachments/assets/de62f0fe-93e0-448c-81d0-8ab7447ad780
Tornado offers three levels of abstraction, trading more details for more complexity. The simple use cases where only plaintext is needed can be represented in a terse format:
await api.Chat.CreateConversation(ChatModel.Anthropic.Claude3.Sonnet)
.AppendSystemMessage("You are a fortune teller.")
.AppendUserInput("What will my future bring?")
.StreamResponse(Console.Write);
The levels of abstraction are:
Response (string for chat, float[] for embeddings, etc.)ResponseRich (tools, modalities, metadata such as usage)ResponseRichSafe (same as level 2, guaranteed not to throw on network level, for example, if the provider returns an internal error or doesn't respond at all)When plaintext is insufficient, switch to StreamResponseRich or GetResponseRich() APIs. Tools requested by the model can be resolved later and never returned to the model. This is useful in scenarios where we use the tools without intending to continue the conversation:
…
No open issues yet, or sync has not completed.