Make AG-UI events drive UI state, not assistant prose

Reduce structured AG-UI events into frontend state instead of parsing generated text to control application components.

August 28, 2026 · 3 min · Lukas Walter

Version prompts, models, datasets, and evaluation results together

Keep every evaluation result tied to the exact prompt, model identities, dataset, evaluator, and configuration that produced it.

August 27, 2026 · 4 min · Lukas Walter

Provider Independence from Day One

A C# implementation for keeping provider coupling at explicit boundaries while making model capabilities and provider-specific behavior visible.

August 25, 2026 · 12 min · Lukas Walter

Retries Are Not a Recovery Strategy

Why bounded retries help with transient faults but cannot resolve unknown outcomes, partial workflows, or duplicated side effects in AI systems.

August 23, 2026 · 12 min · Lukas Walter

Separate ingestion health from retrieval readiness

A failed ingestion run should not stop retrieval while an accepted index remains queryable and eligible to serve.

August 23, 2026 · 5 min · Lukas Walter

Cap tool-call loops explicitly

Set a hard iteration limit on automatic function invocation and treat hitting it as an explicit application outcome.

August 22, 2026 · 2 min · Lukas Walter

Embeddings in .NET

How to generate text embeddings with Microsoft.Extensions.AI and keep the model, dimensions, comparison metric, and indexing behavior compatible.

August 19, 2026 · 11 min · Lukas Walter

What Happens When Your AI Feature Fails?

A practical way to identify failure modes, choose explicit application behavior, and test an AI feature before its successful path hides the hard decisions.

August 15, 2026 · 12 min · Lukas Walter

Designing an AI Service Layer

How to place model access, prompts, retrieval, tools, and application policy behind a maintainable use-case boundary in a .NET application.

August 12, 2026 · 11 min · Lukas Walter

Validate tool arguments at the execution boundary

Treat model-generated tool arguments as untrusted input even when they satisfy the generated schema and bind successfully to the expected C# types.

August 11, 2026 · 2 min · Lukas Walter