Skip to content

Add experimental provider-neutral decision abstractions (Layer 1) - #7795

Open
luisquintanilla wants to merge 11 commits into
mainfrom
luisquintanilla-decision-foundation-api
Open

luisquintanilla wants to merge 11 commits into
mainfrom
luisquintanilla-decision-foundation-api

Conversation

@luisquintanilla

@luisquintanilla luisquintanilla commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Background and motivation

Applications sometimes need to ask several business questions about the same input and retain the probability evidence behind the answers. For a customer-support ticket, that might mean selecting a category, estimating whether a refund is being requested, and assessing urgency against an ordered rubric.

MEAI already supports typed chat output and tool calling. This proposal adds a distinct provider-neutral capability for Binary, Choice, and Score observations, including complete distributions. It does not treat ordinary structured chat output as a source of model probabilities.

Layer 1 provides a non-generic provider contract and an optional typed application-facing convenience API. Related proposal: #7764. Function and routing composition follow in #7796. Native stack #7797 is ordered #7795 -> #7796.

Review scope: this PR contains the foundation contracts, typed binding, and optional named feature projection, not provider implementations or a function/routing framework. Its current source is 02e54f023bdf3c8c2729353b110c22f5f8593957. The thin DecisionDefinition<TResult>.AsAIFunction<TState> convenience member belongs to the upper PR, not this foundation slice.

API Proposal

All additions are experimental (MEAI001). Experimental annotations are omitted from the selected signatures below for readability.

Provider contract and typed application API

namespace Microsoft.Extensions.AI;

public interface IDecisionClient : IDisposable
{
    Task<DecisionResponse> GetResponseAsync(
        DecisionRequest request,
        DecisionOptions? options = null,
        CancellationToken cancellationToken = default);

    object? GetService(Type serviceType, object? serviceKey = null);
}

public sealed class DecisionDefinition<TResult>
{
    public static DecisionDefinition<TResult> Create(
        Action<Builder> configure,
        JsonSerializerOptions? serializerOptions = null);

    public static DecisionDefinition<TResult> Create(
        JsonTypeInfo<TResult> resultTypeInfo,
        Action<Builder> configure);

    public IReadOnlyList<DecisionQuestion> Questions { get; }
    public JsonTypeInfo<TResult> ResultTypeInfo { get; }
    public JsonSerializerOptions SerializerOptions { get; }

    public sealed class Builder
    {
        public void Choice<
            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] TEnum>(
            Expression<Func<TResult, TEnum>> selector,
            string? instructions = null)
            where TEnum : struct, Enum;

        public void BinaryProbability(
            Expression<Func<TResult, double>> selector,
            string? instructions = null);

        public void Score(
            Expression<Func<TResult, double>> selector,
            IReadOnlyList<DecisionScoreLevel> levels,
            string? instructions = null);

        public void ExpectedScore(
            Expression<Func<TResult, double>> selector,
            IReadOnlyList<DecisionScoreLevel> levels,
            string? instructions = null);
    }
}

public sealed class DecisionResponse<TResult>
{
    public TResult Result { get; }
    public DecisionResponse Evidence { get; }

    public IReadOnlyDictionary<TEnum, double> GetDistribution<TEnum>(
        Expression<Func<TResult, TEnum>> selector)
        where TEnum : struct, Enum;
}

public static class DecisionClientExtensions
{
    public static TService? GetService<TService>(
        this IDecisionClient client,
        object? serviceKey = null);

    public static Task<DecisionResponse<TResult>> GetResponseAsync<TState, TResult>(
        this IDecisionClient client,
        TState state,
        DecisionDefinition<TResult> definition,
        DecisionOptions? options = null,
        CancellationToken cancellationToken = default);

    public static Task<DecisionResponse<TResult>> GetResponseAsync<TResult>(
        this IDecisionClient client,
        JsonElement state,
        DecisionDefinition<TResult> definition,
        DecisionOptions? options = null,
        CancellationToken cancellationToken = default);

    public static Task<DecisionResponse<TResult>> GetResponseAsync<TState, TResult>(
        this IDecisionClient client,
        TState state,
        JsonTypeInfo<TState> stateTypeInfo,
        DecisionDefinition<TResult> definition,
        DecisionOptions? options = null,
        CancellationToken cancellationToken = default);

    public static Task<DecisionResponse> GetResponseAsync<TState>(
        this IDecisionClient client,
        TState state,
        JsonTypeInfo<TState> stateTypeInfo,
        IEnumerable<DecisionQuestion> questions,
        DecisionOptions? options = null,
        CancellationToken cancellationToken = default);
}

Providers return the neutral response. Applications can use the typed overloads to materialize an ordinary result while keeping the original response in .Evidence. Materialization and distribution access do not make another inference call.

Choice declares an enum-backed domain. BinaryProbability maps a Binary observation's true probability to a double; it is not an ordinal Score. Score requires an explicit ordered rubric and represents only a provider-reported native scalar. ExpectedScore uses the unmodified complete observed distribution and may fall outside the ordinal bounds after probability rounding; it is not normalized or clamped. A definition can contain multiple questions of each supported kind.

Supporting request and observation signatures

The selected signatures below show the lower-level shape. The complete API additions and implementation also include constructors, precision/provenance, request options, failure types, explicit result bindings, and optional named feature projection.

namespace Microsoft.Extensions.AI;

public enum DecisionKind { Binary, Choice, Score }

public sealed class DecisionRequest
{
    public DecisionRequest(
        JsonElement state,
        IReadOnlyList<DecisionQuestion> questions);

    public JsonElement State { get; }
    public IReadOnlyList<DecisionQuestion> Questions { get; }

    public static DecisionRequest Create<TState>(
        TState state,
        JsonTypeInfo<TState> stateTypeInfo,
        IEnumerable<DecisionQuestion> questions);
}

public abstract class DecisionQuestion
{
    public string Id { get; }
    public DecisionKind Kind { get; }
    public string Instructions { get; }
}

public sealed class BinaryDecisionQuestion : DecisionQuestion
{
    public BinaryDecisionQuestion(
        string id,
        string? instructions = null,
        string? trueDescription = null,
        string? falseDescription = null);

    public string? TrueDescription { get; }
    public string? FalseDescription { get; }
}

public sealed class ChoiceDecisionQuestion : DecisionQuestion
{
    public ChoiceDecisionQuestion(
        string id,
        string? instructions,
        IReadOnlyList<DecisionCandidate> candidates);

    public IReadOnlyList<DecisionCandidate> Candidates { get; }
}

public sealed class DecisionCandidate
{
    public DecisionCandidate(string id, string description);
    public string Id { get; }
    public string Description { get; }
}

public sealed class ScoreDecisionQuestion : DecisionQuestion
{
    public ScoreDecisionQuestion(
        string id,
        string? instructions,
        IReadOnlyList<DecisionScoreLevel> levels);

    public IReadOnlyList<DecisionScoreLevel> Levels { get; }
}

public sealed class DecisionScoreLevel
{
    public DecisionScoreLevel(string id, string description);
    public string Id { get; }
    public string Description { get; }
}

public sealed class DecisionResponse
{
    public DecisionResponse(
        DecisionRequest request,
        IReadOnlyList<DecisionAnswer> answers,
        DecisionProvenance? provenance = null,
        UsageDetails? usage = null,
        object? rawRepresentation = null,
        IReadOnlyDictionary<string, object?>? additionalProperties = null);

    public DecisionRequest Request { get; }
    public IReadOnlyList<DecisionAnswer> Answers { get; }
    public DecisionProvenance? Provenance { get; }
    public UsageDetails? Usage { get; }
    public object? RawRepresentation { get; }
    public IReadOnlyDictionary<string, object?>? AdditionalProperties { get; }
    public DecisionAnswer GetAnswer(string questionId);
}

public abstract class DecisionAnswer
{
    public string QuestionId { get; }
    public DecisionKind Kind { get; }
    public DecisionPrecision Precision { get; }
    public object? RawRepresentation { get; }
    public IReadOnlyDictionary<string, object?>? AdditionalProperties { get; }
}

public sealed class BinaryDecisionAnswer : DecisionAnswer
{
    public double TrueProbability { get; }
}

public sealed class ChoiceDecisionAnswer : DecisionAnswer
{
    public string SelectedCandidateId { get; }
    public IReadOnlyList<DecisionProbability> Probabilities { get; }
}

public sealed class ScoreDecisionAnswer : DecisionAnswer
{
    public double? Score { get; }
    public double ExpectedScore { get; }
    public IReadOnlyList<DecisionProbability> Probabilities { get; }
}

public sealed class DecisionProbability
{
    public DecisionProbability(string id, double value);
    public string Id { get; }
    public double Value { get; }
}

API Usage

A retailer wants to categorize a support ticket and estimate whether the customer is requesting a refund. The host supplies an IDecisionClient client; no default backend or chat-to-decision conversion is inferred.

#pragma warning disable MEAI001

using Microsoft.Extensions.AI;

var definition = DecisionDefinition<TicketAnalysis>.Create(builder =>
{
    builder.Choice(result => result.Category);
    builder.BinaryProbability(result => result.RefundRequestProbability);
});

var ticket = new SupportTicket(
    "I was charged twice. Please refund the duplicate payment.");

var response = await client.GetResponseAsync(ticket, definition);

TicketAnalysis analysis = response.Result;
DecisionResponse evidence = response.Evidence;

The application owns these ordinary business types. Standard descriptions provide question instructions and separate candidate criteria; no custom attributes or property: target are required here.

using System.ComponentModel;

public sealed record SupportTicket(string Message);

public enum TicketCategory
{
    [Description("Payment, invoice, or charge concerns.")]
    Billing,

    [Description("Product defects, errors, outages, or troubleshooting.")]
    Technical,

    [Description("Sign-in, profile, or account-access concerns.")]
    Account,
}

public sealed record TicketAnalysis(
    [Description("Classify the customer's main concern.")]
    TicketCategory Category,

    [Description("Is the customer requesting a refund or payment reversal?")]
    double RefundRequestProbability);

When needed, the application can inspect the full typed category distribution separately:

var categoryDistribution = response.GetDistribution(value => value.Category);

There is no mandatory result mapper, handwritten question ID, enum dictionary, or feature schema in this flow. Fluent instructions can override attribute defaults. The result is an annotation, not an automatic refund authorization.

Applications that want observations without a business result can call the neutral client directly. Typed state/result metadata overloads support an explicit source-generated JSON boundary. Deployment examples and optional feature export remain in the source-pinned README.

Alternative Designs

  • Use existing structured chat output: appropriate when an application needs a label or typed object, but not a substitute for provider-reported distributions.
  • Make the provider client generic: rejected in favor of a neutral provider boundary with optional typed consumer extensions.
  • Infer all decision semantics from CLR types: explicit registrations distinguish probability from ordinal score and preserve the caller's rubric. Standard descriptions and enum conventions reduce ceremony without inventing those semantics.
  • Add tools, routing, ingestion, or a universal feature framework here: existing MEAI primitives and the separate Layer 2 proposal cover composition; optional named features do not require ML.NET or Arrow dependencies.

Current implementation evidence

The current stack source is foundation 02e54f023bdf3c8c2729353b110c22f5f8593957 plus upper e87f1126cf22108fb27f6391c7826fb91c25138e. The external native-provider proof is independently pinned to ce28e92b338b0edfbc22cca3c62101fa75c008f7.

Evidence Exact scope
Current combined-stack library build Analyzer-enabled build passed net10.0, net9.0, net8.0, net462, and netstandard2.0. The public API baseline was inspected/parsed. This is not a new unfiltered foundation-assembly run.
Fresh private dependency Microsoft.Extensions.AI.Abstractions/10.10.4-nativeinterop, built from exact upper source e87f1126cf22108fb27f6391c7826fb91c25138e, whose foundation ancestor is the lower source above. Full five-target Debug build: zero warnings/errors. Archive SHA256: 872468F5D0DB6E6D8980459F8C173DBEBBDDDD39425062505D7537D71A522E0F.
Native provider entrypoints TypeSafe/Jev, Ollaya, Jeeves, Ollama, OllamaSharp, Julia, Laya, and Qwen expose native upstream IDecisionClient entrypoints. Main constructors/loaders require no public generator plus adapter. Existing codecs/transports/stages and deliberate legacy compatibility remain. These implementations are external and not shipped by this PR.
Audited managed regression 2,223 unique passes, zero failures/skips: 1,371 core + 202 SDK + 622 retained chat + 28 evaluation. Includes 289 new native cases, of which 24 exercise native HTTP/stock SDK -> typed decision -> existing router composition. Repeated focused runs are not added to this total.
Fidelity and composition Complete correlated distributions, exact opaque domains, precision, native zero versus absence, unchanged observed expectation, actual CLR materialization fidelity, option isolation, errors/cancellation, supported kinds/budgets, borrowed/owned lifetimes, result-only tools, normal DI, and normal/streaming routing are covered by exact cases. Qwen remains Choice-only.
Package and consumer boundary Ordinary and JSON-reflection-disabled source-generated package-only helper fixtures loaded the actual new net10 DLL (4AFFD1ACF34DA6C24347988744F18DB54562AC3EB7A79C07FA2E895DFAC38434). All 24 restored asset graphs select the private package; 10 current Debug output copies match that DLL. All 12 exact file-app --help paths compiled and exited successfully; native/live hosts compiled only.
Trust and publication Original root require/trusted-signers policy and CI workflow remain unchanged. Fresh closure checked 99 signed external archives across 24 projects; an unsigned non-upstream archive was rejected with NU3004. Existing external lock versions/hashes were preserved. Provider proof publication used [skip ci]; no hosted run was triggered.

The immutable validation guide and requirement/command/quality map are in a private repository and require authorized access. They are reported external implementation evidence; the source and regression tests in this public stack are directly reviewable. No private source/receipts are published here and no visibility or public NuGet-release availability change is implied.

Execution boundary: the new provider proof is strictly managed-only. Local Julia/Laya/Qwen tests use bounded internal execution/tokenizer seams with actual orchestration/preparation/decode; they do not establish production tokenizer/model equivalence or successful native loading. The 188 native/FFI/ORT/loading core cases were retained but excluded from the positive managed selection, and the live project was not executed. They are not new skips or passes.

Historical evidence - earlier source/package revisions, not current executions
  • The foundation correction revision fe3bce1a1c9f386661f1fc0a49e9ebe4d7ea46f5 added rounded reported-score feasibility, existing MEAI missing-resolver fallback, materialized CLR-value checks independent of write-only JSON formatting, and self-validating correlation fixtures. These changes were preserved by the normal rebase to the current foundation source; no new foundation runtime change was made for the native-client migration.
  • At that earlier foundation revision, unfiltered assembly runs passed 1,690 tests with zero failures and one pre-existing skip on each of net10.0/net8.0. Temporarily removing the typed correlation guard caused all six corrected negatives to fail; the guard was restored before those historical green runs.
  • Earlier combined source 4aaae08abd86f21221fbcb2d715976cdd24d7b53, based on fe3bce1a1c9f386661f1fc0a49e9ebe4d7ea46f5, passed 1,703 affected-assembly cases with zero failures and one pre-existing skip per target. Its private 10.10.3-providerproof archive SHA256 is E5EDA04732E7A72FE0F9A6E34CB939A8E8D13A907498E7EBE85D4E17AAADBCBE; that archive and its receipts remain unchanged.
  • The historical 10.10.3 provider revision reported 2,122 unique passing tests, all 12 sample help paths, actual CPU Julia/Laya and Choice-only Qwen, and actual Tev calls through both Ollama adapters. Those model/live observations are tied to the earlier generator/bridge/source/package revision. They are not reruns or model validation of the new native-client entrypoints.
  • Its original source-pinned provider guide remains historical and requires authorized private-repository access.
  • Earlier 94be097/f32125f/832a3f8, the 2,112-test integration baseline, and trimmed-consumer results remain historical. ApiChief's internal breaking-check exception and NuGet vulnerability-endpoint TLS limitations remain limitations, not passed compatibility/security certifications.

Risks and review questions

  • Probability evidence is not a calibration guarantee or business policy. No implicit threshold, normalization, clamping, retry, fallback, joint distribution, or one-physical-network-call promise is introduced.
  • Exact question/domain/state correlation and complete ordered distributions are required. Invalid responses and unsuccessful CLR materialization fail explicitly.
  • The typed Choice convenience does not support enum aliases/flags or property-specific enum converters; lower-level explicit contracts remain available.
  • Provider adapters, source-generated JSON fixtures, and numerical feasibility checks do not establish accuracy, calibration, general provider parity, cross-platform execution, physical model-forward equivalence, or Native AOT certification.
  • CI is a separate follow-up: the last checked foundation Windows CI result is failing while Ubuntu passed. Current local/private proofs do not make this a CI-green or merge-ready claim. No CI change or rerun accompanies this body refresh.

Review should focus on the neutral provider/typed-consumer split, explicit Binary/Choice/Score registrations, ordinal rubric and nullable-native-score semantics, strict CLR/correlation boundaries, and whether the optional binding/feature surface belongs in the initial foundation.

Microsoft Reviewers: Open in CodeFlow

Copilot AI balanced review requested due to automatic review settings September 30, 2026 21:29
@luisquintanilla
luisquintanilla requested review from a team as code owners September 30, 2026 21:29
@github-actions github-actions Bot added the area-ai Microsoft.Extensions.AI libraries label Sep 30, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

JSON deserialization and validation of rounded probabilities need correction before approval.

Review effort: Balanced
Findings: 1 High severity · 4 Medium severity

Open (5)
What changed in this PR

This PR adds experimental, provider-neutral decision contracts to Microsoft.Extensions.AI.Abstractions without changing the existing chat-routing API.

Changes:

  • Adds binary, choice, and ordinal-score requests and responses, plus a non-generic decision client.
  • Adds explicit typed binding and versioned, named feature projection.
  • Registers JSON contracts, records the public API, and adds tests.
File Description
test/​Libraries/​Microsoft.Extensions.AI.Abstractions.Tests/​TestJsonSerializerContext.cs Registers decision types for test serialization.
test/​Libraries/​Microsoft.Extensions.AI.Abstractions.Tests/​Decisions/​DecisionTests.cs Tests binding, projection, cancellation, and snapshots.
src/​Shared/​DiagnosticIds/​DiagnosticIds.cs Adds the experimental diagnostic alias.
src/​Libraries/​Microsoft.Extensions.AI.Abstractions/​Utilities/​AIJsonUtilities.Defaults.cs Registers decision JSON contracts.
src/​Libraries/​Microsoft.Extensions.AI.Abstractions/​Microsoft.Extensions.AI.Abstractions.json Records the new public APIs.
src/​Libraries/​Microsoft.Extensions.AI.Abstractions/​Decisions/​README.md Describes the layer’s scope and ownership rules.
src/​Libraries/​Microsoft.Extensions.AI.Abstractions/​Decisions/​DecisionQuestions.cs Defines questions, candidates, and requests.
src/​Libraries/​Microsoft.Extensions.AI.Abstractions/​Decisions/​DecisionFeatures.cs Defines schemas and feature projection.
src/​Libraries/​Microsoft.Extensions.AI.Abstractions/​Decisions/​DecisionClient.cs Defines the client, options, and responses.
src/​Libraries/​Microsoft.Extensions.AI.Abstractions/​Decisions/​DecisionBinding.cs Defines enum mapping and typed binding.
src/​Libraries/​Microsoft.Extensions.AI.Abstractions/​Decisions/​DecisionAnswers.cs Defines probability and score answers.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/Libraries/Microsoft.Extensions.AI.Abstractions/Decisions/DecisionAnswers.cs Outdated
Comment thread src/Libraries/Microsoft.Extensions.AI.Abstractions/Decisions/DecisionAnswers.cs Outdated
Comment thread src/Libraries/Microsoft.Extensions.AI.Abstractions/Decisions/DecisionAnswers.cs Outdated
@dotnet-comment-bot

Copy link
Copy Markdown
Collaborator

‼️ Found issues ‼️

Project Coverage Type Expected Actual
Microsoft.Extensions.Diagnostics.Testing Line 99 98.65 🔻
Microsoft.Extensions.Telemetry Line 93 92.64 🔻
Microsoft.Extensions.AI.OpenAI Line 75 68.32 🔻
Microsoft.Extensions.AI.OpenAI Branch 75 57.59 🔻
Microsoft.Extensions.DataIngestion.MarkItDown Line 75 4.46 🔻
Microsoft.Extensions.DataIngestion.MarkItDown Branch 75 0 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring Line 99 96.03 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring Branch 99 92.76 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring.Kubernetes Line 99 97.73 🔻
Microsoft.Extensions.ServiceDiscovery.Dns Line 75 68.32 🔻
Microsoft.Extensions.ServiceDiscovery Line 75 67.51 🔻
Microsoft.Extensions.ServiceDiscovery Branch 75 71.43 🔻
Microsoft.Extensions.ServiceDiscovery.Abstractions Line 75 42.11 🔻
Microsoft.Extensions.ServiceDiscovery.Abstractions Branch 75 42.86 🔻
Microsoft.Extensions.ServiceDiscovery.Yarp Line 75 73.85 🔻
Microsoft.Extensions.ServiceDiscovery.Yarp Branch 75 70 🔻
Microsoft.Extensions.VectorData.Abstractions Line 75 37.39 🔻
Microsoft.Extensions.VectorData.Abstractions Branch 75 22.73 🔻

🎉 Good job! The coverage increased 🎉
Update MinCodeCoverage in the project files.

Project Expected Actual
Microsoft.Extensions.Http.Diagnostics 94 95
Microsoft.Gen.BuildMetadata 97 100
Microsoft.Gen.MetadataExtractor 57 73
Microsoft.Gen.MetricsReports 67 69
Microsoft.Extensions.AI.Abstractions 82 85
Microsoft.Extensions.AI.Evaluation.NLP 0 78
Microsoft.Extensions.Caching.Hybrid 82 85
Microsoft.Extensions.DataIngestion 75 89
Microsoft.Extensions.DataIngestion.Markdig 75 90
Microsoft.Extensions.Http.Resilience 97 100

Full code coverage report: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1618628&view=codecoverage-tab

@luisquintanilla
luisquintanilla added this pull request to stack #7797 September 30, 2026 23:09
@dotnet-comment-bot

Copy link
Copy Markdown
Collaborator

‼️ Found issues ‼️

Project Coverage Type Expected Actual
Microsoft.Extensions.Diagnostics.Testing Line 99 98.65 🔻
Microsoft.Extensions.Telemetry Line 93 92.64 🔻
Microsoft.Extensions.AI.OpenAI Line 75 68.32 🔻
Microsoft.Extensions.AI.OpenAI Branch 75 57.59 🔻
Microsoft.Extensions.DataIngestion.MarkItDown Line 75 4.46 🔻
Microsoft.Extensions.DataIngestion.MarkItDown Branch 75 0 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring Line 99 96.03 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring Branch 99 92.76 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring.Kubernetes Line 99 97.73 🔻
Microsoft.Extensions.ServiceDiscovery.Dns Line 75 69.93 🔻
Microsoft.Extensions.ServiceDiscovery.Abstractions Line 75 42.11 🔻
Microsoft.Extensions.ServiceDiscovery.Abstractions Branch 75 42.86 🔻
Microsoft.Extensions.ServiceDiscovery Line 75 68.88 🔻
Microsoft.Extensions.ServiceDiscovery Branch 75 71.43 🔻
Microsoft.Extensions.ServiceDiscovery.Yarp Line 75 73.85 🔻
Microsoft.Extensions.ServiceDiscovery.Yarp Branch 75 70 🔻
Microsoft.Extensions.VectorData.Abstractions Line 75 37.39 🔻
Microsoft.Extensions.VectorData.Abstractions Branch 75 22.73 🔻

🎉 Good job! The coverage increased 🎉
Update MinCodeCoverage in the project files.

Project Expected Actual
Microsoft.Extensions.Http.Diagnostics 94 95
Microsoft.Gen.BuildMetadata 97 100
Microsoft.Gen.MetadataExtractor 57 73
Microsoft.Gen.MetricsReports 67 69
Microsoft.Extensions.AI.Abstractions 82 86
Microsoft.Extensions.AI.Evaluation.NLP 0 78
Microsoft.Extensions.Caching.Hybrid 82 85
Microsoft.Extensions.DataIngestion 75 89
Microsoft.Extensions.DataIngestion.Markdig 75 90
Microsoft.Extensions.Http.Resilience 97 100

Full code coverage report: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1618858&view=codecoverage-tab

@dotnet-comment-bot

Copy link
Copy Markdown
Collaborator

‼️ Found issues ‼️

Project Coverage Type Expected Actual
Microsoft.Extensions.Diagnostics.Testing Line 99 98.65 🔻
Microsoft.Extensions.Telemetry Line 93 92.64 🔻
Microsoft.Extensions.AI.OpenAI Line 75 68.32 🔻
Microsoft.Extensions.AI.OpenAI Branch 75 57.59 🔻
Microsoft.Extensions.DataIngestion.MarkItDown Line 75 4.46 🔻
Microsoft.Extensions.DataIngestion.MarkItDown Branch 75 0 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring Line 99 96.03 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring Branch 99 92.76 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring.Kubernetes Line 99 97.73 🔻
Microsoft.Extensions.ServiceDiscovery.Dns Line 75 68.32 🔻
Microsoft.Extensions.ServiceDiscovery Line 75 67.21 🔻
Microsoft.Extensions.ServiceDiscovery Branch 75 71.43 🔻
Microsoft.Extensions.ServiceDiscovery.Abstractions Line 75 42.11 🔻
Microsoft.Extensions.ServiceDiscovery.Abstractions Branch 75 42.86 🔻
Microsoft.Extensions.ServiceDiscovery.Yarp Line 75 73.85 🔻
Microsoft.Extensions.ServiceDiscovery.Yarp Branch 75 70 🔻
Microsoft.Extensions.VectorData.Abstractions Line 75 37.39 🔻
Microsoft.Extensions.VectorData.Abstractions Branch 75 22.73 🔻

🎉 Good job! The coverage increased 🎉
Update MinCodeCoverage in the project files.

Project Expected Actual
Microsoft.Extensions.Http.Diagnostics 94 95
Microsoft.Gen.BuildMetadata 97 100
Microsoft.Gen.MetadataExtractor 57 73
Microsoft.Gen.MetricsReports 67 69
Microsoft.Extensions.AI.Abstractions 82 86
Microsoft.Extensions.AI.Evaluation.NLP 0 78
Microsoft.Extensions.Caching.Hybrid 82 85
Microsoft.Extensions.DataIngestion 75 89
Microsoft.Extensions.DataIngestion.Markdig 75 90
Microsoft.Extensions.Http.Resilience 97 100

Full code coverage report: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1619606&view=codecoverage-tab

@dotnet-comment-bot

Copy link
Copy Markdown
Collaborator

‼️ Found issues ‼️

Project Coverage Type Expected Actual
Microsoft.Extensions.Diagnostics.Testing Line 99 98.65 🔻
Microsoft.Extensions.Telemetry Line 93 92.64 🔻
Microsoft.Extensions.AI.OpenAI Line 75 68.32 🔻
Microsoft.Extensions.AI.OpenAI Branch 75 57.59 🔻
Microsoft.Extensions.DataIngestion.MarkItDown Line 75 4.46 🔻
Microsoft.Extensions.DataIngestion.MarkItDown Branch 75 0 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring Line 99 96.03 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring Branch 99 92.76 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring.Kubernetes Line 99 97.73 🔻
Microsoft.Extensions.ServiceDiscovery.Dns Line 75 69.93 🔻
Microsoft.Extensions.ServiceDiscovery.Abstractions Line 75 42.11 🔻
Microsoft.Extensions.ServiceDiscovery.Abstractions Branch 75 42.86 🔻
Microsoft.Extensions.ServiceDiscovery Line 75 68.26 🔻
Microsoft.Extensions.ServiceDiscovery Branch 75 71.43 🔻
Microsoft.Extensions.ServiceDiscovery.Yarp Line 75 73.85 🔻
Microsoft.Extensions.ServiceDiscovery.Yarp Branch 75 70 🔻
Microsoft.Extensions.VectorData.Abstractions Line 75 37.39 🔻
Microsoft.Extensions.VectorData.Abstractions Branch 75 22.73 🔻

🎉 Good job! The coverage increased 🎉
Update MinCodeCoverage in the project files.

Project Expected Actual
Microsoft.Extensions.Http.Diagnostics 94 95
Microsoft.Gen.BuildMetadata 97 100
Microsoft.Gen.MetadataExtractor 57 73
Microsoft.Gen.MetricsReports 67 69
Microsoft.Extensions.AI.Abstractions 82 86
Microsoft.Extensions.AI.Evaluation.NLP 0 78
Microsoft.Extensions.Caching.Hybrid 82 89
Microsoft.Extensions.DataIngestion 75 89
Microsoft.Extensions.DataIngestion.Markdig 75 90
Microsoft.Extensions.Http.Resilience 97 100

Full code coverage report: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1619765&view=codecoverage-tab

@dotnet-comment-bot

Copy link
Copy Markdown
Collaborator

‼️ Found issues ‼️

Project Coverage Type Expected Actual
Microsoft.Extensions.Diagnostics.Testing Line 99 98.65 🔻
Microsoft.Extensions.Telemetry Line 93 92.64 🔻
Microsoft.Extensions.AI.OpenAI Line 75 68.32 🔻
Microsoft.Extensions.AI.OpenAI Branch 75 57.59 🔻
Microsoft.Extensions.DataIngestion.MarkItDown Line 75 4.46 🔻
Microsoft.Extensions.DataIngestion.MarkItDown Branch 75 0 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring Line 99 96.03 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring Branch 99 92.76 🔻
Microsoft.Extensions.Diagnostics.ResourceMonitoring.Kubernetes Line 99 97.73 🔻
Microsoft.Extensions.ServiceDiscovery.Dns Line 75 68.32 🔻
Microsoft.Extensions.ServiceDiscovery.Abstractions Line 75 42.11 🔻
Microsoft.Extensions.ServiceDiscovery.Abstractions Branch 75 42.86 🔻
Microsoft.Extensions.ServiceDiscovery Line 75 67.96 🔻
Microsoft.Extensions.ServiceDiscovery Branch 75 71.43 🔻
Microsoft.Extensions.ServiceDiscovery.Yarp Line 75 73.85 🔻
Microsoft.Extensions.ServiceDiscovery.Yarp Branch 75 70 🔻
Microsoft.Extensions.VectorData.Abstractions Line 75 37.39 🔻
Microsoft.Extensions.VectorData.Abstractions Branch 75 22.73 🔻

🎉 Good job! The coverage increased 🎉
Update MinCodeCoverage in the project files.

Project Expected Actual
Microsoft.Extensions.Http.Diagnostics 94 95
Microsoft.Gen.BuildMetadata 97 100
Microsoft.Gen.MetadataExtractor 57 73
Microsoft.Gen.MetricsReports 67 69
Microsoft.Extensions.AI.Abstractions 82 86
Microsoft.Extensions.AI.Evaluation.NLP 0 78
Microsoft.Extensions.Caching.Hybrid 82 85
Microsoft.Extensions.DataIngestion 75 89
Microsoft.Extensions.DataIngestion.Markdig 75 90
Microsoft.Extensions.Http.Resilience 97 100

Full code coverage report: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1620045&view=codecoverage-tab

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread src/Libraries/Microsoft.Extensions.AI.Abstractions/Decisions/DecisionAnswers.cs Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b735e048-cd3e-4bfb-ad05-3f68ad46082e
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b735e048-cd3e-4bfb-ad05-3f68ad46082e
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b735e048-cd3e-4bfb-ad05-3f68ad46082e
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b735e048-cd3e-4bfb-ad05-3f68ad46082e
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b735e048-cd3e-4bfb-ad05-3f68ad46082e
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b735e048-cd3e-4bfb-ad05-3f68ad46082e
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b735e048-cd3e-4bfb-ad05-3f68ad46082e
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b735e048-cd3e-4bfb-ad05-3f68ad46082e
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: eb4b11ad-53ed-4f67-8760-60c0e53c4083
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: eb4b11ad-53ed-4f67-8760-60c0e53c4083
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: eb4b11ad-53ed-4f67-8760-60c0e53c4083
@KSemenenko

Copy link
Copy Markdown

can[t wait to see it and use wiht MS Dessign model

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-ai Microsoft.Extensions.AI libraries

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants