AI機能
cMindのAIレイヤーはプロバイダー非依存です。すべての機能は単一のプロバイダー中和的な接着剤
(IAiClient.CompleteAsync)と通信し、ルーティングクライアントがアクティブなプロバイダー
認証情報を解決して、一致するWireアダプターにディスパッチします。プロバイダ + モデル +
エンドポイント(および必要に応じてキー)を選択すれば、既存のすべての機能が同じゲーティング、暗号化、
レジリエンス、低下で動作します。
組み込み済み: 組み込みローカルLLMがアプリにバンドルされデフォルトで有効です (Microsoft.ML.OnnxRuntimeGenAI、例:Phi-3.5-mini) — したがって、すべてのデプロイがAPIキー不要、 外部サービスなしで動作するAIを備えています。ホワイトラベルデプロイはそれを削除して、ユーザーが 追加できるプロバイダを制限できます。組み込み以外にも、任意のプロバイダに接続できます。
対応プロバイダー:
- 組み込みローカルAI(
BuiltInOnnx)— インプロセスのONNX GenAIモデル、キー不要、船載 + デフォルトオン。 - Anthropic(Claude — Messages API)
- OpenAI および Azure OpenAI(Chat Completions)
- Google Gemini(
generateContent) - 任意のOpenAI互換エンドポイント、ローカルモデル(Ollama、LM Studio、vLLM、
llama.cpp
server、LocalAI)およびOpenAI互換クラウド(Kimi / Moonshot(https://api.moonshot.ai/v1/)、OpenRouter、Groq、Together、Mistral、DeepSeek)を含む — すべて1つの OpenAI互換アダプター経由、ベースURL + モデル + キーのみで異なる。「プロバイダ追加」ダイアログは ワンクリックプリセット(Kimi、OpenAI、OpenRouter、Groq、DeepSeek、Mistral、Ollama、LM Studio)を提供し、 ベースURL + サンプルモデルを自動入力します。
同時に1つのプロバイダーのみがアクティブです。認証情報は暗号化されて保存
(AiProviderCredential集約 + IAiProviderStore + ISecretProtector、EncryptionPurposes.AiApiKey);
ローカルエンドポイントにはキー不要。アクティブなプロバイダーなしの場合、すべての機能は
無効結果を返し、アプリの残りの部分は変更なしで動作します(プラットフォームのビルド、テスト、実行にキーは不要)。
後方互換性: 既存のデプロイのレガシーApp:Ai:ApiKey(または古い暗号化されたai.api_key設定)は
自動的にデフォルトのアクティブAnthropicプロバイダーとして認識されます — ゼロアクション。
AI未設定 → AIページはアクションを淡色表示し、バナーとSettings → AIでプロバイダを追加する
ワンタイムプロンプトを表示(AiFeatureNotice)。ステータス:GET /api/ai/status
({ enabled, kind, model }); プロバイダ管理(所有者専用)はGET/PUT /api/ai/providers、
POST /api/ai/providers/{id}/activate、DELETE /api/ai/providers/{id}、
POST /api/ai/providers/{id}/test(接続テスト)を介して管理。
デプロイデフォルト vs ユーザーのプロバイダ
AI認証情報には2つのスコープがあります:
- デプロイデフォルト(所有者管理)。 所有者がプロバイダを設定(または
App:Ai:Providers[]/ レガシーApp:Ai:ApiKey経由で船載)。これはすべてのユーザーの共有デフォルト になります — ブローカーまたはホストプロバイダーがユーザーごとのセットアップとユーザーごとの制限なしで すべてのユーザーのAIに資金を提供できます。所有者のみ/api/ai/providersルートで管理。 - ユーザーのプロバイダ(自己管理)。 サインインしたユーザーは
GET/PUT /api/ai/my-providers、POST /api/ai/my-providers/{id}/activate、DELETE /api/ai/my-providers/{id}で自分のプロバイダを 追加できます。存在する場合、自分のアクティブなプロバイダが自分のAI機能のデプロイデフォルトを オーバーライドします; 削除するとデフォルトにフォールバック。
解決順序(AiProviderStore、リクエストユーザーごと):ユーザーのアクティブな認証情報 →
デプロイデフォルト → レガシー設定キー → なし(AI無効)。各スコープで正確に1つの認証情報が
アクティブで(OwnerUserIdごとの部分的一意インデックス)、各スコープは獨立して解決されるため、
ユーザーが自分のキーをアクティブにしても共有デフォルトを乱すことはありません。
バックグラウンド/非Webコンテキスト(リクエストユーザーなし)は常にデプロイデフォルトを解決。
プロバイダ機能マトリックス
機能はプロバイダーごとにデフォルトがあり、所有者がオーバーライド可能。機能がオフの場合、 フィーチャは低下し、決してスローしません:ウェブ検索はサイレントにドロップ; ビジョンは型付き機能未サポート失敗を返します。
| プロバイダ | Kind | デフォルトベースURL | キー要 | ウェブ検索 | ビジョン | 備考 |
|---|---|---|---|---|---|---|
| 組み込みローカルAI | BuiltInOnnx | n/a(インプロセス) | 不要 | ✖ | ✖ | 船載ONNX GenAIモデル、デフォルトオン |
| Anthropic | Anthropic | https://api.anthropic.com/ | 要 | ✅ | ✅ | Messages API、web_searchツール |
| OpenAI | OpenAiCompatible | https://api.openai.com/v1/ | 要 | オプトイン | オプトイン | Chat Completions |
| Azure OpenAI | AzureOpenAi | https://<resource>.openai.azure.com/ | 要 | ✅ | ✅ | デプロイパス + api-version |
| Google Gemini | Gemini | https://generativelanguage.googleapis.com/ | 要 | ✅ | ✅ | generateContent、google_searchグリンディング |
| Ollama(ローカル) | OpenAiCompatible | http://localhost:11434/v1/ | 不要 | ✖ | モデル依存 | OpenAI互換アダプター経由 |
| LM Studio(ローカル) | OpenAiCompatible | http://localhost:1234/v1/ | 不要 | モデル依存 | モデル依存 | OpenAI互換アダプター経由 |
| vLLM / llama.cpp / LocalAI | OpenAiCompatible | サーバーURL | 不要 | ✖ | モデル依存 | OpenAI互換アダプター経由 |
| OpenRouter / Groq / Together / Mistral / DeepSeek | OpenAiCompatible | プロバイダURL | 要 | ✖ | モデル依存 | OpenAI互換アダプター経由 |
プロパイダごとの設定ガイド(キー、URL、モデルID、UI手順):AIプロバイダー — 設定カタログを参照。
組み込みローカルAI(船載、デフォルトオン)
cMindはMicrosoft.ML.OnnxRuntimeGenAI経由でインプロセスで 動作する実際のローカルLLMをバンドルしています(Phi-3.5-miniなどのコンパクトなインストラクションモデル)。 APIキー不要、外部サービス不要で、最初の起動時 — プロバイダが設定されておらず、 ホワイトラベルゲートが許可している場合に — 自動的にシードおよびアクティブ化されます、 そのためすべてのデプロイが箱から出してすぐに動作するAIを備えています。
- モデルディレクトリ(
genai_config.json+ トークナイザ + 重み)はApp:Ai:BuiltIn:ModelPathで設定(デフォルトmodels/onnx、アプリベースディレクトリからの相対パス)。 モデルファイルが存在しない場合、プロバイダは型付き失敗とインストールヒントに低下します — スローすることはなく、アプリの残りに影響しません。 - すべてのテキストAI機能を強化します。コンパクトなモデルであるため、テキストのみ (サーバーサイドのウェブ検索またはビジョンなし)、生成はシリアル化されます (1つのモデルインスタンス、遅延読み込み後に再利用)。
- 複数の組み込みモデルが共存できます。 ダウンロードされた各モデルは
ModelPath/<key>の下に存在します。キュレーションされたカタログ(Phi-3.5-miniデフォルト、およびPhi-3-mini-128k)をSettings → AIからダウンロードして切り替えることができます。組み込みサブモデルを選択するとインプロセスでロードされます。モデルの取得/バンドル:AIプロバイダー → 組み込みを参照。
ホワイトラベルコントロール
App:Branding(サーバーサイドで各プロバイダ upsert に適用)を通じてAIを制限:
AllowBuiltInAi(デフォルトtrue)—falseに設定すると組み込みモデルを完全に削除。AllowLocalProviders(デフォルトtrue)—falseに設定するとローカル/自己ホストエンドポイント (ループバック/プライベートOpenAI互換、例:Ollama/LM Studio/vLLM)を禁止。AllowedAiProviderKinds(デフォルト空 = すべて)— デプロイが承認するkindのみを列表 (例:["Anthropic","OpenAiCompatible"])、ユーザーが追加できるプロバイダを制限。AllowAiModelManagement(デフォルトtrue)—falseに設定するとモデル閲覧、ページごとのモデルセレクター、および機能ごとのモデルバインディングを非表示にします。すべては所有者がSettings → Deploymentからランタイムで調整可能であり(IOptionsMonitorでライブオーバーレイ)、WhiteLabelCatalogにカタログ化されています。
拡張:将来の組み込みモデル
AIレイヤーは成長するようにアダプター基盤で構築されています。各プロバイダは
AiProviderKindによって選択され、feature-facingシーム(IAiClient/AiFeatureService)は
決して変更されません。後で新しい組み込みモデルランタイムを追加する場合
(別のONNXモデル、別のインプロセスエンジン、GGUF/llama.cppインプロックなど)は、ローカライズされた
変更です:AiProviderKindを追加し、1つのIAiProviderアダプターを実装して登録し、
(オプションで)デフォルトシード + ダイアログオプションを配線 — 機能、エンドポイント、MCPツールの
変更なし。組み込みONNXプロバイダはこのパターンの参照実装です。
機能
- cBotを構築 —
/ai/buildのプロジェクトベースのワークショップ:新しいcBotを作成(一意の名前 + 言語)するか既存のもの(ソースを含む)を改善し、/ai/build/{projectId}でモデルとチャットしてコードを書いて洗練。すべてのプロンプトとモデルの返信はタイムスタンプ付きで永続化され、ナビゲーション/リロード後も生存; モデルのソースは各ターンでプロジェクトに適用されます。同じページからビルドおよび実行(またはフルエディタで開く)。各プロジェクトは、最終変更時刻と表示/削除コントロール付きでリストに表示されます。 - ページごとのモデル選択 — すべてのAI機能ページとダイアログにモデルセレクターが表示され、使用可能なモデル(自分のプロバイダ + デプロイデフォルト)が列表されます。機能の保存されたバインディングが設定されている場合は事前選択し、そうでない場合はデフォルトモデルを事前選択します。選択したモデルはその1つのアクション(
?modelId=として送信され、RoutingAiClientによってその呼び出しに対して強制)に適用されます。デプロイがモデル管理を無効にする場合は非表示。 - モデルを参照して選択、機能ごと — プロバイダエンドポイント(LM Studio / Ollama / vLLM / llama.cppの
GET /v1/models、または組み込みカタログ)がアドバタイズするモデルを参照します。IDを手入力する代わりに、各AI機能を別のモデルにバインドして、複数のモデルが異なる機能を一度に提供します(バインドされていない機能はスコープのデフォルトプロバイダーにフォールバック)。 - パラメータ最適化 — クローズドループ:AIがパラメータセットを提案し、それぞれが永続化され、
ノード全体でバックテストされます(
optimize-run/optimize-params)。 - 自律型ポートフォリオエージェント — フル決定ジャーナル付きのマンデート駆動プロポーザル
(
AgentMandate→AgentProposal)。 - Actingリスクガード —
AiRiskGuardバックグラウンドサービスが実行中のBOTを評価し、 重大なリスク時に自動停止できます(オプトイン)。 - Prop-firmエクスポージャーガーディアン — ドローダウン/エクスポージャー制限と自動フラット化。
- マーケットアラート — プロバイダがサポートしている場合、ウェブ検索グリunedの
AIセンチメント付きで
AlertRuleエンジンを使用。 - 分析 — cBotレビュー、バックテスト分析、事後分析、マーケットセンチメント、 チャートビジョン設計、マーケットプレイスキュレーション。
サーフェス
/api/ai/*下のWebエンドポイント(AIビルドチャットbuild/{id}/prompt+build/{id}/messages、generate-project、review、analyze-backtest、optimize-params、optimize-run、post-mortem、sentiment、vision、curate、…)。すべての機能エンドポイントは、選択したモデルでその1つの呼び出しを実行するためのオプション?modelId=<credential>を受け入れます。さらにモデル発見(/api/ai/models/probe、/api/ai/usable-models)および機能ごとのバインディング(/api/ai/feature-bindings、/api/ai/my-feature-bindings)。cBotプロジェクト、ビルド、および実行は、ビルダーエンドポイント(/api/builder/projects…)を再利用します。- AIクライアント向けMCPツール(
AiTools)— mcp.mdを参照。 プロバイダ選択はMCPクライアントに対して透過的。 - AI ナビグループ — 機能ごとのBlazorページ:cBotを構築(
/ai/build)、 レビュー(/ai/review)、デベート(/ai/debate)、マーケットセンチメント(/ai/sentiment)、 エクスポージャーチェック(/ai/exposure)、ポートフォリオ摘要(/ai/digest)、 チューンアドバイザー(/ai/tune)、最適化(/ai/optimize)、+ ポートフォリオエージェント、アラート、MCPキー。ページはAiFeaturePageBase+AiOutputPanel+AiModelSelectを共有; プロバイダが設定されていない場合、各ページはAiFeatureNoticeを表示。 - Settings → AI(
/settings/ai、所有者のみ)— プロバイダリスト + プロバイダ追加/編集ダイアログ(kind、ベースURL(kind別のヒント付き)、ワンクリックOpenAI互換プリセット(Kimi/Moonshot、Ollama、LM Studio を含む)、モデル、オプションのキー、機能トグル、「デフォルトに設定」)+ 接続テストボタン。
設定
App:Aiはレガシー単一キーとマルチプロバイダー seeding の両方をサポート:
- レガシー:
ApiKey、Model(デフォルトclaude-opus-4-8)、BaseUrl、MaxTokens— まだデフォルトのAnthropicプロバイダーとして認識されています。 - マルチプロバイダー:
ActiveProvider(kind)およびProviders[]({ Kind, BaseUrl, Model, ApiKey?, MaxTokens?, Capabilities? }) — 認証情報がまだ存在しない場合、起動時にストアにインポートされるため、 オプションチームはappsettings/envのみで(ローカルLLMを含む)設定されたデプロイを船載できます。
RiskGuardEnabled、RiskGuardAutoStop、RiskGuardIntervalは変更なし。テスト/開発用、設定キーは
統合されたdev-credentials fileのAi下に存在します。
信頼性
プロバイダは信頼できないものとして扱われます — プロバイダが何をする場合でも、 アプリをダウンさせることはできません。これはクラウドとローカルエンドポイントで同一に保持されます (デッドOllamaはスロットルされたAnthropicと正確に同じ方法でリトライ затем低下):
- グレースフル低下。 すべての失敗モード(プロバイダなし、HTTP 4xx/5xx/429、タイムアウト、
不正なボディ、空のコンテンツ、未サポート機能)は型付き
AiResult.Fail(reason)を返します — クライアントはページ、MCPツール、ホストサービスにスローしません。 - レジリエンスパイプライン。
AddAiHttpClientは、1つの共有AIHttpClientに一時的な 5xx/ネットワーク障害に対するバウンドリトライ(指数バックオフ + ジャター) + 各試行および合計タイムアウト(AiHttp)を与え、すべてのアダプターで再利用されます。
fakeローカルLLMでのテスト
AIレイヤーは、FakeLocalLlmServerにより外部依存なしで end-to-end で証明されます —
小さなインプロセスOpenAI互換エンドポイントでdeterministicな固定replyを返し、
Ollama/LM Studio/vLLMとwire-identicalです。これは以下をバックアップします:
- ユニット — アダプターごとのリクエスト翻訳 + レスポンス解析テスト、ルーティング/機能低下。
- 統合 — OpenAI互換アダプターのend-to-end、すべてのアダプターにわたるパラメータ化された レジリエンス理論、MCP AIツール。
- E2E —
AiLocalFixtureはアプリを出力先が fakeサーバー(または開発者がAI_E2E_BASEURL(+ オプションAI_E2E_API_KEY/AI_E2E_KIND/AI_E2E_MODEL)を設定した場合は 実際のプロバイダ — 実際の 자격情報優先)にポインターして起動し、実際のUIを通じて すべてのAI機能を駆動します。AI機能を追加または変更する場合は、このfixtureを通じたE2Eテストが 必要です(repoテストマンデートを参照)。 オプトインレーン(AI_LOCAL_LLM=1)はOllama Testcontainerを介して1つの実際の完了を実行します。
組み込みローカルAI — デフォルトでゼロ設定
組み込みONNXローカルLLMは箱から出してすぐに動作します:モデルディレクトリが存在せず、
App:Ai:BuiltIn:AutoDownloadがtrue(デフォルト)の場合、appは一度だけバックグラウンドで
App:Ai:BuiltIn:DownloadBaseUrlからモデルをダウンロードします。ダウンロード実行中、AI呼び出し
(およびSettings → AIの接続テスト)は明確な「モデルをダウンロード中(初回セットアップ)」メッセージを
返し、ハード障害ではありません。エアギャップ/従量制デプロイはAutoDownload=falseを設定し、
App:Ai:BuiltIn:ModelPathでモデルディレクトリを事前プロビジョニングします。
App:Branding:AllowBuiltInAiゲートはまだ適用されます。
ダウンロードはまた、組み込みモデルがアクティブなプロバイダである場合、起動時に事前ウォーミングされます、
最初のAIクリック前に準備が整っているため、「ダウンロード中…」でそのクリックを失敗させる代わりに。Settings → AI
は組み込みプロバイダカードのライブインストール状態を表示 — モデル準備完了 / モデルをダウンロード中… /
モデルがインストールされていない / ダウンロード失敗 — オンデマンド背景フェッチをキックする
モデルをダウンロード(またはダウンロードを再試行)ボタン付き(GET /api/ai/built-in/status、
POST /api/ai/built-in/install)。Settings から組み込みプロバイダを有効にすると、
すでにシードされた行を再利用する代わりに、単一アクティブプロバイダ制約で重複しないようにします。