Use evals before changing prompts

Treat prompt changes like code changes: measure the behavior before deciding whether the edit helped.

July 9, 2026 · 2 min · Lukas Walter

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

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

Keep vector search filters separate from semantic ranking

Use filters for eligibility and ranking for relevance instead of blending both concerns.

July 5, 2026 · 2 min · Lukas Walter

Run Python in-process from .NET with CSnakes

A quick tip for embedding Python directly into a .NET app with CSnakes when you want a small slice of the Python ecosystem without a separate API service.

July 5, 2026 · 4 min · Lukas Walter

Separate prompts from authorization

Do not let prompt instructions decide what data or actions a user is allowed to access.

July 5, 2026 · 2 min · Lukas Walter

Use approval for side effects, not for every tool call

Reserve human approval for actions where a wrong call would actually matter.

July 5, 2026 · 2 min · Lukas Walter