From 03af8b793749bacb645fd61bd7fb7fa82fcce56d Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 3 Nov 2026 01:25:13 +0100 Subject: [PATCH 1/3] Refactor(genai,#24197): hub Integrations-DotNet declare -- EFCore absorbe a la racine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cas A de l'audit #24197 pour le hub .NET GenAI (Integrations-DotNet) : - EFCore/ (mono-carnet, sans projet compagnon, sans README) est absorbe a la racine du hub, soldant la promesse d'absorption de PR #14431 dont le titre "EFCore+CopilotSDK -> Integrations-DotNet/" n'avait fait que creer le dossier ; - le hub gagne son README index manquant (les 5 trajectoires, liaisons vers chaque dossier et vers le notebook EF Core a la racine) ; - CopilotSDK/ et Scrutor/ (carnet + projet .NET compagnon) declarent leur raison de niveau en une phrase (le projet qu'ils executent vit a cote) ; - la note d'arborescence de GenAI/README.md (au futur, "repertoire pas encore cree sur main") est remise a l'etat presente. 6 references re-pointees (quarto, docs/curriculum/genai, baseline de densite, registre des axes, README racine) ; catalogue genere laisse byte-identique a main (regeneration par l'automatisation, chore #24283). See #24197 · Part of #10473 Co-Authored-By: Claude Haiku 5.5 --- .../01-EFCore-Requetes-Compilees.ipynb | 4 +-- .../Aspire/distilled-axes-registry.md | 2 +- .../Integrations-DotNet/CopilotSDK/README.md | 9 ++++++ .../GenAI/Integrations-DotNet/README.md | 31 +++++++++++++++++++ .../Integrations-DotNet/Scrutor/README.md | 10 ++++++ MyIA.AI.Notebooks/GenAI/README.md | 2 +- README.md | 2 +- _quarto.yml | 2 +- docs/curriculum/genai.md | 2 +- .../pedagogy_density_baseline.json | 2 +- 10 files changed, 58 insertions(+), 8 deletions(-) rename MyIA.AI.Notebooks/GenAI/Integrations-DotNet/{EFCore => }/01-EFCore-Requetes-Compilees.ipynb (99%) create mode 100644 MyIA.AI.Notebooks/GenAI/Integrations-DotNet/CopilotSDK/README.md create mode 100644 MyIA.AI.Notebooks/GenAI/Integrations-DotNet/README.md create mode 100644 MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Scrutor/README.md diff --git a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/EFCore/01-EFCore-Requetes-Compilees.ipynb b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/01-EFCore-Requetes-Compilees.ipynb similarity index 99% rename from MyIA.AI.Notebooks/GenAI/Integrations-DotNet/EFCore/01-EFCore-Requetes-Compilees.ipynb rename to MyIA.AI.Notebooks/GenAI/Integrations-DotNet/01-EFCore-Requetes-Compilees.ipynb index 4489b57dcc2..0224f315bd9 100644 --- a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/EFCore/01-EFCore-Requetes-Compilees.ipynb +++ b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/01-EFCore-Requetes-Compilees.ipynb @@ -17,7 +17,7 @@ "# EF Core : des requêtes vérifiées à la compilation\n", "\n", "Ce notebook digère l'axe **EF Core — requêtes vérifiées à la compilation** de la série\n", - "*The Unexpected AI Stack: C#/.NET* (issue [#10473](../Aspire/distilled-axes-registry.md)).\n", + "*The Unexpected AI Stack: C#/.NET* (issue [#10473](Aspire/distilled-axes-registry.md)).\n", "La Part 1 de l'auteur promettait ce contraste sans jamais le porter dans le dépôt : c'est\n", "la ligne « Non distillable / À ouvrir » du registre des axes, que ce notebook ferme.\n", "\n", @@ -46,7 +46,7 @@ "\n", "**Position dans la série** : le dossier `GenAI/Integrations-DotNet/Aspire/` couvre l'AppHost et l'observabilité ;\n", "`GenAI/Integrations-DotNet/CopilotSDK/` traite le binding C# (Part 3). Ce notebook se place dans le\n", - "hub `GenAI/Integrations-DotNet/EFCore/`, en amont de l'outillage : il exécute la **librairie** (EF Core en\n", + "hub `GenAI/Integrations-DotNet/`, en amont de l'outillage : il exécute la **librairie** (EF Core en\n", "`.NET Interactive` local), pas un orchestrateur. L'axe est **provider-indépendant** : la\n", "vérification à la compilation porte sur le modèle LD (types), pas sur le moteur de base. On\n", "choisit SQLite *in-memory* pour rester **CPU-only, déterministe, sans conteneur** — mais le\n", diff --git a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/distilled-axes-registry.md b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/distilled-axes-registry.md index 08ce3f3f518..d208d44391b 100644 --- a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/distilled-axes-registry.md +++ b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/distilled-axes-registry.md @@ -23,7 +23,7 @@ Le registre **n'est pas une spec** — il est une **photographie** honnête du d | **CSharpRepl — scripté** | **Livré** | [#10897](https://github.com/jsboige/CoursIA/issues/10897) → PR [#10944](https://github.com/jsboige/CoursIA/pull/10944) | `connect --streamPipedInput` vs `pdb`/`%autoreload` IPython | Densification : **AppHost frontend livré** par [#22370](https://github.com/jsboige/CoursIA/pull/22370) — issue [#22363](https://github.com/jsboige/CoursIA/issues/22363) — (`10-Aspire-AppHost-Frontend.ipynb` + lab `FrontendLab/`) ; Scrutor/minimal API par [#22358](https://github.com/jsboige/CoursIA/issues/22358) → PR [#22361](https://github.com/jsboige/CoursIA/pull/22361) (ouverte) : notebook [`Scrutor/01-Scrutor-Endpoints-Par-Convention.ipynb`](../Scrutor/01-Scrutor-Endpoints-Par-Convention.ipynb) exécuté + lab `ScrutorLab/`, convention `IEndpoint` + `Scan` + mapping automatique, port dynamique, tableau de parité FastAPI↔Scrutor | | **CSharpRepl — attaché à un process .NET vivant** (`#wrap` / `#replace`) | **Livré** (notebook [`Vibe-Coding/docs/CSharpRepl-Live-Patching.ipynb`](../../Vibe-Coding/docs/CSharpRepl-Live-Patching.ipynb), cellules code exécutées) | [#10802](https://github.com/jsboige/CoursIA/issues/10802), [#10971](https://github.com/jsboige/CoursIA/issues/10971) → PR [#10806](https://github.com/jsboige/CoursIA/pull/10806) MERGED (b96df2a3cc3) + densification [#11332](https://github.com/jsboige/CoursIA/pull/11332) | `#wrap`/`#replace` à chaud sur un process attaché vs `pdb`/`%autoreload` IPython | Densification continue (EPIC #11271) | | **Roslyn — analyseurs statiques comme garde-fous** | **Livré** (6 règles : AGENTGUARD001 à AGENTGUARD005b ; AGENTGUARD003 couvre `Task.Run`, `Task.Factory.StartNew` et `Task.Factory.StartNew` nus) | Base [#11849](https://github.com/jsboige/CoursIA/issues/11849) → PR [#11866](https://github.com/jsboige/CoursIA/pull/11866) ; `CancellationToken` [#13696](https://github.com/jsboige/CoursIA/pull/13696) ; `GetAwaiter().GetResult()` [#13819](https://github.com/jsboige/CoursIA/pull/13819) ; variante `ConfigureAwait` [#13885](https://github.com/jsboige/CoursIA/pull/13885) ; `Task.Factory.StartNew` [#15780](https://github.com/jsboige/CoursIA/issues/15780) | Analyseurs dans la compilation vs `mypy`/`ruff` (hors compilation) ; résolution sémantique des symboles Roslyn plutôt que recherche textuelle | E3 absorbée par #15780 ; prochains grains uniquement sur défauts de couverture mesurés | -| **EF Core — requêtes vérifiées à la compilation** | **Livré** | [#12381](https://github.com/jsboige/CoursIA/issues/12381) → PR [#12393](https://github.com/jsboige/CoursIA/pull/12393) | ORM à l'exécution vs vérifié à la compilation — `EF.CompileQuery` (mesuré 2,78×), `ToQueryString()`, `FromSqlInterpolated` | Livré : notebook `GenAI/Integrations-DotNet/EFCore/01-EFCore-Requetes-Compilees.ipynb` ; densification continue possible (EPIC #10473) ; rangé dans le hub .NET via #13581 T2 | +| **EF Core — requêtes vérifiées à la compilation** | **Livré** | [#12381](https://github.com/jsboige/CoursIA/issues/12381) → PR [#12393](https://github.com/jsboige/CoursIA/pull/12393) | ORM à l'exécution vs vérifié à la compilation — `EF.CompileQuery` (mesuré 2,78×), `ToQueryString()`, `FromSqlInterpolated` | Livré : notebook `GenAI/Integrations-DotNet/01-EFCore-Requetes-Compilees.ipynb` ; densification continue possible (EPIC #10473) ; rangé dans le hub .NET via #13581 T2 | | **Channels / Orleans** | **Livré** (notebook [`Orleans/01-Orleans-Grains-Agents.ipynb`](../Orleans/01-Orleans-Grains-Agents.ipynb), code exécution réelle ; lab `OrleansAgentLab/` .NET 10 silo co-hosté `Microsoft.Orleans.Server` 10.3.1) | [#10473](https://github.com/jsboige/CoursIA/issues/10473) (reste OPEN), claim [#16436](https://github.com/jsboige/CoursIA/issues/16436) → PR [#16439](https://github.com/jsboige/CoursIA/pull/16439) (c.1208 lane `myia-po-2027:CoursIA-2`, repair commit `990ac290f699`) | Modèle d'acteurs (grains single-threaded turn-based, identité = clé `(type, key)`) avec concurrence sérialisante sans `lock`/`Interlocked` vs `asyncio`/`ray` où la discipline de concurrence reste au codeur. Concurrence mesurée : 50 appels simultanés de `RecordUsage(10)` sur le même grain → total exact `2125` (somme attendue) sans verrou | ~~co-host Aspire AppHost + `IGrainWithGuidKey`~~ **livré** par [`Orleans/02-Orleans-Aspire-CoHost.ipynb`](../Orleans/02-Orleans-Aspire-CoHost.ipynb) (lab `OrleansAspireLab/` : AppHost file-based `Aspire.Hosting.Orleans` 13.4.6 + CLI `aspire run`, silo ressource orchestrée, identités générées, reprise par Guid cross-process). Persistance livrée côté silo par `Orleans/03-Orleans-Persistance-Redis.ipynb` (lab `OrleansPersistenceLab/`, `Microsoft.Orleans.Persistence.Redis` 10.3.1 contre un Redis réel : survie d'un process à l'autre, conflit d'ETag entre deux silos). ~~Suite éventuelle : câbler `WithGrainStorage` dans l'AppHost Aspire~~ **livré** par [`Orleans/04-Orleans-Aspire-Cluster-Redis.ipynb`](../Orleans/04-Orleans-Aspire-Cluster-Redis.ipynb) (lab `OrleansClusterLab/` : deux répliques, `WithClustering` + `WithGrainStorage` sur Redis, silo réduit à `UseOrleans()`, activation unique mesurée, reprise après arrêt propre et après kill du silo porteur, redémarrage complet) | | **Aspire AppHost orchestrant pile GenAI** (ComfyUI/Qwen/vLLM) + `run --isolated` | **Livré** (AppHost [`GenAiStack.AppHost/`](GenAiStack.AppHost/apphost.cs) + jumeau worktree [`GenAiStack.AppHost-wt2/`](GenAiStack.AppHost-wt2/apphost.cs) = les 2 instances isolées de l'acceptance, notebook [`01-Aspire-Orchestration-GenAi.ipynb`](01-Aspire-Orchestration-GenAi.ipynb), README, échantillon d'appel réel) | [#10838](https://github.com/jsboige/CoursIA/issues/10838), [#10857](https://github.com/jsboige/CoursIA/issues/10857) → PR [#10846](https://github.com/jsboige/CoursIA/pull/10846) MERGED (2026-08-14T04:19Z) | AppHost orchestre la pile réelle vs `docker-compose`/`Helm` pour la pile Python. Le 3ᵉ AppHost [`GenAiStackReel.AppHost/apphost.cs`](GenAiStackReel.AppHost/apphost.cs) (notebook [`02-Aspire-GenAiStack-Reel.ipynb`](02-Aspire-GenAiStack-Reel.ipynb)) **référence** comfyui/vllm comme connection strings au lieu de les conteneuriser — choix d'architecture documenté dans son en-tête : singletons GPU en production, ne pas dupliquer 24 Go de VRAM par worktree ; seul le service léger (whisper-api) est orchestré en conteneur | Densification continue (#11271) | | **Copilot SDK binding C# (Part 3)** | **Livré** (tranche A4 EPIC #11516 ; tranche `OnPermissionRequest` avancée livrée ; **résiduel « Aspire AppHost integration » soldé** par [#22388](https://github.com/jsboige/CoursIA/issues/22388) — notebook [`11-Aspire-Copilot-Harness-AppHost.ipynb`](11-Aspire-Copilot-Harness-AppHost.ipynb) : le harness devient une ressource `Executable` d'un graphe Aspire, port proxy dynamique, configuration injectée par l'orchestrateur et rendue observable par `/config`) | [#11926](https://github.com/jsboige/CoursIA/issues/11926) → PR [#12004](https://github.com/jsboige/CoursIA/pull/12004) (c.1301+268) ; `OnPermissionRequest` [#20090](https://github.com/jsboige/CoursIA/issues/20090) → PR [#20093](https://github.com/jsboige/CoursIA/pull/20093) ; AppHost [#22388](https://github.com/jsboige/CoursIA/issues/22388) | SDK officiel C# + réutilisation credentials OAuth GitHub vs appel API BYOK Azure OpenAI ; permissions **programmables** (`Func>`, refus effectif mesuré) vs allowlists déclaratives Claude Code ; cycle de vie délégué à un orchestrateur (proxy + environnement injecté) vs lancement manuel par l'appelant | BYOK Azure (Exercice 3, user-gated sans clé) — **seul** résiduel restant de l'axe | diff --git a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/CopilotSDK/README.md b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/CopilotSDK/README.md new file mode 100644 index 00000000000..001ce9c0d5d --- /dev/null +++ b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/CopilotSDK/README.md @@ -0,0 +1,9 @@ +# CopilotSDK — le SDK GitHub Copilot piloté depuis C# + +Un seul carnet, un projet compagnon : le dossier existe parce que le carnet +[01-GitHub-Copilot-SDK-Binding.ipynb](01-GitHub-Copilot-SDK-Binding.ipynb) exécute le projet +.NET réel `CopilotAgent.App/` (un agent en streaming avec des endpoints typés) qui vit à côté +de lui. C'est cette raison de niveau — le projet qu'il exécute — qui justifie le dossier. + +Axe **Copilot SDK** de la série *The Unexpected AI Stack: C#/.NET* +([EPIC #10473](https://github.com/jsboige/CoursIA/issues/10473)). diff --git a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/README.md b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/README.md new file mode 100644 index 00000000000..c52db031319 --- /dev/null +++ b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/README.md @@ -0,0 +1,31 @@ +# Integrations-DotNet — hub des bindings .NET GenAI + +Point de chute canonique des bindings .NET GenAI de la série *The Unexpected AI Stack: +C#/.NET* ([EPIC #10473](https://github.com/jsboige/CoursIA/issues/10473)) : les axes de la +série qui n'ont pas de série pédagogique à part entière vivent ici, un binding par dossier. +Le registre des axes distillables de la série vit dans +[`Aspire/distilled-axes-registry.md`](Aspire/distilled-axes-registry.md). + +## Contenu + +| Trajectoire | Contenu | +|---|---| +| [Aspire/](Aspire/README.md) | Série principale (11 carnets) : orchestrer la pile GenAI dans un AppHost compilé et typé — observabilité OpenTelemetry, streaming d'agents, tests d'intégration, garde-fous Roslyn, flotte sémantique multi-connecteurs | +| [Orleans/](Orleans/README.md) | 4 carnets : grains acteurs stateful pour les workloads IA, silo co-hosté par un AppHost, persistance Redis, cluster | +| [CopilotSDK/](CopilotSDK/README.md) | Le SDK GitHub Copilot piloté depuis C# en streaming, endpoints typés + projet compagnon `CopilotAgent.App/` | +| [Scrutor/](Scrutor/README.md) | Des endpoints de minimal API découverts par convention (`Scan()`) + lab `ScrutorLab/` | +| [01-EFCore-Requetes-Compilees.ipynb](01-EFCore-Requetes-Compilees.ipynb) | EF Core : le compilateur comme garde-fou jusque dans les requêtes (`EF.CompileQuery` mesuré 2,78×, `ToQueryString()`, `FromSqlInterpolated`) — binding sans projet compagnon, à la racine du hub | + +## Rangement + +La règle de niveau du hub : **un binding sans projet compagnon vit à la racine du hub, un +binding dont le carnet exécute un projet .NET réel garde son dossier** — et c'est cette raison +que chaque README de dossier écrit en une phrase. + +- **EF Core** : mono-carnet, aucun projet compagnon → absorbé à la racine du hub (ce PR, + soldant la promesse d'absorption de [PR #14431](https://github.com/jsboige/CoursIA/pull/14431), + [#13581](https://github.com/jsboige/CoursIA/issues/13581) T2), et listé dans l'index ci-dessus. +- **Copilot SDK** : le carnet exécute `CopilotAgent.App/` → garde son dossier, déclaré dans + [`CopilotSDK/README.md`](CopilotSDK/README.md). +- **Scrutor** : le carnet exécute `ScrutorLab/` → garde son dossier, déclaré dans + [`Scrutor/README.md`](Scrutor/README.md). diff --git a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Scrutor/README.md b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Scrutor/README.md new file mode 100644 index 00000000000..5b5ebc32914 --- /dev/null +++ b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Scrutor/README.md @@ -0,0 +1,10 @@ +# Scrutor — des endpoints de minimal API découverts par convention + +Un seul carnet, un projet compagnon : le dossier existe parce que le carnet +[01-Scrutor-Endpoints-Par-Convention.ipynb](01-Scrutor-Endpoints-Par-Convention.ipynb) +exécute le projet .NET réel `ScrutorLab/` (un minimal API dont les endpoints sont découverts +par `Scan()`/`Registry`) qui vit à côté de lui. C'est cette raison de niveau — le projet qu'il +exécute — qui justifie le dossier. + +Axe **Scrutor** de la série *The Unexpected AI Stack: C#/.NET* +([EPIC #10473](https://github.com/jsboige/CoursIA/issues/10473)). diff --git a/MyIA.AI.Notebooks/GenAI/README.md b/MyIA.AI.Notebooks/GenAI/README.md index 6124f5dd5d7..dc46104a155 100644 --- a/MyIA.AI.Notebooks/GenAI/README.md +++ b/MyIA.AI.Notebooks/GenAI/README.md @@ -156,7 +156,7 @@ GenAI/ └── RAG-et-Memoire-Semantique/ # Mémoire sémantique : Qdrant, embeddings, grounding (SDDD) ``` -> **Note d'arborescence (mars 2026)** : `EFCore/` et `CopilotSDK/` (mono-notebook chacun) seront absorbés dans `Integrations-DotNet/` via [PR #14431](https://github.com/jsboige/CoursIA/pull/14431) — **répertoire pas encore créé sur `main` à la rédaction de cette note** (en attente du merge de #14431). Le hub Integrations-DotNet sera le point de chute canonique des futurs bindings .NET GenAI. `Aspire/` reste au niveau racine, série pédagogique majeure avec sous-série catalog. La provenance des réalisations étudiantes EPF est portée par la section « Généalogie » de [`CaseStudies/README.md`](CaseStudies/README.md). +> **Note d'arborescence** : le hub [`Integrations-DotNet/`](Integrations-DotNet/) est le point de chute canonique des bindings .NET GenAI de la série *The Unexpected AI Stack: C#/.NET*. Créé par [PR #14431](https://github.com/jsboige/CoursIA/pull/14431) ([#13581](https://github.com/jsboige/CoursIA/issues/13581) T2), il regroupe Aspire (série pédagogique majeure), Orleans, Copilot SDK et Scrutor — et le binding **EF Core**, mono-carnet sans projet compagnon, à sa racine (absorbé, cf [`Integrations-DotNet/README.md`](Integrations-DotNet/README.md)). La provenance des réalisations étudiantes EPF est portée par la section « Généalogie » de [`CaseStudies/README.md`](CaseStudies/README.md). ### 00-GenAI-Environment - Votre point de départ diff --git a/README.md b/README.md index 540101d3f36..0034dc6edce 100644 --- a/README.md +++ b/README.md @@ -306,7 +306,7 @@ Chaque modalité (Image, Audio, Video) suit la même montée en quatre niveaux - Côté **mémoire des agents**, la sous-série [RAG et Mémoire Sémantique](MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/README.md) est devenue un cursus complet : retrieval avancé, embeddings et tokenisation reconstruits depuis zéro, stockage vectoriel, puis Kernel Memory en processus, en Python, en recherche hybride et multimodale. Qdrant en est le backend opérationnel pour ancrer les agents de codage dans l'historique des conversations et le code des dépôts. -**[Aspire](MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/README.md) -- la pile IA inattendue : C#/.NET** -- Une sous-série à contre-courant : décrire modèles, bases vectorielles, services, secrets, santé et télémétrie dans un **AppHost** compilé et typé plutôt que dans un assemblage de Compose et de scripts. Partie de l'orchestration GPU et multi-machines, elle couvre désormais observabilité OpenTelemetry, streaming d'agents par Channels, tests d'intégration avec conteneurs éphémères, garde-fous Roslyn exécutés dans le build et flotte sémantique multi-connecteurs. Deux axes vivent en hub dédié [Integrations-DotNet](MyIA.AI.Notebooks/GenAI/Integrations-DotNet/) : [EF Core](MyIA.AI.Notebooks/GenAI/Integrations-DotNet/EFCore/) fait du compilateur un garde-fou jusque dans les requêtes et le [SDK GitHub Copilot](MyIA.AI.Notebooks/GenAI/Integrations-DotNet/CopilotSDK/) pilote depuis C# un agent en streaming avec des endpoints typés. +**[Aspire](MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/README.md) -- la pile IA inattendue : C#/.NET** -- Une sous-série à contre-courant : décrire modèles, bases vectorielles, services, secrets, santé et télémétrie dans un **AppHost** compilé et typé plutôt que dans un assemblage de Compose et de scripts. Partie de l'orchestration GPU et multi-machines, elle couvre désormais observabilité OpenTelemetry, streaming d'agents par Channels, tests d'intégration avec conteneurs éphémères, garde-fous Roslyn exécutés dans le build et flotte sémantique multi-connecteurs. Deux axes vivent en hub dédié [Integrations-DotNet](MyIA.AI.Notebooks/GenAI/Integrations-DotNet/) : [EF Core](MyIA.AI.Notebooks/GenAI/Integrations-DotNet/01-EFCore-Requetes-Compilees.ipynb) fait du compilateur un garde-fou jusque dans les requêtes et le [SDK GitHub Copilot](MyIA.AI.Notebooks/GenAI/Integrations-DotNet/CopilotSDK/) pilote depuis C# un agent en streaming avec des endpoints typés. **[Vibe-Coding](MyIA.AI.Notebooks/GenAI/Vibe-Coding/README.md)** -- Le développement assisté par agents IA : ateliers progressifs sur Claude Code et Roo Code, compétences, sous-agents, MCP et hooks, complétés par les agents conteneurisés Claw-Systems et le proxy multi-provider Claudish. La question directrice est celle qui suit naturellement l'écriture assistée : *si un agent produit le code, qui le relit et quelles garanties restent indépendantes de lui ?* L'analyseur Roslyn **MyIA.AgentSafetyAnalyzer** compile ces garde-fous dans le build : règles de sécurité, correction automatique des secrets codés en dur, registre de suppressions et tests. Il est distinct d'**AgentGuard.Analyzers**, le volet Roslyn de la sous-série Aspire. Un second chantier branche un REPL C# sur un processus .NET vivant pour l'observer et le corriger sans l'arrêter. diff --git a/_quarto.yml b/_quarto.yml index 5af44d6c88a..20063b6c37a 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -1171,7 +1171,7 @@ project: - "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/10-Aspire-AppHost-Frontend.ipynb" - "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/11-Aspire-Copilot-Harness-AppHost.ipynb" - "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/CopilotSDK/01-GitHub-Copilot-SDK-Binding.ipynb" - - "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/EFCore/01-EFCore-Requetes-Compilees.ipynb" + - "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/01-EFCore-Requetes-Compilees.ipynb" - "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Orleans/01-Orleans-Grains-Agents.ipynb" - "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Orleans/02-Orleans-Aspire-CoHost.ipynb" - "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Orleans/03-Orleans-Persistance-Redis.ipynb" diff --git a/docs/curriculum/genai.md b/docs/curriculum/genai.md index 8570647d631..d46f8378c63 100644 --- a/docs/curriculum/genai.md +++ b/docs/curriculum/genai.md @@ -191,7 +191,7 @@ Génération d'images (DALL-E, Stable Diffusion, Qwen, ComfyUI), synthèse vocal | 10 | [Aspire AppHost : orchestrer un frontend Vite/pnpm](../../MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/10-Aspire-AppHost-Frontend.ipynb) | ALPHA | Oui | | 11 | [Aspire AppHost : orchestrer un harness d'agent comme…](../../MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/11-Aspire-Copilot-Harness-AppHost.ipynb) | BETA | Oui | | 12 | [GitHub Copilot SDK en C# : binding, streaming, Scrutor](../../MyIA.AI.Notebooks/GenAI/Integrations-DotNet/CopilotSDK/01-GitHub-Copilot-SDK-Binding.ipynb) | BETA | Non | -| 13 | [EF Core : des requêtes vérifiées à la compilation](../../MyIA.AI.Notebooks/GenAI/Integrations-DotNet/EFCore/01-EFCore-Requetes-Compilees.ipynb) | BETA | Oui | +| 13 | [EF Core : des requêtes vérifiées à la compilation](../../MyIA.AI.Notebooks/GenAI/Integrations-DotNet/01-EFCore-Requetes-Compilees.ipynb) | BETA | Oui | | 14 | [Orleans × Aspire : le silo orchestré, les identités…](../../MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Orleans/02-Orleans-Aspire-CoHost.ipynb) | BETA | Oui | | 15 | [Orleans × Aspire : un cluster de deux silos, l'état…](../../MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Orleans/04-Orleans-Aspire-Cluster-Redis.ipynb) | BETA | Non | | 16 | [Scrutor et minimal API : des endpoints par convention](../../MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Scrutor/01-Scrutor-Endpoints-Par-Convention.ipynb) | BETA | Non | diff --git a/scripts/notebook_tools/pedagogy_density_baseline.json b/scripts/notebook_tools/pedagogy_density_baseline.json index 3a4070882ee..3e88658f543 100644 --- a/scripts/notebook_tools/pedagogy_density_baseline.json +++ b/scripts/notebook_tools/pedagogy_density_baseline.json @@ -278,7 +278,7 @@ "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/09-Aspire-Harness-CopilotSdk.ipynb": 779.364, "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/10-Aspire-AppHost-Frontend.ipynb": 1105.538, "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/CopilotSDK/01-GitHub-Copilot-SDK-Binding.ipynb": 1923.3, - "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/EFCore/01-EFCore-Requetes-Compilees.ipynb": 1397.0, + "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/01-EFCore-Requetes-Compilees.ipynb": 1397.0, "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Orleans/01-Orleans-Grains-Agents.ipynb": 881.0, "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Orleans/02-Orleans-Aspire-CoHost.ipynb": 728.133, "MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Orleans/03-Orleans-Persistance-Redis.ipynb": 1234.077, From 2fcb5db820198364144edb3dd9597c6d4c53adef Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 3 Nov 2026 04:49:37 +0100 Subject: [PATCH 2/3] ci: re-trigger checks on #24338 (2 standalone checks cancelled pre-start under runner starvation) Co-Authored-By: Claude Haiku 5.5 From 65bdc3f2f7320c09567ff76c5c82b92622e6aeb9 Mon Sep 17 00:00:00 2001 From: jsboige Date: Wed, 4 Nov 2026 05:32:16 +0100 Subject: [PATCH 3/3] Fix(genai,#24338): ratio du README du hub ancre sur la valeur committee par le carnet (2,93x, pas 2,78x) Co-Authored-By: Claude Haiku 5.5 --- MyIA.AI.Notebooks/GenAI/Integrations-DotNet/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/README.md b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/README.md index c52db031319..8856e59dd2d 100644 --- a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/README.md +++ b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/README.md @@ -14,7 +14,7 @@ Le registre des axes distillables de la série vit dans | [Orleans/](Orleans/README.md) | 4 carnets : grains acteurs stateful pour les workloads IA, silo co-hosté par un AppHost, persistance Redis, cluster | | [CopilotSDK/](CopilotSDK/README.md) | Le SDK GitHub Copilot piloté depuis C# en streaming, endpoints typés + projet compagnon `CopilotAgent.App/` | | [Scrutor/](Scrutor/README.md) | Des endpoints de minimal API découverts par convention (`Scan()`) + lab `ScrutorLab/` | -| [01-EFCore-Requetes-Compilees.ipynb](01-EFCore-Requetes-Compilees.ipynb) | EF Core : le compilateur comme garde-fou jusque dans les requêtes (`EF.CompileQuery` mesuré 2,78×, `ToQueryString()`, `FromSqlInterpolated`) — binding sans projet compagnon, à la racine du hub | +| [01-EFCore-Requetes-Compilees.ipynb](01-EFCore-Requetes-Compilees.ipynb) | EF Core : le compilateur comme garde-fou jusque dans les requêtes (`EF.CompileQuery` mesuré 2,93×, `ToQueryString()`, `FromSqlInterpolated`) — binding sans projet compagnon, à la racine du hub | ## Rangement