Keep RAG citations tied to retrieved chunks

Citations should point back to the retrieved evidence, not to sources the model guessed after answering.

July 8, 2026 · 2 min · Lukas Walter

Observability for Agents with OpenTelemetry, Aspire, and Application Insights

How to make Microsoft Agent Framework behavior visible in production with OpenTelemetry traces, token usage, model calls, tool calls, Aspire local debugging, and Application Insights monitoring.

July 8, 2026 · 17 min · Lukas Walter

Use CSnakes when Python is a function call, not a service

Embed a small typed Python capability in .NET when an HTTP service would be more boundary than value.

July 8, 2026 · 2 min · Lukas Walter

Use IHttpClientFactory

Create configured HttpClient instances through the factory instead of scattering clients and handlers.

July 8, 2026 · 2 min · Lukas Walter

Cache GET responses only when user context is clear

Do not cache a GET response unless the cache key matches the user, tenant, and permission boundary that shaped it.

July 7, 2026 · 3 min · Lukas Walter

Assign least-privilege Azure roles, not broad contributor rights

Give workloads and people the narrow Azure role they need instead of defaulting to Contributor.

July 5, 2026 · 2 min · Lukas Walter

Avoid hidden allocations in hot paths

Watch for small per-item allocations inside loops, parsers, serializers, and request paths.

July 5, 2026 · 2 min · Lukas Walter

Do not hide exceptions inside fire-and-forget tasks

If work can fail, give it ownership, logging, cancellation, and a lifecycle.

July 5, 2026 · 2 min · Lukas Walter

Expose a Python FastAPI AI tool as an Aspire service

Keep Python AI code behind an HTTP boundary and let Aspire wire it into the local system.

July 5, 2026 · 1 min · Lukas Walter

Keep model name and deployment name in config

Do not hard-code model routing decisions into application logic.

July 5, 2026 · 2 min · Lukas Walter