<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Denis Makushevskii</title>
    <description>The latest articles on DEV Community by Denis Makushevskii (@makushevskii).</description>
    <link>https://dev.to/makushevskii</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3589932%2Fa20c21e0-a7f6-44b0-ad4d-d94ced1795ba.jpg</url>
      <title>DEV Community: Denis Makushevskii</title>
      <link>https://dev.to/makushevskii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/makushevskii"/>
    <language>en</language>
    <item>
      <title>Cohere in .NET in 10 Minutes: Microsoft.Extensions.AI + the Cohere.Extensions.AI NuGet Package</title>
      <dc:creator>Denis Makushevskii</dc:creator>
      <pubDate>Sun, 09 Nov 2025 17:01:09 +0000</pubDate>
      <link>https://dev.to/makushevskii/cohere-in-net-in-10-minutes-microsoftextensionsai-the-cohereextensionsai-nuget-package-3c7f</link>
      <guid>https://dev.to/makushevskii/cohere-in-net-in-10-minutes-microsoftextensionsai-the-cohereextensionsai-nuget-package-3c7f</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; connect Cohere to .NET in 10 minutes. I’ll show two approaches:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;direct call to the Chat API V1/V2&lt;/li&gt;
&lt;li&gt;using the unified &lt;code&gt;Microsoft.Extensions.AI&lt;/code&gt; interface (&lt;code&gt;IChatClient&lt;/code&gt;) - provider-agnostic code.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  A short intro
&lt;/h2&gt;

&lt;p&gt;I’m experimenting with &lt;code&gt;Microsoft.Extensions.AI&lt;/code&gt; and want to share the results: I wrote a small Cohere adapter and published it to NuGet. Maybe someone will find it useful, and I’d love to get feedback.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;Microsoft.Extensions.AI&lt;/code&gt; it became easier to plug LLMs into .NET projects: we now have unified abstractions (&lt;code&gt;IChatClient&lt;/code&gt;), DI and minimal vendor lock-in. Cohere is not supported out of the box, so I made a lightweight adapter and published it to NuGet. This article shows how to run a Cohere chat in .NET in ten minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Cohere and why .NET developers should care
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cohere&lt;/strong&gt; is an LLM provider focused on enterprise needs: data privacy, turnkey deployments, and practical company-oriented features (document QA, summarization, multilingual responses, etc.). Cohere provides a Chat API, embeddings, and &lt;strong&gt;Rerank&lt;/strong&gt; for improving search and RAG pipelines.&lt;/p&gt;

&lt;p&gt;Cohere develops the Command R / Command R+ family of models, optimized for long context and RAG (retrieval-augmented generation) scenarios. That makes them useful for document search, chatbots and analytics systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; if you build on top of &lt;code&gt;Microsoft.Extensions.AI&lt;/code&gt; you can integrate Cohere into .NET and easily switch to another provider later without rewriting your business logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why consider Microsoft.Extensions.AI
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Microsoft.Extensions.AI&lt;/code&gt; gives a common interface (&lt;code&gt;IChatClient&lt;/code&gt;) for different LLMs. Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unified message model and call patterns (including streaming),&lt;/li&gt;
&lt;li&gt;works nicely with DI / Options / ILogger,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;minimal vendor lock-in&lt;/strong&gt; - you can swap the provider without changing application code.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package Cohere.Extensions.AI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get an API key from the Cohere dashboard: &lt;a href="https://dashboard.cohere.com/api-keys" rel="noopener noreferrer"&gt;https://dashboard.cohere.com/api-keys&lt;/a&gt;. Provide the API key via an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Windows PowerShell&lt;/span&gt;
&lt;span class="nv"&gt;$env&lt;/span&gt;:COHERE_API_KEY&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_api_key"&lt;/span&gt;

&lt;span class="c"&gt;# macOS/Linux (bash/zsh)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;COHERE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_api_key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Option 1 - Direct call to Cohere Chat API V2
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Cohere.Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Cohere.Client.Models.V2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CohereClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"COHERE_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;)!);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ChatV2Async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ChatRequestV2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Model&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"command-r-08-2024"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Messages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Role&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Content&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: Cohere Chat API supports roles, tool-use and more - see the official docs for details.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Option 2 - Via &lt;code&gt;Microsoft.Extensions.AI&lt;/code&gt; (the unified &lt;code&gt;IChatClient&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;If you prefer to write application code on top of common abstractions, use the adapter from the package (&lt;code&gt;CohereChatClient&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Cohere.Extensions.AI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.AI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.DependencyInjection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ServiceCollection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddCohereChatClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModelId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"command-r-plus-08-2024"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildServiceProvider&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;chat&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRequiredService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IChatClient&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ChatMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ChatRole&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Ping"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetResponseAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your business layer already works with &lt;strong&gt;&lt;code&gt;IChatClient&lt;/code&gt;&lt;/strong&gt;, and switching to another provider becomes trivial. (That’s exactly what ME.AI is designed for.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c91xg7uihy676zkvbat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c91xg7uihy676zkvbat.png" alt="Console output screenshot" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The library also supports streaming responses via &lt;code&gt;IAsyncEnumerable&lt;/code&gt; (SSE). This matters for UX: you can show text as it’s generated instead of waiting for the full answer.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;p&gt;Planned features: extended parameters (temperature, max tokens) and OpenTelemetry integration. If you want to contribute - PRs are welcome.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This project was an experiment for me: I wanted to try combining .NET and Cohere using Microsoft’s new abstractions. I’d be glad if someone tries the package, stars the GitHub repo, or writes what’s missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;README and examples&lt;/strong&gt; (the same snippets above): &lt;a href="https://github.com/makushevski/Cohere.Extensions.AI" rel="noopener noreferrer"&gt;https://github.com/makushevski/Cohere.Extensions.AI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cohere Chat API / Chat V2&lt;/strong&gt; - roles, messages, tool-use: &lt;a href="https://cohere.com" rel="noopener noreferrer"&gt;https://cohere.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft.Extensions.AI (&lt;code&gt;IChatClient&lt;/code&gt;)&lt;/strong&gt; - what it is and why use it: &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.ai.ichatclient?view=net-9.0-pp" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.ai.ichatclient?view=net-9.0-pp&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>dotnet</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
