Guides technology selection and implementation of AI and machine learning features in .NET 8+ applications using ML.NET, MEAI, and Agent Framework.
- GitHub stars
- 5,942
- Files
- 8
- Last commit
- Nov 11, 2026
- License
- MIT
- Allowed tools
- —
What does the technology-selection skill do?
technology-selection guides technology selection and implementation of AI and machine learning features in .NET 8+ applications using ML.NET, MEAI, and Agent Framework.
Summary generated from the skill's SKILL.md.
About the technology-selection skill
Architecting AI and machine learning capabilities into .NET 8+ applications is the primary function of this skill. It assists developers in choosing the correct library or framework based on whether they need structured data predictions, large language model orchestration, or local model inference. The skill provides a decision tree to prevent common mistakes, such as using expensive LLMs for tasks better suited for deterministic machine learning.
When an agent loads this skill, it can produce architectural plans, technology comparisons, or implementation code for specific workflows. It relies on a structured hierarchy of tools including ML.NET for tabular data, Microsoft.Extensions.AI for language abstractions, and the Microsoft Agent Framework for multi-step agentic loops. It also covers specialized implementations like RAG pipelines using Microsoft.Extensions.VectorData.Abstractions, GitHub Copilot extensions via the Copilot SDK, and local inference using OllamaSharp or ONNX Runtime. The skill is strictly limited to .NET 8+ environments and does not support pure data engineering tasks or custom deep learning training loops.
What an agent can do with it
- 1Select a machine learning frameworkDetermine whether to use ML.NET or an LLM for a specific classification task.
- 2Design a RAG pipelineCreate an architecture for semantic search and document ingestion using vector databases.
- 3Implement agentic workflowsBuild a multi-step tool calling system using the Microsoft Agent Framework.
- 4Configure local LLM inferenceSet up an offline language model integration for privacy-sensitive applications.
Written from the skill's SKILL.md. Every use case is checked against a quote from it.
How to install the technology-selection skill
Each command copies the skill folder into the client's skills directory. Restart the client or start a new session to load it.Install the technology-selection skill in Plugin
/plugin marketplace add dotnet/skills /plugin install dotnet-ai@dotnet-agent-skills
Install the technology-selection skill in Claude Code
~/.claude/skills/technology-selection/SKILL.md
$ npx degit dotnet/skills/plugins/dotnet-ai/skills/technology-selection ~/.claude/skills/technology-selectionInstall the technology-selection skill in Claude Code (project)
.claude/skills/technology-selection/SKILL.md
$ npx degit dotnet/skills/plugins/dotnet-ai/skills/technology-selection .claude/skills/technology-selectionInstall the technology-selection skill in Codex
~/.agents/skills/technology-selection/SKILL.md
$ npx degit dotnet/skills/plugins/dotnet-ai/skills/technology-selection ~/.agents/skills/technology-selectionInstall the technology-selection skill in Gemini CLI
~/.gemini/skills/technology-selection/SKILL.md
$ npx degit dotnet/skills/plugins/dotnet-ai/skills/technology-selection ~/.gemini/skills/technology-selectionInstall the technology-selection skill in Claude.ai
npx degit dotnet/skills/plugins/dotnet-ai/skills/technology-selection technology-selection && zip -r technology-selection.zip technology-selection # claude.ai → Customize → Skills → + → Create skill → Upload a skill → technology-selection.zip
Automated checks
Ran Nov 14, 2026Full report →Passed our automated checks. That is not a security audit: read the scripts before you let an agent run them. How checks work
- Source repository linked and reachabledotnet/skills/plugins/dotnet-ai/skills/technology-selection is public and reachablegithub.com/dotnet/skills/tree/HEAD/plugins/dotnet-ai/skills/ ↗Pass
- Open source license (OSI)MITspdx.org/licenses/MIT.html ↗Pass
- Commit or release in the last yearLast commit 2026-11-11github.com/dotnet/skills/commits ↗Pass
- No download-and-run or credential theft in scriptsNo scripts in the skill folderPass
- No hidden instructions in SKILL.mdNo override phrases, safeguard switches, credential requests or hidden charactersgithub.com/dotnet/skills/blob/HEAD/plugins/dotnet-ai/skills/ ↗Pass
- Pre-approved tools are scopedNo pre-approved tools; the agent asks before using onegithub.com/dotnet/skills/blob/HEAD/plugins/dotnet-ai/skills/ ↗Pass
SKILL.md
View on GitHub.NET AI and Machine Learning
Pick the right technology first, then deliver only what the task asks for. If the task asks for a plan, comparison, or architecture (or says "do not write code"), produce that — do not scaffold, build, or run code unprompted.
Step 1: Classify the task (decision tree)
State which branch applies and why, then choose that technology.
| Task type | Technology | Why |
|---|---|---|
| Structured/tabular: classification, regression, clustering, anomaly detection, recommendation | ML.NET (Microsoft.ML) |
Deterministic (fixed seed), no cloud dependency, purpose-built |
| NL understanding, generation, summarization, reasoning (single prompt → response, no tools) | LLM via Microsoft.Extensions.AI (IChatClient) |
Language capability, no orchestration needed |
| Agentic: multi-step tool/function calling, agent loops, multi-agent | Microsoft Agent Framework (Microsoft.Agents.AI) on Microsoft.Extensions.AI |
Needs orchestration, tool dispatch, iteration control IChatClient lacks |
| GitHub Copilot extensions / custom dev-workflow agents | GitHub Copilot SDK (GitHub.Copilot.SDK) |
Integrates with the Copilot agent runtime |
| Run a pre-trained/custom model in production | ONNX Runtime (Microsoft.ML.OnnxRuntime) |
Hardware-accelerated, format-agnostic inference |
| Local/offline LLM inference | OllamaSharp (Ollama models) | Privacy-sensitive, air-gapped, cost-constrained |
| Semantic search, RAG, embedding storage | Microsoft.Extensions.VectorData.Abstractions (MEVD) + a provider (Azure AI Search, Milvus, MongoDB, pgvector, Pinecone, Qdrant, Redis, SQL) | Provider-agnostic vector search |
| Ingest, chunk, load documents into a vector store | Microsoft.Extensions.AI.DataIngestion (preview) + MEVD | Parses, chunks, embeds, upserts |
| Both structured predictions AND NL reasoning | Hybrid: ML.NET scoring + LLM reasoning layer | ML.NET is reproducible; LLM adds explanation |
Critical rule: Do NOT use an LLM for tasks ML.NET handles well (tabular classification, regression, clustering) — LLMs are slower, costlier, and non-deterministic for these.
Step 1b: Pick the library layer
| Layer | Library | Use when |
|---|---|---|
| Abstraction | Microsoft.Extensions.AI (MEAI) |
Always the foundation. Use IChatClient directly for prompt-response and simple, bounded function invocation. |
| Provider SDK | Azure.AI.OpenAI / OpenAI / Azure.AI.Inference / OllamaSharp |
Concrete provider behind MEAI via AddChatClient. |
| Orchestration | Microsoft.Agents.AI (prerelease) |
Multi-step tool use, durable agent loops, and multi-agent workflows. |
| Copilot | GitHub.Copilot.SDK |
Building Copilot-platform extensions only. |
Rules: start with MEAI; put the provider behind it via AddChatClient (don't call the provider in
business logic); use Microsoft.Agents.AI for multi-step or durable agent workflows rather than
hand-rolling an agent loop; never mix a raw HttpClient-to-OpenAI call with MEAI in the same
workflow. Do not use Accord.NET (archived). For new projects, prefer MEAI and Agent Framework
unless existing Semantic Kernel features or investments are a requirement. Register AI/ML services
via DI; load secrets from user-secrets / env / Key Vault — never hardcode keys.
Step 2: Cover the branch essentials, then decide depth
Every answer — plan or implementation — must address the guardrails for the selected branch:
- ML.NET —
new MLContext(seed: …)(reproducible);TrainTestSplit+ evaluate on the held-out set; report real metrics (MicroAccuracy/MacroAccuracy/LogLoss, AUC/F1, or RMSE/R²); serve withPredictionEnginePool<TIn,TOut>(never a singletonPredictionEngine). - LLM (MEAI) — depend on
IChatClientregistered viaAddChatClient(provider behind it); setTemperatureandMaxOutputTokensinChatOptions; add retry/timeout (RetryingChatClient/Polly); pin a dated model; load keys from user-secrets / env / Key Vault — never hardcode ansk-…key; validate non-deterministic output against a schema with a fallback. - Agentic (Agent Framework) — orchestrate with
Microsoft.Agents.AIonIChatClient(never a hand-rolled loop); setMaximumIterationsand a token/cost ceiling; define each tool with a clear schema (AIFunctionFactory.Create); log each step (never raw sensitive content). - RAG / embeddings — semantic chunking (not fixed-size);
IEmbeddingGeneratorand cache the embeddings (don't re-embed per query); store/query withMicrosoft.Extensions.VectorData.Abstractions(MEVD) + the provider the user asked for (e.g. pgvector); filter by a minimum similarity score; keep source attribution for each answer. Honor the UI/storage the user specified; use only real, existing NuGet packages.
Then choose depth:
- Plan / comparison / architecture only (or "do not write code"): answer from this file alone using the essentials above. Do NOT open a reference — the branch essentials here are sufficient for a selection or plan. For RAG plans, cover chat, ingestion/chunking, embeddings, vector storage, source attribution, and the requested UI/storage.
- Writing implementation code: read the matching reference(s) for packages and implementation
guidance (read only the selected branch; for Hybrid, read both Classic ML.NET and LLM):
- Classic ML.NET →
references/classic-ml.md - LLM integration (MEAI) →
references/llm.md - Agentic (Agent Framework) →
references/agentic.md - RAG / embeddings / ingestion →
references/rag.md - GitHub Copilot extensions →
references/copilot.md - ONNX Runtime inference →
references/onnx.md - Local/offline LLM with Ollama →
references/ollama.md
- Classic ML.NET →
Validation
- Selection follows the decision tree — no LLM for tasks ML.NET handles
- Only what was asked is produced (plan-only requests get a plan, not code)
- AI/ML services registered via DI; config via
IOptions<T>; keys from secure sources - Branch guardrails (Step 2 essentials, plus the reference when implementing) are satisfied
- After implementing, build and run existing tests
Anti-Patterns to Reject
| Anti-pattern | Redirect |
|---|---|
| LLM for tabular classification | Use ML.NET — faster, cheaper, deterministic |
| LLM calls without retry/timeout | Add RetryingChatClient or Polly retry |
API keys in committed appsettings.json |
user-secrets / env / Key Vault |
| Accord.NET, or defaulting to Semantic Kernel without a requirement | ML.NET; prefer MEAI + Microsoft.Agents.AI for new work |
Hand-rolled multi-step tool loops with IChatClient |
Microsoft.Agents.AI (MaximumIterations, tool dispatch) |
| Agent Framework for a single prompt→response | IChatClient directly |
Raw HttpClient/OpenAI SDK in business logic alongside MEAI |
one abstraction layer; depend on IChatClient |
PredictionEngine singleton in ASP.NET Core |
PredictionEnginePool<TIn,TOut> (not thread-safe) |
| RAG without chunking or relevance filtering | semantic chunking + minimum similarity score |
| Building custom neural nets in .NET from scratch | pre-trained via ONNX Runtime or an LLM API |
Files in this skill
8technology-selection skill questions
How do I install the technology-selection skill in Claude Code?
Run npx degit dotnet/skills/plugins/dotnet-ai/skills/technology-selection ~/.claude/skills/technology-selection. Claude Code loads skills from ~/.claude/skills (all projects) or .claude/skills (one project) and uses a skill when its description matches the task.
Which clients can use the technology-selection skill?
Any client that reads the Agent Skills format: Claude Code, Codex, Gemini CLI and claude.ai (upload as a ZIP). Scripts in the skill run only where the client allows code execution.
When should I use ML.NET instead of an LLM?
Use ML.NET for structured or tabular tasks like classification, regression, clustering, and anomaly detection because it is faster, cheaper, and deterministic.
What is the recommended way to handle AI service registration in .NET?
You should register AI/ML services via Dependency Injection (DI) and load secrets from secure sources like user-secrets, environment variables, or Key Vault rather than hardcoding them.
Can I use this skill for .NET Framework projects?
No, this skill requires .NET 8 or higher and is not intended for projects targeting the older .NET Framework.