e-naxosMAF COURSE / COURS
English

MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1

Connexion et capacités

Distinguer connexion, capacités testées et premier agent.

Objectifs

Une connexion commune, deux profils

Maf.DemoConnection fournit IChatClient et IEmbeddingGenerator<string, Embedding<float>>. Ce module ne contient ni agents ni règles métier. ChatProvider choisit le chat ; EmbeddingProvider choisit indépendamment les embeddings. Le profil distribué vise Ollama sur http://localhost:11434/, granite4:3b pour le chat et embeddinggemma:300m pour les vecteurs. Un chat API peut conserver les embeddings locaux.

var builder = Host.CreateApplicationBuilder();
builder.Configuration.AddDemoConfiguration(args);
var settings = ConnectionOptions.FromConfiguration(builder.Configuration);
builder.Services.AddDemoConnection(settings);
using var host = builder.Build();

demos/Demo020_ConnectionProfiles/Console/Program.cs · L7–L11 · 9a895c94534c

Code source · Demo020 · Dossier

Charger les réglages au démarrage

La priorité est : valeurs locales au binaire, fichier central, environnement, arguments explicites de la démo. Le fichier commun est shared/Configuration/ai-settings.json. Les programmes le trouvent en remontant depuis leur exécutable jusqu’à la solution ; le dossier courant ne décide pas du profil. Après sauvegarde, redémarrer les programmes pour appliquer le changement, sans recompilation. Une copie locale au binaire sert de repli hors de l’arbre partagé.

MAF_DEMO_CONFIG sélectionne un fichier JSON absolu existant. Les variables AI__... utilisent deux soulignés pour les sections ; les arguments --AI:... passent après -- dans dotnet run. Une surcharge peut expliquer pourquoi une modification du fichier semble sans effet. Changer le chat ne change pas l’index d’embeddings ; tout changement du fournisseur, modèle ou dimension des vecteurs exige sa reconstruction explicite.

public static ConnectionOptions Load(string[] args) => ConnectionOptions.FromConfiguration(
    new ConfigurationBuilder().AddDemoConfiguration(args).Build());

shared/Maf.Backlog/DemoSettings.cs · L10–L11 · 9a895c94534c

Code source · Maf.Backlog · Dossier

Une réponse de chat ne qualifie pas les outils

Créer le client ne fait aucun appel réseau. Le premier appel teste le service sélectionné. Demo030 va plus loin avec cinq sondes : texte, structure validée, outil réellement exécuté avec reçu imprévisible, streaming et annulation d’un flux actif. Le rapport nomme fournisseur, modèle, protocole, date et résultats individuels. Une capacité en échec reste en échec ; aucun autre fournisseur n’est essayé automatiquement.

Passed signifie que la sonde et ses assertions sont passées sur ce profil. Cela ne prouve ni une compréhension métier générale ni la qualité d’un juge. Les compteurs d’usage absents restent null ; ne pas les afficher comme zéro ni comme coût nul. Les modèles changent derrière certains alias serveur : conserver le profil et les conditions des essais.

Le premier agent

Demo040 adapte le client avec AsAIAgent, nomme IntakeAgent et donne des instructions de triage Bug, Feature ou Question. RunAsync reçoit une demande et retourne une réponse libre. La boucle console ne rend pas automatiquement la conversation persistante : aucun outil d’action ni session durable n’y est ajouté. Le texte suggère une priorité et un composant, sans créer un ticket.

Le nom de l’agent facilite son identification ; les instructions décrivent son rôle. RunAsync retourne un AgentResponse, dont Text est une vue pratique du texte final. Les messages et demandes d’outils doivent être examinés dans la réponse complète lorsque le scénario en dépend, comme dans Demo080.

var agent = chat.AsAIAgent(name: "IntakeAgent", instructions:
    "Classify a product request as Bug, Feature or Question. Suggest priority and component. Answer in English. No actions are available.");

demos/Demo040_FirstAgent/Program.cs · L13–L14 · 9a895c94534c

Code source · Demo040 · Dossier

Secrets et délais

Pour un profil API compatible, fournir explicitement endpoint, modèle et nom de variable de clé. Le JSON stocke les noms MAF_API_KEY et MAF_EMBEDDING_API_KEY, jamais les secrets. Aucun compte ChatGPT n’est connecté. Le timeout HTTP distribué est de 120 secondes par requête ; un token avec échéance borne le scénario. La disponibilité de /health dans Demo020 prouve le processus HTTP, pas le modèle.

Vérifier puis structurer

Dépannage par frontière

Symptôme, vérification et correction
MécanismePortée
SDK/paquet absentLire global.json, restaurer en mode verrouillé, conserver les fichiers centraux ; ne pas actualiser les versions au hasard.
Connexion refusée / modèle absentLire endpoint et modèle effectifs du configurateur ; vérifier le service choisi et son catalogue. Aucun fallback API caché.
Index incompatibleComparer modèle, dimensions, empreinte corpus et date ; reconstruire explicitement dans le même état SQLite.
Outil découvert mais refuséVérifier allowlist hôte et arguments ; découverte MCP ne signifie pas autorisation.
Snapshot rejetéConserver la preuve de l’erreur ; choisir explicitement une nouvelle session pour repartir. Ne pas écraser silencieusement l’ancien état.
Flux sans completed / HTTP 409Inspecter terminal, annulation et génération concurrente ; ne pas considérer EOF ou un texte partiel comme succès.
Écriture absenteLire validation, décision et SQLite ; une phrase du modèle ne prouve aucune création.

Prérequis

Pour poursuivre

Précédent

Suivant

lot014-consolidation-1 · 2026-10-24 · 9a895c94534cd5fc6f3da883e37e5f7856e588c1