@polymorphism-tech/morph-spec 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +314 -1673
- package/LICENSE +72 -72
- package/README.md +515 -516
- package/bin/detect-agents.js +225 -225
- package/bin/morph-spec.js +358 -173
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/task-manager.js +429 -0
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- package/bin/validate.js +369 -0
- package/content/.azure/README.md +293 -293
- package/content/.azure/docs/azure-devops-setup.md +454 -454
- package/content/.azure/docs/branch-strategy.md +398 -398
- package/content/.azure/docs/local-development.md +515 -515
- package/content/.azure/pipelines/pipeline-variables.yml +34 -34
- package/content/.azure/pipelines/prod-pipeline.yml +319 -319
- package/content/.azure/pipelines/staging-pipeline.yml +234 -234
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
- package/content/.claude/commands/morph-apply.md +221 -158
- package/content/.claude/commands/morph-archive.md +79 -79
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -0
- package/content/.claude/commands/morph-proposal.md +122 -101
- package/content/.claude/commands/morph-status.md +86 -86
- package/content/.claude/commands/morph-troubleshoot.md +122 -0
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/checklists/code-review.md +226 -0
- package/content/.claude/skills/checklists/morph-checklist.md +117 -0
- package/content/.claude/skills/checklists/simulation-checklist.md +77 -0
- package/content/.claude/skills/infra/bicep-architect.md +126 -419
- package/content/.claude/skills/infra/container-specialist.md +131 -437
- package/content/.claude/skills/infra/devops-engineer.md +119 -405
- package/content/.claude/skills/integrations/asaas-financial.md +130 -333
- package/content/.claude/skills/integrations/azure-identity.md +142 -309
- package/content/.claude/skills/integrations/clerk-auth.md +108 -290
- package/content/.claude/skills/integrations/resend-email.md +119 -0
- package/content/.claude/skills/specialists/ai-system-architect.md +192 -604
- package/content/.claude/skills/specialists/azure-architect.md +142 -142
- package/content/.claude/skills/specialists/code-analyzer.md +235 -0
- package/content/.claude/skills/specialists/dotnet-senior.md +287 -0
- package/content/.claude/skills/specialists/ef-modeler.md +113 -200
- package/content/.claude/skills/specialists/hangfire-orchestrator.md +126 -245
- package/content/.claude/skills/specialists/ms-agent-expert.md +109 -263
- package/content/.claude/skills/specialists/po-pm-advisor.md +197 -197
- package/content/.claude/skills/specialists/standards-architect.md +156 -78
- package/content/.claude/skills/specialists/testing-specialist.md +126 -0
- package/content/.claude/skills/specialists/ui-ux-designer.md +191 -1060
- package/content/.claude/skills/stacks/dotnet-blazor.md +210 -588
- package/content/.claude/skills/stacks/dotnet-nextjs.md +154 -402
- package/content/.claude/skills/workflows/morph-replicate.md +213 -0
- package/content/.claude/{commands/morph-clarify.md → skills/workflows/phase-clarify.md} +5 -58
- package/content/.claude/{commands/morph-design.md → skills/workflows/phase-design.md} +16 -86
- package/content/.claude/{commands/morph-setup.md → skills/workflows/phase-setup.md} +9 -17
- package/content/.claude/skills/workflows/phase-tasks.md +164 -0
- package/content/.claude/{commands/morph-uiux.md → skills/workflows/phase-uiux.md} +15 -88
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +378 -242
- package/content/.morph/config/config.template.json +89 -108
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/docs/workflows/design-impl.md +37 -0
- package/content/.morph/docs/workflows/fast-track.md +29 -0
- package/content/.morph/docs/workflows/full-morph.md +76 -0
- package/content/.morph/docs/workflows/standard.md +44 -0
- package/content/.morph/docs/workflows/ui-refresh.md +39 -0
- package/content/.morph/examples/api-nextjs/README.md +241 -241
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
- package/content/.morph/examples/api-nextjs/spec.md +399 -399
- package/content/.morph/examples/api-nextjs/tasks.md +168 -168
- package/content/.morph/examples/micro-saas/README.md +125 -125
- package/content/.morph/examples/micro-saas/contracts.cs +358 -358
- package/content/.morph/examples/micro-saas/decisions.md +246 -246
- package/content/.morph/examples/micro-saas/spec.md +236 -236
- package/content/.morph/examples/micro-saas/tasks.md +150 -150
- package/content/.morph/examples/multi-agent/README.md +309 -309
- package/content/.morph/examples/multi-agent/contracts.cs +433 -433
- package/content/.morph/examples/multi-agent/spec.md +479 -479
- package/content/.morph/examples/multi-agent/tasks.md +185 -185
- package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
- package/content/.morph/examples/scheduled-reports/spec.md +267 -0
- package/content/.morph/examples/state-v3.json +188 -0
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/README.md +190 -239
- package/content/.morph/hooks/pre-commit-agents.sh +24 -24
- package/content/.morph/hooks/pre-commit-all.sh +48 -48
- package/content/.morph/hooks/pre-commit-specs.sh +49 -49
- package/content/.morph/hooks/pre-commit-tests.sh +60 -60
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/schemas/tasks.schema.json +220 -0
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
- package/content/.morph/standards/agent-framework-production.md +410 -0
- package/content/.morph/standards/agent-framework-setup.md +413 -453
- package/content/.morph/standards/agent-framework-workflows.md +349 -0
- package/content/.morph/standards/architecture.md +325 -325
- package/content/.morph/standards/azure.md +605 -379
- package/content/.morph/standards/coding.md +377 -377
- package/content/.morph/standards/dotnet10-migration.md +520 -494
- package/content/.morph/standards/fluent-ui-setup.md +590 -590
- package/content/.morph/standards/migration-guide.md +514 -514
- package/content/.morph/standards/passkeys-auth.md +423 -423
- package/content/.morph/standards/vector-search-rag.md +536 -536
- package/content/.morph/state.json +17 -17
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/agent.cs +163 -172
- package/content/.morph/templates/clarify-questions.md +159 -0
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts/Commands.cs +74 -0
- package/content/.morph/templates/contracts/Entities.cs +25 -0
- package/content/.morph/templates/contracts/Queries.cs +74 -0
- package/content/.morph/templates/contracts/README.md +74 -0
- package/content/.morph/templates/contracts.cs +217 -217
- package/content/.morph/templates/decisions.md +123 -106
- package/content/.morph/templates/design-system.css +226 -226
- package/content/.morph/templates/infra/.dockerignore.example +89 -89
- package/content/.morph/templates/infra/Dockerfile.example +82 -82
- package/content/.morph/templates/infra/README.md +286 -286
- package/content/.morph/templates/infra/app-insights.bicep +63 -63
- package/content/.morph/templates/infra/app-service.bicep +164 -164
- package/content/.morph/templates/infra/container-app-env.bicep +49 -49
- package/content/.morph/templates/infra/container-app.bicep +156 -156
- package/content/.morph/templates/infra/deploy-checklist.md +426 -0
- package/content/.morph/templates/infra/deploy.ps1 +229 -229
- package/content/.morph/templates/infra/deploy.sh +208 -208
- package/content/.morph/templates/infra/key-vault.bicep +91 -91
- package/content/.morph/templates/infra/main.bicep +189 -189
- package/content/.morph/templates/infra/parameters.dev.json +29 -29
- package/content/.morph/templates/infra/parameters.prod.json +29 -29
- package/content/.morph/templates/infra/parameters.staging.json +29 -29
- package/content/.morph/templates/infra/sql-database.bicep +103 -103
- package/content/.morph/templates/infra/storage.bicep +106 -106
- package/content/.morph/templates/integrations/asaas-client.cs +387 -387
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
- package/content/.morph/templates/integrations/clerk-config.cs +258 -258
- package/content/.morph/templates/job.cs +171 -171
- package/content/.morph/templates/migration.cs +83 -83
- package/content/.morph/templates/proposal.md +141 -155
- package/content/.morph/templates/recap.md +94 -105
- package/content/.morph/templates/repository.cs +141 -141
- package/content/.morph/templates/saas/subscription.cs +347 -347
- package/content/.morph/templates/saas/tenant.cs +338 -338
- package/content/.morph/templates/service.cs +139 -139
- package/content/.morph/templates/simulation.md +353 -0
- package/content/.morph/templates/spec.md +149 -148
- package/content/.morph/templates/sprint-status.yaml +68 -68
- package/content/.morph/templates/state.template.json +222 -222
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/tasks.md +257 -235
- package/content/.morph/templates/test.cs +239 -239
- package/content/.morph/templates/ui-components.md +362 -276
- package/content/.morph/templates/ui-design-system.md +286 -286
- package/content/.morph/templates/ui-flows.md +336 -336
- package/content/.morph/templates/ui-mockups.md +133 -133
- package/content/.morph/test-infra/example.bicep +59 -59
- package/content/CLAUDE.md +150 -442
- package/content/README.md +79 -79
- package/detectors/config-detector.js +223 -223
- package/detectors/conversation-analyzer.js +163 -163
- package/detectors/index.js +84 -84
- package/detectors/standards-generator.js +275 -275
- package/detectors/structure-detector.js +245 -250
- package/docs/README.md +144 -149
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/examples.md +328 -328
- package/docs/getting-started.md +301 -302
- package/docs/installation.md +361 -361
- package/docs/templates.md +418 -418
- package/docs/validation-checklist.md +265 -266
- package/package.json +80 -80
- package/scripts/postinstall.js +132 -132
- package/src/commands/advance-phase.js +183 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -0
- package/src/commands/create-story.js +351 -351
- package/src/commands/detect-agents.js +139 -0
- package/src/commands/detect.js +104 -104
- package/src/commands/doctor.js +356 -280
- package/src/commands/generate.js +149 -149
- package/src/commands/init.js +258 -245
- package/src/commands/lint-fluent.js +352 -0
- package/src/commands/rollback-phase.js +185 -0
- package/src/commands/session-summary.js +291 -0
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/state.js +333 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/task.js +78 -0
- package/src/commands/troubleshoot.js +222 -0
- package/src/commands/update.js +192 -159
- package/src/commands/validate-blazor-state.js +210 -0
- package/src/commands/validate-blazor.js +156 -0
- package/src/commands/validate-css.js +84 -0
- package/src/commands/validate-phase.js +221 -0
- package/src/lib/blazor-concurrency-analyzer.js +288 -0
- package/src/lib/blazor-state-validator.js +291 -0
- package/src/lib/blazor-validator.js +374 -0
- package/src/lib/complexity-analyzer.js +441 -292
- package/src/lib/continuous-validator.js +421 -0
- package/src/lib/css-validator.js +352 -0
- package/src/lib/decision-constraint-loader.js +109 -0
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/learning-system.js +520 -0
- package/src/lib/mockup-generator.js +366 -0
- package/src/lib/recap-generator.js +205 -0
- package/src/lib/state-manager.js +397 -340
- package/src/lib/troubleshoot-grep.js +194 -0
- package/src/lib/troubleshoot-index.js +144 -0
- package/src/lib/ui-detector.js +350 -0
- package/src/lib/validation-runner.js +231 -0
- package/src/lib/validators/architecture-validator.js +387 -0
- package/src/lib/validators/contract-compliance-validator.js +273 -0
- package/src/lib/validators/package-validator.js +360 -0
- package/src/lib/validators/ui-contrast-validator.js +422 -0
- package/src/utils/file-copier.js +179 -139
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- package/content/.claude/commands/morph-costs.md +0 -206
- package/content/.claude/commands/morph-tasks.md +0 -319
- package/content/.claude/skills/specialists/cost-guardian.md +0 -110
- package/content/.claude/skills/stacks/shopify.md +0 -445
- package/content/.morph/config/azure-pricing.json +0 -70
- package/content/.morph/config/azure-pricing.schema.json +0 -50
- package/content/.morph/hooks/pre-commit-costs.sh +0 -91
- package/docs/api/cost-calculator.js.html +0 -513
- package/docs/api/design-system-generator.js.html +0 -382
- package/docs/api/global.html +0 -5263
- package/docs/api/index.html +0 -96
- package/docs/api/state-manager.js.html +0 -423
- package/src/commands/cost.js +0 -181
- package/src/commands/update-pricing.js +0 -206
- package/src/lib/cost-calculator.js +0 -429
|
@@ -1,453 +1,413 @@
|
|
|
1
|
-
# Microsoft Agent Framework - Setup
|
|
2
|
-
|
|
3
|
-
> **
|
|
4
|
-
> Semantic Kernel
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
##
|
|
9
|
-
|
|
10
|
-
```xml
|
|
11
|
-
<!-- .csproj -->
|
|
12
|
-
<PackageReference Include="Microsoft.Agents.AI" Version="1.0.0" />
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
_logger.LogInformation("
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
[Description("
|
|
170
|
-
public async Task<string> GetWeatherAsync(
|
|
171
|
-
[Description("
|
|
172
|
-
CancellationToken ct = default)
|
|
173
|
-
{
|
|
174
|
-
var weather = await _weatherService.
|
|
175
|
-
return $"Temp: {weather.Temperature}°C,
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
//
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
})
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
---
|
|
368
|
-
|
|
369
|
-
##
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
---
|
|
419
|
-
|
|
420
|
-
## ✅ Checklist de Implementação
|
|
421
|
-
|
|
422
|
-
- [ ] Package `Microsoft.Agents.AI` instalado
|
|
423
|
-
- [ ] `IChatClient` registrado como singleton
|
|
424
|
-
- [ ] Agents criados com `client.CreateAgent()`
|
|
425
|
-
- [ ] Agents registrados como services (scoped/transient)
|
|
426
|
-
- [ ] API keys no Key Vault (produção)
|
|
427
|
-
- [ ] Logging configurado para agents
|
|
428
|
-
- [ ] Observabilidade com Aspire (opcional)
|
|
429
|
-
- [ ] Error handling para rate limits
|
|
430
|
-
- [ ] Testes de integração para agents
|
|
431
|
-
|
|
432
|
-
---
|
|
433
|
-
|
|
434
|
-
## 🚫 O Que NÃO Fazer
|
|
435
|
-
|
|
436
|
-
❌ Usar Semantic Kernel
|
|
437
|
-
❌ Usar `Kernel.CreateFunctionFromPrompt()`
|
|
438
|
-
❌ Usar `ChatHistory` (use Threads)
|
|
439
|
-
❌ Hardcoded API keys
|
|
440
|
-
❌ Modelos pequenos (<3B) para tool calling
|
|
441
|
-
|
|
442
|
-
---
|
|
443
|
-
|
|
444
|
-
## 📚 Referências
|
|
445
|
-
|
|
446
|
-
- [Microsoft Agent Framework Documentation](https://learn.microsoft.com/agent-framework/)
|
|
447
|
-
- [Agent Framework GitHub](https://github.com/microsoft/agent-framework)
|
|
448
|
-
- [Microsoft.Extensions.AI](https://learn.microsoft.com/dotnet/ai/ai-extensions)
|
|
449
|
-
- [Azure OpenAI Service](https://learn.microsoft.com/azure/ai-services/openai/)
|
|
450
|
-
|
|
451
|
-
---
|
|
452
|
-
|
|
453
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
1
|
+
# Microsoft Agent Framework - Setup Guide (.NET 10)
|
|
2
|
+
|
|
3
|
+
> **IMPORTANT:** MORPH-SPEC uses **exclusively** Microsoft Agent Framework.
|
|
4
|
+
> Semantic Kernel is superseded. Do NOT use `Kernel`, `KernelFunction`, or `InvokePromptAsync`.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Packages
|
|
9
|
+
|
|
10
|
+
```xml
|
|
11
|
+
<!-- .csproj -->
|
|
12
|
+
<PackageReference Include="Microsoft.Agents.AI" Version="1.0.0-preview.*" />
|
|
13
|
+
<PackageReference Include="Microsoft.Agents.AI.Abstractions" Version="1.0.0-preview.*" />
|
|
14
|
+
<PackageReference Include="Microsoft.Agents.AI.OpenAI" Version="1.0.0-preview.*" />
|
|
15
|
+
|
|
16
|
+
<!-- For Web API hosting + A2A -->
|
|
17
|
+
<PackageReference Include="Microsoft.Agents.AI.Hosting" Version="1.0.0-preview.*" />
|
|
18
|
+
|
|
19
|
+
<!-- For Azure OpenAI -->
|
|
20
|
+
<PackageReference Include="Azure.AI.OpenAI" Version="2.*" />
|
|
21
|
+
<PackageReference Include="Azure.Identity" Version="1.*" />
|
|
22
|
+
|
|
23
|
+
<!-- For Microsoft.Extensions.AI abstractions -->
|
|
24
|
+
<PackageReference Include="Microsoft.Extensions.AI" Version="10.2.0" />
|
|
25
|
+
<PackageReference Include="Microsoft.Extensions.AI.OpenAI" Version="9.3.0-preview.*" />
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Quick Start (Minimal Agent)
|
|
31
|
+
|
|
32
|
+
```csharp
|
|
33
|
+
using Azure.AI.OpenAI;
|
|
34
|
+
using Azure.Identity;
|
|
35
|
+
using Microsoft.Agents.AI;
|
|
36
|
+
|
|
37
|
+
AIAgent agent = new AzureOpenAIClient(
|
|
38
|
+
new Uri("https://your-resource.openai.azure.com/"),
|
|
39
|
+
new AzureCliCredential())
|
|
40
|
+
.GetChatClient("gpt-4o-mini")
|
|
41
|
+
.AsAIAgent(instructions: "You are a helpful assistant.");
|
|
42
|
+
|
|
43
|
+
Console.WriteLine(await agent.RunAsync("Analyze this order."));
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Setup by Provider
|
|
49
|
+
|
|
50
|
+
### Azure OpenAI (Production)
|
|
51
|
+
|
|
52
|
+
```csharp
|
|
53
|
+
using Azure.AI.OpenAI;
|
|
54
|
+
using Azure.Identity;
|
|
55
|
+
using Microsoft.Extensions.AI;
|
|
56
|
+
|
|
57
|
+
builder.Services.AddSingleton<IChatClient>(sp =>
|
|
58
|
+
{
|
|
59
|
+
var cfg = sp.GetRequiredService<IConfiguration>();
|
|
60
|
+
return new AzureOpenAIClient(
|
|
61
|
+
new Uri(cfg["AzureOpenAI:Endpoint"]!),
|
|
62
|
+
new DefaultAzureCredential()) // Managed Identity
|
|
63
|
+
.GetChatClient(cfg["AzureOpenAI:DeploymentName"] ?? "gpt-4o-mini")
|
|
64
|
+
.AsIChatClient();
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### GitHub Models (Development)
|
|
69
|
+
|
|
70
|
+
```csharp
|
|
71
|
+
using OpenAI;
|
|
72
|
+
using Microsoft.Extensions.AI;
|
|
73
|
+
|
|
74
|
+
builder.Services.AddSingleton<IChatClient>(sp =>
|
|
75
|
+
{
|
|
76
|
+
var cfg = sp.GetRequiredService<IConfiguration>();
|
|
77
|
+
return new ChatClient(
|
|
78
|
+
"gpt-4o-mini",
|
|
79
|
+
new ApiKeyCredential(cfg["GitHub:Token"]!),
|
|
80
|
+
new OpenAIClientOptions { Endpoint = new Uri("https://models.github.ai/inference") })
|
|
81
|
+
.AsIChatClient();
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Ollama (Local)
|
|
86
|
+
|
|
87
|
+
```csharp
|
|
88
|
+
builder.Services.AddSingleton<IChatClient>(sp =>
|
|
89
|
+
new ChatClient("llama3.2:3b",
|
|
90
|
+
endpoint: new Uri("http://localhost:11434"))
|
|
91
|
+
.AsIChatClient());
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Agent Pattern (Required)
|
|
97
|
+
|
|
98
|
+
### Using ChatClientAgent
|
|
99
|
+
|
|
100
|
+
```csharp
|
|
101
|
+
using Microsoft.Agents.AI;
|
|
102
|
+
using Microsoft.Extensions.AI;
|
|
103
|
+
|
|
104
|
+
public class OrderAnalysisAgent
|
|
105
|
+
{
|
|
106
|
+
private readonly IChatClient _chatClient;
|
|
107
|
+
private readonly ILogger<OrderAnalysisAgent> _logger;
|
|
108
|
+
|
|
109
|
+
public OrderAnalysisAgent(IChatClient chatClient, ILogger<OrderAnalysisAgent> logger)
|
|
110
|
+
{
|
|
111
|
+
_chatClient = chatClient;
|
|
112
|
+
_logger = logger;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public async Task<string> AnalyzeAsync(Order order, CancellationToken ct = default)
|
|
116
|
+
{
|
|
117
|
+
var agent = new ChatClientAgent(
|
|
118
|
+
_chatClient,
|
|
119
|
+
new ChatClientAgentOptions
|
|
120
|
+
{
|
|
121
|
+
Name = "OrderAnalyzer",
|
|
122
|
+
Instructions = """
|
|
123
|
+
You are an e-commerce order analyst.
|
|
124
|
+
Analyze the order and return:
|
|
125
|
+
1. Summary
|
|
126
|
+
2. Upsell suggestions
|
|
127
|
+
3. Cancellation risk (low/medium/high)
|
|
128
|
+
Be concise.
|
|
129
|
+
"""
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
_logger.LogInformation("Analyzing order {OrderNumber}", order.OrderNumber);
|
|
133
|
+
|
|
134
|
+
var response = await agent.RunAsync(
|
|
135
|
+
$"Order: {order.OrderNumber}, Total: {order.Total:C}, Items: {order.Items.Count}",
|
|
136
|
+
cancellationToken: ct);
|
|
137
|
+
|
|
138
|
+
return response.Text;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Using AsAIAgent (Shorthand)
|
|
144
|
+
|
|
145
|
+
```csharp
|
|
146
|
+
AIAgent agent = chatClient.AsAIAgent(
|
|
147
|
+
instructions: "You are a helpful assistant.",
|
|
148
|
+
name: "MyAgent");
|
|
149
|
+
|
|
150
|
+
var response = await agent.RunAsync("Hello!", cancellationToken: ct);
|
|
151
|
+
Console.WriteLine(response.Text);
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Tools (Function Calling)
|
|
157
|
+
|
|
158
|
+
### Define Tools with AIFunctionFactory
|
|
159
|
+
|
|
160
|
+
```csharp
|
|
161
|
+
using Microsoft.Extensions.AI;
|
|
162
|
+
|
|
163
|
+
public class WeatherFunctions
|
|
164
|
+
{
|
|
165
|
+
private readonly IWeatherService _weatherService;
|
|
166
|
+
|
|
167
|
+
public WeatherFunctions(IWeatherService weatherService) => _weatherService = weatherService;
|
|
168
|
+
|
|
169
|
+
[Description("Gets current weather for a city")]
|
|
170
|
+
public async Task<string> GetWeatherAsync(
|
|
171
|
+
[Description("City name")] string city,
|
|
172
|
+
CancellationToken ct = default)
|
|
173
|
+
{
|
|
174
|
+
var weather = await _weatherService.GetCurrentAsync(city, ct);
|
|
175
|
+
return $"Temp: {weather.Temperature}°C, Condition: {weather.Condition}";
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
[Description("Gets weather forecast for upcoming days")]
|
|
179
|
+
public async Task<string> GetForecastAsync(
|
|
180
|
+
[Description("City name")] string city,
|
|
181
|
+
[Description("Number of days")] int days = 3,
|
|
182
|
+
CancellationToken ct = default)
|
|
183
|
+
{
|
|
184
|
+
var forecast = await _weatherService.GetForecastAsync(city, days, ct);
|
|
185
|
+
return string.Join("\n", forecast.Select(f => $"{f.Date:dd/MM}: {f.Temperature}°C"));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Register Agent with Tools
|
|
191
|
+
|
|
192
|
+
```csharp
|
|
193
|
+
var weatherFunctions = new WeatherFunctions(weatherService);
|
|
194
|
+
|
|
195
|
+
var agent = new ChatClientAgent(
|
|
196
|
+
chatClient,
|
|
197
|
+
new ChatClientAgentOptions
|
|
198
|
+
{
|
|
199
|
+
Name = "WeatherAssistant",
|
|
200
|
+
Instructions = "You help with weather questions. Use available tools.",
|
|
201
|
+
ChatOptions = new ChatOptions
|
|
202
|
+
{
|
|
203
|
+
Tools =
|
|
204
|
+
[
|
|
205
|
+
AIFunctionFactory.Create(weatherFunctions.GetWeatherAsync),
|
|
206
|
+
AIFunctionFactory.Create(weatherFunctions.GetForecastAsync)
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Static Function Tools
|
|
213
|
+
|
|
214
|
+
```csharp
|
|
215
|
+
[Description("Gets the current date and time")]
|
|
216
|
+
static string GetCurrentDateTime() => DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
|
217
|
+
|
|
218
|
+
var agent = chatClient.AsAIAgent(
|
|
219
|
+
instructions: "You are a helpful assistant.",
|
|
220
|
+
tools: [AIFunctionFactory.Create(GetCurrentDateTime)]);
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Dependency Injection (Web API / Blazor)
|
|
226
|
+
|
|
227
|
+
### Register Agents with Keyed Services
|
|
228
|
+
|
|
229
|
+
```csharp
|
|
230
|
+
// Program.cs
|
|
231
|
+
builder.AddAIAgent("OrderAnalyzer", (sp, key) =>
|
|
232
|
+
{
|
|
233
|
+
var chatClient = sp.GetRequiredService<IChatClient>();
|
|
234
|
+
var orderFunctions = sp.GetRequiredService<OrderFunctions>();
|
|
235
|
+
|
|
236
|
+
return new ChatClientAgent(
|
|
237
|
+
chatClient,
|
|
238
|
+
name: key,
|
|
239
|
+
instructions: "You are an order analysis expert.",
|
|
240
|
+
tools:
|
|
241
|
+
[
|
|
242
|
+
AIFunctionFactory.Create(orderFunctions.GetOrderAsync),
|
|
243
|
+
AIFunctionFactory.Create(orderFunctions.CalculateDiscountAsync)
|
|
244
|
+
]);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// Simple agent (no tools)
|
|
248
|
+
builder.AddAIAgent(
|
|
249
|
+
name: "Editor",
|
|
250
|
+
instructions: "You are an editor who improves text quality.");
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Inject in Controllers / Blazor Components
|
|
254
|
+
|
|
255
|
+
```csharp
|
|
256
|
+
// Controller
|
|
257
|
+
public class AgentController(
|
|
258
|
+
[FromKeyedServices("OrderAnalyzer")] AIAgent orderAgent) : ControllerBase
|
|
259
|
+
{
|
|
260
|
+
[HttpPost("analyze")]
|
|
261
|
+
public async Task<IActionResult> Analyze(OrderRequest request)
|
|
262
|
+
{
|
|
263
|
+
var response = await orderAgent.RunAsync(request.Prompt);
|
|
264
|
+
return Ok(response.Text);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Blazor component
|
|
269
|
+
@inject IServiceProvider ServiceProvider
|
|
270
|
+
@code {
|
|
271
|
+
private AIAgent _agent = default!;
|
|
272
|
+
|
|
273
|
+
protected override void OnInitialized()
|
|
274
|
+
{
|
|
275
|
+
_agent = ServiceProvider.GetRequiredKeyedService<AIAgent>("OrderAnalyzer");
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## Streaming
|
|
283
|
+
|
|
284
|
+
```csharp
|
|
285
|
+
await foreach (var update in agent.RunStreamingAsync(
|
|
286
|
+
"Write a detailed analysis.",
|
|
287
|
+
cancellationToken: ct))
|
|
288
|
+
{
|
|
289
|
+
if (update is AgentResponseUpdateEvent e)
|
|
290
|
+
{
|
|
291
|
+
Console.Write(e.Data);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Recommended Models
|
|
299
|
+
|
|
300
|
+
| Use Case | Model | Provider | Cost (per 1M input tokens) |
|
|
301
|
+
|----------|-------|----------|---------------------------|
|
|
302
|
+
| Simple tasks (default) | gpt-4o-mini | Azure OpenAI | $0.15 |
|
|
303
|
+
| Complex analysis | gpt-4o | Azure OpenAI | $2.50 |
|
|
304
|
+
| Embeddings | text-embedding-3-small | Azure OpenAI | $0.02 |
|
|
305
|
+
| Local development | llama3.2:3b | Ollama | Free |
|
|
306
|
+
| Cloud development | gpt-4o-mini | GitHub Models | Free (preview) |
|
|
307
|
+
|
|
308
|
+
**MORPH-SPEC default:** `gpt-4o-mini` for production.
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Security
|
|
313
|
+
|
|
314
|
+
### API Keys in Azure Key Vault
|
|
315
|
+
|
|
316
|
+
```csharp
|
|
317
|
+
if (builder.Environment.IsProduction())
|
|
318
|
+
{
|
|
319
|
+
var keyVaultUri = new Uri(builder.Configuration["KeyVault:Uri"]!);
|
|
320
|
+
builder.Configuration.AddAzureKeyVault(keyVaultUri, new DefaultAzureCredential());
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Managed Identity (Recommended)
|
|
325
|
+
|
|
326
|
+
```csharp
|
|
327
|
+
// Use DefaultAzureCredential — works with Managed Identity in production,
|
|
328
|
+
// AzureCliCredential in development
|
|
329
|
+
var client = new AzureOpenAIClient(
|
|
330
|
+
new Uri(config["AzureOpenAI:Endpoint"]!),
|
|
331
|
+
new DefaultAzureCredential());
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## Observability
|
|
337
|
+
|
|
338
|
+
```csharp
|
|
339
|
+
// Enable OpenTelemetry on agents
|
|
340
|
+
agent.WithOpenTelemetry();
|
|
341
|
+
|
|
342
|
+
// Program.cs — Aspire Dashboard integration
|
|
343
|
+
builder.Services.AddOpenTelemetry()
|
|
344
|
+
.WithTracing(tracing =>
|
|
345
|
+
{
|
|
346
|
+
tracing.AddSource("Experimental.Microsoft.Extensions.AI.*");
|
|
347
|
+
tracing.AddAspNetCoreInstrumentation();
|
|
348
|
+
})
|
|
349
|
+
.WithMetrics(metrics =>
|
|
350
|
+
{
|
|
351
|
+
metrics.AddMeter("Experimental.Microsoft.Extensions.AI.*");
|
|
352
|
+
metrics.AddAspNetCoreInstrumentation();
|
|
353
|
+
});
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Limitations & Troubleshooting
|
|
359
|
+
|
|
360
|
+
| Problem | Cause | Solution |
|
|
361
|
+
|---------|-------|----------|
|
|
362
|
+
| Tool calling fails | Model < 3B params | Use gpt-4o-mini minimum |
|
|
363
|
+
| Rate limit errors | Too many requests | Add retry middleware (see production.md) |
|
|
364
|
+
| Tools not invoked | Missing `[Description]` | Add `[Description]` to method AND parameters |
|
|
365
|
+
| Agent returns empty | No instructions | Always set `Instructions` in agent options |
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## Checklist
|
|
370
|
+
|
|
371
|
+
- [ ] `Microsoft.Agents.AI` + `Microsoft.Agents.AI.OpenAI` installed
|
|
372
|
+
- [ ] `IChatClient` registered as singleton via DI
|
|
373
|
+
- [ ] Agents created with `ChatClientAgent` or `AsAIAgent()`
|
|
374
|
+
- [ ] Agents registered with `builder.AddAIAgent()` (keyed services)
|
|
375
|
+
- [ ] Tools use `AIFunctionFactory.Create()` + `[Description]`
|
|
376
|
+
- [ ] API keys in Key Vault (production)
|
|
377
|
+
- [ ] Managed Identity configured
|
|
378
|
+
- [ ] gpt-4o-mini as default model
|
|
379
|
+
- [ ] OpenTelemetry enabled on agents
|
|
380
|
+
- [ ] Error handling via middleware (see `agent-framework-production.md`)
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## What NOT To Do
|
|
385
|
+
|
|
386
|
+
| Wrong | Correct |
|
|
387
|
+
|-------|---------|
|
|
388
|
+
| `using Microsoft.SemanticKernel` | `using Microsoft.Agents.AI` |
|
|
389
|
+
| `Kernel.InvokePromptAsync()` | `agent.RunAsync()` |
|
|
390
|
+
| `[KernelFunction]` | `AIFunctionFactory.Create()` |
|
|
391
|
+
| `[AgentTool]` attribute | `[Description]` + `AIFunctionFactory` |
|
|
392
|
+
| `AgentTool.FromMethod()` | `AIFunctionFactory.Create(method)` |
|
|
393
|
+
| `_chatClient.CreateAgent()` | `new ChatClientAgent()` or `.AsAIAgent()` |
|
|
394
|
+
| `agent.CreateThreadAsync()` | Use session/conversation management |
|
|
395
|
+
| `ChatHistory` | `IEnumerable<ChatMessage>` |
|
|
396
|
+
| Hardcoded API keys | Key Vault / Managed Identity |
|
|
397
|
+
| Models < 3B for tools | gpt-4o-mini minimum |
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## References
|
|
402
|
+
|
|
403
|
+
- [Agent Framework Quick Start](https://learn.microsoft.com/agent-framework/tutorials/quick-start)
|
|
404
|
+
- [Agent Tools](https://learn.microsoft.com/agent-framework/user-guide/agents/agent-tools)
|
|
405
|
+
- [Microsoft.Extensions.AI](https://learn.microsoft.com/dotnet/ai/ai-extensions)
|
|
406
|
+
- [GitHub: microsoft/agent-framework](https://github.com/microsoft/agent-framework)
|
|
407
|
+
- `agent-framework-workflows.md` — Orchestration patterns
|
|
408
|
+
- `agent-framework-production.md` — Middleware, A2A, MCP, caching
|
|
409
|
+
- `agent-framework-blazor-ui.md` — Natural Language First UI patterns
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
*MORPH-SPEC by Polymorphism Tech*
|