Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<TResult>.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<PermissionRequest, PermissionInvocation, Task<PermissionDecision>>`, 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 |
Expand Down
Original file line number Diff line number Diff line change
@@ -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)).
31 changes: 31 additions & 0 deletions MyIA.AI.Notebooks/GenAI/Integrations-DotNet/README.md
Original file line number Diff line number Diff line change
@@ -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,93×, `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).
10 changes: 10 additions & 0 deletions MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Scrutor/README.md
Original file line number Diff line number Diff line change
@@ -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)).
2 changes: 1 addition & 1 deletion MyIA.AI.Notebooks/GenAI/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
2 changes: 1 addition & 1 deletion _quarto.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion docs/curriculum/genai.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
Loading
Loading