building enterprise multi-agent workflows in .net with mistral A developer built Mistral.Agents.Net, an open-source .NET library that wraps Mistral's Agents API to enable enterprise multi-agent workflows. The library supports persistent agents, stateful conversations, tool integrations, and agent handoffs, filling a gap in existing .NET SDKs that only cover chat completions and embeddings. most people know Mistral https://mistral.ai for its chat models. the part i find more interesting for enterprise work is the Agents API https://docs.mistral.ai/studio-api/agents/introduction : persistent agents with instructions and tools, stateful conversations you can resume, built-in connectors web search, code interpreter, document library , and handoffs so one agent can delegate to another. the .net story stops short of this. the community sdks tghamm's is genuinely good cover chat completions, embeddings and function calling. they don't cover the agentic layer. so if you're a .net shop that wants to build a multi-agent workflow on mistral, you're writing raw http. i didn't want to, so i built Mistral.Agents.Net https://github.com/ivanjurina/mistral-agents-dotnet . here's the design and the one wire-format detail that cost me a debugging session. a chat completion is stateless: you send messages, you get a reply, you manage all the history yourself. an agent is a stored object with instructions and tools, and a conversation is a stateful thread you can continue by id. that difference matters for enterprise workflows, where a "session" spans many turns and you want the platform to hold the state. js var agent = await client.CreateAgentAsync new CreateAgentRequest { Model = "mistral-medium-latest", Name = "Financial Analyst", Instructions = "Use the code interpreter for math and web search for current facts.", Tools = { AgentTool.CodeInterpreter , AgentTool.WebSearch }, } ; using var turn = await client.StartConversationAsync new StartConversationRequest { AgentId = agent.Id, Inputs = "what was 15% of last quarter's revenue if it was 12.4M?", } ; Console.WriteLine turn.OutputText ; the response isn't a single message. it's a list of outputs: tool executions, message chunks, function calls, handoffs. the library gives you OutputText for the common case and Outputs for the raw stream, plus a Root JsonElement escape hatch for anything the typed model doesn't cover yet. same philosophy i used for the serpapi and elevenlabs clients: typed where it helps, raw where you need it. the enterprise-interesting feature is handoffs. you give an agent the ids of other agents it may delegate to, and the platform routes work between them. js var researcher = await client.CreateAgentAsync new CreateAgentRequest { Model = "mistral-medium-latest", Name = "Research Agent", Tools = { AgentTool.WebSearch }, } ; var analyst = await client.CreateAgentAsync new CreateAgentRequest { Model = "mistral-medium-latest", Name = "Financial Analyst", Handoffs = new List