Table of Contents

Field SourcesPropertyKey

Namespace
Qavren.Edge.Rag
Assembly
Qavren.Edge.Rag.dll

Carries IReadOnlyList<RagSource>, ranked, clamped and Ordinal-stamped.

It is used on both sides of the call, and that is the specified channel by which an inner client receives the structured sources. Before invoking the inner client, RagChatClient clones the caller's ChatOptions and sets this key on the clone's AdditionalProperties; after the turn it sets the same key on the ChatResponse. An inner client that wants the sources reads the request-side entry and never re-parses the rendered text block, which exists for the model to read. ExtractiveChatClient is the one in-box client that does so.

The clone matters: MEAI's IChatClient contract permits an implementation to mutate the ChatOptions it is handed, so consumers must not share one across concurrent calls - which means this client must not write into the caller's instance either. ChatOptions.Clone() is public and shallow-copies AdditionalProperties into a new dictionary, which is exactly the isolation needed.

A leaf that does not know this key ignores it: EdgeChatClient forwards AdditionalProperties to GeneratorParams.SetSearchOption only for bool and double values and skips everything else, so a RagSource list on the request is inert rather than a failure. A third-party leaf that inspected every property would see a documented, publicly-typed value.

public const string SourcesPropertyKey = "qavren.edge.rag.sources"

Returns

string
Carries IReadOnlyList<RagSource>, ranked, clamped and Ordinal-stamped. It is used on both sides of the call, and that is the specified channel by which an inner client receives the structured sources. Before invoking the inner client, RagChatClient clones the caller's ChatOptions and sets this key on the clone's AdditionalProperties; after the turn it sets the same key on the ChatResponse. An inner client that wants the sources reads the request-side entry and never re-parses the rendered text block, which exists for the model to read. ExtractiveChatClient is the one in-box client that does so. The clone matters: MEAI's IChatClient contract permits an implementation to mutate the ChatOptions it is handed, so consumers must not share one across concurrent calls - which means this client must not write into the caller's instance either. ChatOptions.Clone() is public and shallow-copies AdditionalProperties into a new dictionary, which is exactly the isolation needed. A leaf that does not know this key ignores it: EdgeChatClient forwards AdditionalProperties to GeneratorParams.SetSearchOption only for bool and double values and skips everything else, so a RagSource list on the request is inert rather than a failure. A third-party leaf that inspected every property would see a documented, publicly-typed value.