モデル / データセット
awaescher/OllamaSharp avatar
awaescher/OllamaSharp

OllamaSharp: .NET から Ollama を叩くための薄いラッパーをどう評価するか

The easiest way to use Ollama in .NET

スター 1,404フォーク 187C#MIT

ひと目でわかる

これは何?
OllamaSharp は Ollama の HTTP API を C# の awaitable メソッドに写したバインディングで、Microsoft.Extensions.AI の IChatClient 実装も兼ねる。採用判断の焦点は「Ollama を .NET からどう呼ぶか」ではなく、その薄さが自分のアプリに合うかどうかにある。
誰に向いている?
すでに Ollama をローカルまたはリモートで動かしていて、.NET 側の都合(IChatClient への差し替え、ストリーミング、モデルの pull 進捗表示)を自分で書き足したくないチームに向く。逆に、推論エンジン自体をアプリに同梱したい場合や、Ollama 以外のバックエンドを主軸にする場合は選ばない方がよい。
商用利用できる?
できます。MIT は寛容なライセンスで、著作権表示とライセンス表示を残せば、使用・改変・販売が可能です。
今もメンテナンスされている?
されています。最後のコミットは 54 日前です。
何の言語で書かれている?
主に C# です(GitHub の言語統計による)。

回答はプロジェクトの GitHub データ(最終同期:2026年9月15日)と当サイトの分析に基づくもので、法的助言ではありません。

オープンソース詳細解説

OllamaSharp が埋めているのは HTTP と C# のあいだの隙間だけ

Ollama は HTTP の API を公開している。.NET から使う場合、HttpClient で JSON を投げてレスポンスをデシリアライズすれば動く。OllamaSharp が引き受けているのはこの往復の定型部分で、README は「OllamaSharp provides .NET bindings for the Ollama API」と説明している。推論そのものは Ollama プロセスが行い、ライブラリはそれを呼ぶ側に徹する。だから OllamaSharp を入れたからといってモデルの重みがアプリに同梱されるわけではないし、Ollama がインストールされていないマシンでは何も動かない。README の初期化例は `new Uri("http://localhost:11434")` を渡しており、接続先はあくまで外部プロセスだ。この構造を最初に押さえておくと、後述する制約のほとんどが自明になる。

Chat クラスが会話履歴を持つ、という設計上の選択

README が対話用途の推奨として挙げるのは `Chat` クラスだ。`GenerateAsync` は `/api/generate` に対応し、単発で文脈を持たない補完に向くと説明されている。対して `Chat` はターンをまたいでメッセージ履歴を保持し、ツール呼び出しとその結果まで含めて追跡する。つまり会話状態の管理はアプリ側ではなくライブラリ側にある。これは便利である反面、履歴がクライアントオブジェクトの寿命に縛られることを意味する。長時間動くサーバで `Chat` を使い回すと文脈が積み上がり続けるので、リクエストごとにインスタンスを分けるのか、`Messages` プロパティを明示的に操作するのかを決めておく必要がある。README は `Messages` プロパティに触れているが、履歴の切り詰めやトークン数の管理については記述がない。ここは自分で設計する領域だ。

ストリーミングと進捗は IAsyncEnumerable で返る

OllamaSharp の API 表面は awaitable なメソッドで、レスポンスのストリーミングを前提にしている。README の例では `await foreach (var stream in ollama.GenerateAsync("..."))` のように `IAsyncEnumerable` として受け取り、トークンごとに `Console.Write` している。モデルの取得も同じ形で、`PullModelAsync` が `status.Percent` と `status.Status` を逐次返す。ダウンロードの進捗を UI に出す処理を自前で書かずに済むのは、CLI ツールやデスクトップアプリでは実利がある。一方で、この形は呼び出し側が非同期列挙を最後まで消費することを前提にする。途中で `break` すればストリームは閉じられるが、その挙動がどう扱われるかは README には書かれていない。キャンセルやタイムアウトを厳密に制御したいなら、実装を読んで確かめるべき箇所になる。

導入は NuGet 1 パッケージと URI 2 行から

パッケージは NuGet の `OllamaSharp`、ライセンスは MIT。README の最小例は接続先 URI とモデル名を設定するだけだ。`var ollama = new OllamaApiClient(uri);` のあと `ollama.SelectedModel = "qwen3.5:35b-a3b";` を代入する。以降の操作はこのクライアント経由で行う。ローカルのモデル一覧は `await ollama.ListLocalModelsAsync()`、モデルの取得は前述の `PullModelAsync`。Microsoft.Extensions.AI と組み合わせる場合は `Microsoft.Extensions.AI.Abstractions` を別途入れ、`OllamaApiClient` を `IChatClient` として受け取る。README の例ではプロバイダ名で分岐し、`ollama` なら `new OllamaApiClient(arguments.Uri, arguments.Model)`、それ以外は `OpenAIChatClient` を返す関数を示している。DI に登録する際は `IOllamaApiClient` ではなく `IChatClient` 側の型で解決させる点に注意したい。

Native AOT は既定ではなく、JsonSerializerContext を自分で渡す

Native AOT 対応はオプトインだと README は明記している。既定のシリアライズはリフレクションに依存するため、AOT で publish する場合は独自の `JsonSerializerContext` を用意し、`[JsonSerializable(typeof(MyCustomType))]` を付けた partial クラスを作ってコンストラクタに渡す。README の例では `new OllamaApiClient(uri, "qwen3.5:35b-a3b", MyJsonContext.Default)` という形になっている。ここで注意したいのは、自分が送受信する型を自分で登録しなければならない点だ。Ollama の API はモデル管理や埋め込みなど多様なレスポンスを返すので、AOT を選ぶならアプリが実際に触る型を洗い出してコンテキストに並べる作業が発生する。トリミングや AOT を必須要件にしているプロジェクトでは、この追加コストを見積もったうえで採用を決めるべきだ。

向かないケース: Ollama を同梱したい、あるいは他プロバイダが主軸のとき

OllamaSharp は Ollama プロセスが別に存在することを前提にする。アプリのインストーラにモデルとランタイムを丸ごと入れ、ユーザに何も入れさせたくない、という要件には答えられない。その場合は推論ランタイムを直接ホストするライブラリを検討することになる。もうひとつの境界はプロバイダの抽象だ。Microsoft.Extensions.AI 経由で `IChatClient` として使えば OpenAI 互換のクライアントと差し替えられるが、これはあくまで抽象側の話で、OllamaSharp 自体は Ollama 固有の API を覆っている。Ollama にしかない操作(モデルの pull や create、進捗レポート)に依存したコードを書くと、他プロバイダへの差し替えは効かなくなる。抽象に寄せる部分と Ollama 固有機能を使う部分を、最初から分けておくのが現実的だ。

Microsoft.Extensions.AI 実装としての位置づけと、Semantic Kernel との関係

README は OllamaSharp を Microsoft.Extensions.AI の `IChatClient` と `IEmbeddingGenerator<string, Embedding<float>>` の実装だと述べ、Microsoft のパッケージページへのリンクを「Recommended by Microsoft」として掲げている。また Semantic Kernel や .NET Aspire で使われているとも書かれている。ただし、これらの記述は README の主張であって、この記事の執筆時点で当方が検証したものではない。判断材料として使うなら、自分の依存するバージョンの `Microsoft.Extensions.AI.Abstractions` と OllamaSharp の組み合わせが実際に解決できるかを、`dotnet restore` の時点で確かめるのが早い。抽象インターフェースは preview 段階の変更が入りやすい領域なので、パッケージのバージョン固定は他の依存より厳しくしておく価値がある。

メンテナンス頻度とライセンスから見た継続コスト

リポジトリはアーカイブされておらず、既定ブランチは `main`。直近のリリースは 5.4.30、5.4.29、5.4.28 と短い間隔で並んでおり、活発に更新されていることが読み取れる。ただし更新が速いことは、逆に言えばバージョンを上げるたびに差分を確認する必要があるということでもある。Ollama 本体の API 追加に追随する性質のライブラリなので、Ollama をアップグレードするときは OllamaSharp も同時に上げる前提で運用を組む方が素直だ。ライセンスは MIT で、表示義務や派生物の扱いに関する条件は緩い部類に入る。とはいえ、同梱する Ollama 本体や利用するモデルの重みはそれぞれ別のライセンスに従う。OllamaSharp が MIT だからといって、アプリ全体の配布条件が決まるわけではない。この切り分けは法務ではなく設計の一部として扱っておきたい。

編集部の結論

すでに Ollama をローカルまたはリモートで動かしていて、.NET 側の都合(IChatClient への差し替え、ストリーミング、モデルの pull 進捗表示)を自分で書き足したくないチームに向く。逆に、推論エンジン自体をアプリに同梱したい場合や、Ollama 以外のバックエンドを主軸にする場合は選ばない方がよい。導入前に確認すべきは、対象モデルが Ollama 側で動くこと、そして Microsoft.Extensions.AI の抽象に寄せるなら OllamaApiClient を IChatClient として受け取る経路が自分の DI 構成に収まることの2点。

公式情報源

  1. awaescher/OllamaSharp on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
コミュニティノート

コミュニティノート