Skip to main content

Ciri AI

Lapisan AI cMind ialah agnostik pembekal. Setiap ciri bercakap dengan satu camar seams provider-neutral (IAiClient.CompleteAsync); klien routing menyelesaikan bukti pembekal aktif dan menghantar ke adaptor wayar yang sepadan. Anda memilih pembekal + model + titik akhir (dan, jika pembekal memerlukan nó, kunci); setiap ciri sedia ada berfungsi tidak berubah dengan gerbang, penyulitan, keteguhan, dan kemerosotan yang sama.

Bateri incluida: LLM tempatan terbina dalam dihantar dengan apl dan dilaktifkan secara lalai (Microsoft.ML.OnnxRuntimeGenAI, cth Phi-3.5-mini) — jadi setiap penempatan mempunyai AI yang berfungsi tanpa kunci API dan tanpa perkhidmatan luaran. Penempatan white-label boleh mengalihkannya dan mengekang pembekal yang boleh ditambah oleh pengguna. Melampaui terbina dalam, sambungkan mana-mana pembekal luaran.

Pembekal yang disokong:

  • AI tempatan terbina dalam (BuiltInOnnx) — model GenAI ONNX dalam-proses, tiada kunci, dihantar + lalai aktif.
  • Anthropic (Claude — Messages API)
  • OpenAI dan Azure OpenAI (Chat Completions)
  • Google Gemini (generateContent)
  • Mana-mana titik akhir OpenAI-serasakan, termasuk model tempatan (Ollama, LM Studio, vLLM, server llama.cpp, LocalAI) dan awan OpenAI-serasakan (Kimi / Moonshot di https://api.moonshot.ai/v1/, OpenRouter, Groq, Together, Mistral, DeepSeek) — kesemuanya melalui satu adaptor OpenAI-serasakan, berbeza hanya dengan URL asas + model + kunci. Dialog tambah pembekal menawarkan preset satu-klik (Kimi, OpenAI, OpenRouter, Groq, DeepSeek, Mistral, Ollama, LM Studio) yang mengisi URL asas + model sampel.

Tepat satu pembekal aktif pada satu masa. Kredensi disimpan disulit (AiProviderCredential agregat + IAiProviderStore + ISecretProtector, EncryptionPurposes.AiApiKey); titik akhir tempatan memerlukan tiada kunci. Dengan tiada pembekal aktif, setiap ciri mengembalikan keputusan dilumpuhkan dan baki apl berjalan tidak berubah (tiada kunci diperlukan untuk bina, uji, atau jalankan platform).

Keserasian laluan: App:Ai:ApiKey legacy penempatan sedia ada (atau tetapan ai.api_key tersulit lama) dihormati secara automatik sebagai pembekal aktif Anthropic lalai — tindakan sifar diperlukan.

AI tidak dikonfigur → halaman AI meredupkan tindakan dan menunjukkan sepanduk serta segera gesaan untuk menambah pembekal dalam Tetapan → AI (AiFeatureNotice). Status di GET /api/ai/status ({ enabled, kind, model }); pembekal diurus (pemilik sahaja) melalui GET/PUT /api/ai/providers, POST /api/ai/providers/{id}/activate, DELETE /api/ai/providers/{id}, dan POST /api/ai/providers/test ping sambungan.

Lalai penempatan vs pembekal sendiri pengguna​

Kredensi AI mempunyai dua skop:

  • Lalai penempatan (diurus pemilik). Pemilik mengkonfigur pembekal (atau menghantar satu melalui App:Ai:Providers[] / App:Ai:ApiKey legacy). Ia menjadi lalai kongsi untuk setiap pengguna — jadi broker atau pembekal hosted boleh membiayai AI untuk semua pengguna mereka dengan tiada persediaan setiap pengguna dan tanpa had setiap pengguna. Diurus melalui laluan /api/ai/providers pemilik sahaja di atas.
  • Pembekal sendiri pengguna (layanan diri). Mana-mana pengguna yang daftar masuk boleh menambah pembekal mereka sendiri di bawah GET/PUT /api/ai/my-providers, POST /api/ai/my-providers/{id}/activate, DELETE /api/ai/my-providers/{id}. Apabila hadir, pembekal aktif mereka sendiri mengatasi lalai penempatan untuk ciri AI mereka sendiri; mengalihkannya kembali ke lalai.

Kekeruhan pesanan (dalam AiProviderStore, setiap permintaan pengguna): bukti aktif pengguna sendiri → lalai penempatan → kunci konfigurasi legacy → none (AI dilumpuhkan). Tepat satu bukti aktif setiap skop (indeks unik separa setiap OwnerUserId), dan setiap skop diselesaikan secara bebas, jadi pengguna yang mengaktifkan kunci mereka sendiri tidak pernah mengganggu lalai kongsi. Konteks latarbelakang/non-Web (tiada pengguna permintaan) sentiasa menyelesaikan lalai penempatan.

Matriks keupayaan pembekal​

Keupayaan lalai setiap pembekal dan boleh ditindih oleh pemilik. Apabila keupayaan dimatikan ciri merosot, tidak pernah membaling: carian web senyap dibuang; visinya mengembalikan kegagalan taip tidak disokong keupayaan.

PembekalJenisURL Asas LalaiKunci diperlukanCarian webVisiNota
AI tempatan terbina dalamBuiltInOnnxt/a (dalam-proses)tidak✖✖model GenAI ONNX dihantar, lalai aktif
AnthropicAnthropichttps://api.anthropic.com/ya✅✅Messages API, alat web_search
OpenAIOpenAiCompatiblehttps://api.openai.com/v1/yapilihanpilihanChat Completions
Azure OpenAIAzureOpenAihttps://<resource>.openai.azure.com/ya✅✅laluan deployment + api-version
Google GeminiGeminihttps://generativelanguage.googleapis.com/ya✅✅generateContent, pembingkaian google_search
Ollama (tempatan)OpenAiCompatiblehttp://localhost:11434/v1/tidak✖bergantung modelmelalui adaptor OpenAI-serasakan
LM Studio (tempatan)OpenAiCompatiblehttp://localhost:1234/v1/tidakbergantung modelbergantung modelmelalui adaptor OpenAI-serasakan
vLLM / llama.cpp / LocalAIOpenAiCompatibleURL yang servedtidak✖bergantung modelmelalui adaptor OpenAI-serasakan
OpenRouter / Groq / Together / Mistral / DeepSeekOpenAiCompatibleURL pembekalya✖bergantung modelmelalui adaptor OpenAI-serasakan

Panduan persediaan setiap pembekal (kunci, URL, ID model, langkah UI): lihat Panduan persediaan pembekal AI — katalog.

AI tempatan terbina dalam (dihantar, lalai aktif)​

cMind menghantar LLM tempatan sebenar yang berjalan dalam-proses melalui Microsoft.ML.OnnxRuntimeGenAI (model instruct padat seperti Phi-3.5-mini). Ia memerlukan tiada kunci API dan tiada perkhidmatan luaran, dan pada permulaan pertama — apabila tiada pembekal dikonfigur dan gerbang white-label membenarkannya — nó dibibit dan diaktifkan secara automatik, jadi setiap penempatan mempunyai AI yang berfungsi di luar kotak.

  • Direktori model (genai_config.json + tokenizer + pemberat) dikonfigur oleh App:Ai:BuiltIn:ModelPath (lalai models/onnx, relatif kepada direktori asas apl). Apabila fail model tidak hadir pembekal merosot kepada kegagalan taip dengan hint pemasangan — nó tidak pernah membaling, dan baki apl tidak terjejas.
  • Ia menggerakkan setiap ciri AI teks. Menjadi model padat, nó teks sahaja (tiada carian web pelayan atau visi) dan penjanaan disiri (satu contoh model, digunakan semula selepas muat malas).
  • Beberapa model terbina dalam boleh wujud bersama. Setiap model yang dimuat turun tinggal di bawah ModelPath/<key>; katalog terkurasi (Phi-3.5-mini lalai, tambah Phi-3-mini-128k) boleh dimuat turun dan ditukar dari Tetapan → AI. Memilih submodel terbina dalam memuatkan ia dalam-proses. Perolehi/bundle model: lihat Pembekal AI → terbina dalam.

Kawalan white-label​

Penempatan white-label mengekang AI melalui App:Branding (dikuatkuasakan pelayan-side pada setiap kemas kini pembekal):

  • AllowBuiltInAi (lalai true) — tetapkan false untuk mengalih model terbina dalam seluruhnya.
  • AllowLocalProviders (lalai true) — tetapkan false untuk haram titik akhir tempatan/di-host sendiri (loopback / OpenAI-serasakan peribadi, cth Ollama/LM Studio/vLLM).
  • AllowedAiProviderKinds (lalai kosong = semua) — senaraikan hanya jenis yang diluluskan penempatan (cth. ["Anthropic","OpenAiCompatible"]) untuk mengunci pembekal yang boleh ditambah pengguna.
  • AllowAiModelManagement (lalai true) — tetapkan false untuk menyembunyikan pelayaran model, pemilih model setiap halaman, dan pengikatan model setiap ciri. Kesemuanya boleh diselaras pemilik pada masa larian dari Tetapan → Penempatan (disarungkan hidup pada IOptionsMonitor) dan dikatalogkan dalam WhiteLabelCatalog.

Memperluaskan: model terbina dalam masa depan​

Lapisan AI berasaskan adaptor dan dibina untuk berkembang. Setiap pembekal ialah IAiProvider yang dipilih oleh AiProviderKind; camar ciri (IAiClient/AiFeatureService) tidak pernah berubah. Menambah masa jalan model terbina dalam baharu kemudian (model ONNX lain, enjin dalam-proses berbeza, GGUF/llama.cpp in-proc, dll.) ialah perubahan setempat: tambah AiProviderKind, pelaksanaan satu adaptor IAiProvider, daftarkannya, dan (pilihan) sambungkan pembibitan lalai + pilihan dialog — tiada perubahan ciri, titik akhir, atau alat MCP. Pembekal ONNX terbina dalam ialah pelaksanaan rujukan corak ini.

Keupayaan​

  • Bina cBot — bengkel berbasis projek di /ai/build: cipta cBot baru (nama unik + bahasa) atau tingkatkan satu sedia ada yang mempunyai sumber, kemudian berbual dengan model pada /ai/build/{projectId} untuk menulis dan memperhalusi kodnya. Setiap prompt dan balasan model disimpan dengan cap masa dan terselamat pelayaran/muat semula; sumber model digunakan pada projek pada setiap giliran. Bina dan Jalankan cBot dari halaman yang sama (atau buka dalam editor penuh). Setiap projek muncul dalam senarai dengan masa perubahan terakhir-nya dan kawalan pandang/padam.
  • Pemilih model setiap halaman — setiap halaman ciri AI dan dialog menunjukkan pemilih model yang menyenaraikan model yang boleh anda gunakan (pembekal anda sendiri + lalai penempatan). Ia pra-memilih pengikatan model yang disimpan ciri jika ditetapkan, sebaliknya model lalai, dan model yang anda pilih digunakan untuk tindakan satu itu (dihantar sebagai ?modelId= dan dipaksakan oleh RoutingAiClient untuk panggilan itu). Disembunyikan apabila penempatan melumpuhkan pengurusan model.
  • Pelayaran & pilih model, setiap ciri — pelayaran model yang titik akhir pembekal iklankan (GET /v1/models pada LM Studio / Ollama / vLLM / llama.cpp, atau katalog terbina dalam) daripada mengetik id tangan, dan ikat setiap ciri AI ke model berbeza supaya beberapa model melayani ciri berbeza pada masa yang sama (ciri tidak terikat jatuh kembali ke pembekal lalai skop).
  • Pengoptimuman parameter — gelung tertutup: AI cadangkan set parameter, setiap dikekalkan + di-backtest merentasi nod (optimize-run / optimize-params).
  • Ejen portfolio autonomic — cadangan bermotivasi mandat dengan jurnal keputusan penuh (AgentMandate → AgentProposal).
  • Penjaga risiko bertindak — perkhidmatan latar AiRiskGuard menilai bot yang berjalan, boleh auto-berhenti pada risiko kritikal (pilihan masuk).
  • Penjaga pendedahan prop-firm — had undur/pendedahan dengan ratakan automatik.
  • Makluman pasaran — enjin AlertRule dengan sentimen AI (pembingkaian carian web di mana pembekal menyokongnya).
  • Analisis — ulasan cBot, analisis backtest, post-mortem, sentimen pasaran, reka bentuk carta-penglihatan, kurasi marketplace.

Permukaan​

  • Titik akhir Web di bawah /api/ai/* (chat Bina cBot build/{id}/prompt + build/{id}/messages, generate-project, review, analyze-backtest, optimize-params, optimize-run, post-mortem, sentiment, vision, curate, …). Setiap titik akhir ciri menerima ?modelId=<credential> pilihan untuk menjalankan panggilan satu itu pada model pilihan. Tambah penemuan model (/api/ai/models/probe, /api/ai/usable-models) dan pengikatan setiap ciri (/api/ai/feature-bindings, /api/ai/my-feature-bindings). Projek cBot, bina dan jalankan menggunakan semula titik akhir pembina (/api/builder/projects…).
  • Alat MCP (AiTools) untuk klien AI — lihat mcp.md. Pemilihan pembekal telus kepada klien MCP.
  • Kumpulan nav AI — satu halaman Blazor setiap ciri: Bina cBot (/ai/build), Semak (/ai/review), Perdebatan (/ai/debate), Sentimen Pasaran (/ai/sentiment), Semakan Pendedahan (/ai/exposure), Ringkasan Portfolio (/ai/digest), Penasihat Tune (/ai/tune), Optimimum (/ai/optimize), tambah Ejen Portfolio, Makluman, Kunci MCP. Halaman kongsi AiFeaturePageBase + AiOutputPanel + AiModelSelect; setiap menunjukkan AiFeatureNotice apabila tiada pembekal dikonfigur.
  • Tetapan → AI (/settings/ai, pemilik sahaja) — senarai pembekal dengan dialog tambah/edit pembekal (jenis, URL asas dengan hint setiap jenis dan preset satu-klik OpenAI-serasakan yang merangkumi Kimi/Moonshot, Ollama dan LM Studio, model, kunci pilihan, togolan keupayaan, "tetap aktif") dan butang Uji sambungan.

Konfigurasi​

App:Ai menyokong kedua-dua kunci tunggal legacy dan pembibitan pelbagai pembekal:

  • Legacy: ApiKey, Model (lalai claude-opus-4-8), BaseUrl, MaxTokens — masih dihormati sebagai pembekal Anthropic lalai.
  • Pelbagai pembekal: ActiveProvider (jenis) dan Providers[] ({ Kind, BaseUrl, Model, ApiKey?, MaxTokens?, Capabilities? }) — diimport ke kedai pada permulaan jika tiada kredensi wujud lagi, jadi Pasukan ops boleh menghantar penempatan terkonfigur (termasuk LLM tempatan) sepenuhnya melalui appsettings/env.

RiskGuardEnabled, RiskGuardAutoStop, RiskGuardInterval tidak berubah. Untuk ujian/dev, kunci konfigurasi tinggal dalam fail kredensi dev di bawah Ai.

Kebolehpercayaan​

Pembekal dirawat sebagai tidak dipercayai — tidak ada yang nó lakukan boleh merosakkan apl. Ini pegang secara sama untuk titik akhir awan dan tempatan (Ollama mati mencuba semula kemudian merosot tepat seperti Anthropic yang dikecilkan):

  • Kemerosotan graceful. Setiap mod kegagalan (tiada pembekal, HTTP 4xx/5xx/429, masa tamat, badan malformed, kandungan kosong, keupayaan tidak disokong) mengembalikan AiResult.Fail(sebab) taip — klien tidak pernah membaling ke halaman, alat MCP, atau perkhidmatan dihos.
  • Salur keteguhan. AddAiHttpClient memberikan satu HttpClient AI kongsi percubaan semula terikat pada kegagalan 5xx / rangkaian transient (exponential backoff + jitter) tambah masa tamat yang luas setiap percubaan dan jumlah (AiHttp), digunakan semula oleh setiap adaptor.

Menguji dengan LLM tempatan palsu​

Lapisan AI dibuktikan end-to-end tanpa sebarang kebergantungan luaran oleh FakeLocalLlmServer — titik akhir OpenAI-serasakan dalam-proses kecil yang mengembalikan jawapan tiruan deterministik, wayar-separa dengan Ollama/LM Studio/vLLM. nó menyokong:

  • Unit — ujian terjemahan-permintaan setiap adaptor + penghuraian-respons, penghalaan/penurunan keupayaan.
  • Integrasi — adaptor OpenAI-serasakan end-to-end, teori keteguhan berparameter merentasi setiap adaptor, dan alat AI MCP.
  • E2E — AiLocalFixture boot apl menunjuk ke pelayan palsu (atau pembekal sebenar apabila pembangun menetapkan AI_E2E_BASEURL (+ pilihan AI_E2E_API_KEY / AI_E2E_KIND / AI_E2E_MODEL) — kredensi sebenar menang) dan menggerakkan setiap ciri AI melalui UI sebenar. Menambah atau menukar mana-mana ciri AI memerlukan ujian E2E melalui fixture ini (lihat mandatori ujian repo). Lorong pilihan masuk (AI_LOCAL_LLM=1) menjalankan satu penyiapan sebenar melalui Ollama Testcontainer.

AI tempatan terbina dalam — sifar-penyediaan secara lalai​

LLM tempatan ONNX terbina dalam berfungsi di luar kotak: apabila direktori model nó tidak hadir dan App:Ai:BuiltIn:AutoDownload ialah true (lalai), apl memuat turun model sekali di latar belakang dari App:Ai:BuiltIn:DownloadBaseUrl. Apabila muat turun berjalan, panggilan AI (dan Uji sambungan dalam Tetapan → AI) mengembalikan mesej jelas "model sedang dimuat turun (persediaan kali pertama)" berbanding kegagalan keras. Penempatan air-gapped/metered tetapkan AutoDownload=false dan pra-bekalkan direktori model (App:Ai:BuiltIn:ModelPath). Gerbang white-label App:Branding:AllowBuiltInAi masih dipakai.

Muat turun juga pra-dipanaskan pada permulaan apabila model terbina dalam ialah pembekal aktif, jadi ia bersedia sebelum klik AI pertama daripada gagal dengan "memuat turun…". Tetapan → AI menampilkan keadaan pemasangan langsung pada kad pembekal terbina dalam — Model sedia / Memuat turun model… / Model tidak dipasang / Muat turun gagal — dengan butang Muat turun model (atau Cuba semula muat turun) yang menendang pengambilan latar belakang satu kali atas permintaan (GET /api/ai/built-in/status, POST /api/ai/built-in/install). Mengaktifkan pembekal terbina dalam dari Tetapan menggunakan semula baris yang sudah disambung daripada menambah pendua, jadi ia tidak pernah berkonflik pada kekangan pembekal aktif tunggal.