Галоўная / Артыкулы

Інжыніерыя запытак і структураваны выхад у .NET: OpenAI, Azure, Anthropic, Gemini

OpenAI, Azure OpenAI, Anthropic або Gemini для .NET: праві на выкарыстоўванне, SDK-ы, цены, структураваны выхід за дапамою JSON Schema, інжыніерыя запросаў і просты IChatClient.

Выдавец: REACTAPP.TOP11 хв чытання2544 слоў

Крыніцы: OpenAI vs Azure OpenAI vs Anthropic vs Gemini for .NET: Provider Comparison Guide

Бот для падчырбы, які выклікае GPT-4o адразу з кантролера ASP.NET Core, можа дапамогчы ў отрыманні дэмаверзіі. Пасля таго корпаратыўны кліент прасіць пра рэзідэнцію дадзэнняў у пэўнай рэгіёнальнасці, а аддзел безпекі жадае клёда для обработкі дугіх дакументаў, тады як фінансавы аддзел хочаць ведаць, чаму кожна запітанне коштае у дзесяць разоў больш, чым прагнозавалася. Кожны з гэтых запітоў прыводзіць вас да іншага прадаўца або да абстракцыі, якая дазволяе іх заменіць.

OpenAI, Azure OpenAI, Anthropic і Gemini всі продаюць адно і тое ж базавае рашэнні: кераваны чат, выклік інструментаў і эмбедынг без неабходнасці размешчання GPU. Яны разніцяцца у пакаванні, рэгіёнах, стандартах саастосовання, якасці SDK і спосабе выкладкі. Для .NET-сервіса, які будзе працаваць гады, гэтыя разніцы маюць большое значэнне, чым тое, які мадэль быў лідэрам на табліцы рэйтынгу ў празыдзеўшы тыдзень.

Калькі прадаўцы падходзяць для калькіх задач

  • Платформа OpenAI: найшырэшы шлях даўжынейшых модэляў. Падходзіць для продуктов, якія вялікай меры прыменшаны да дадзеных меж OpenAI.
  • Azure OpenAI: калі работа павінна выконваліцца ў межах тэнанта Azure з адпаведнымі корпаратыўнымі атрыбутамі, сеткавымі наладамі і рэгіональнымі кантролемі.
  • Anthropic: супэрная працэздатнасць у далёкіх кантэкстах і адказнае выконанне інструкцый. Падходзіць для агентаў, якія работаюць з велікім колікствам дакументаў.
  • Gemini: рашэнні, сумелівыя да Google Cloud, мультымадальныя можлівасці, а таксама продукты, якія знаходзяцца ў блізкай бялозоры з Workspace.

Не выбірайце кілька прадаўцоў без прычыны. Калі ёсць адна команда, адны рэгіон і няма патрэбы ў супакоўванні, адзін прадаўца значна спрасцавае працу. Кожная абстракцыя караеся додатковымі затратамі.

Развіцце SDK і пакеты, якія трэба інсталаваць

Тут вы ацэнівайце офіцыйныя бібліятэкі кліента, стандартныя асінхронныя патэрны і тое, як часта з’являюцца змяны, якія нарабляюць проблемы. SDK, які супершчыць прынцыпы жыццўнага цыклу HttpClient і методу вводу залежнасцяў, коштаў вас будзе больш, чым рахунак за токены. Можна спакуяцца на пакеты ад самой компаніі або добра падтрымваныя пакеты спяльнай спільнаты, але пераканайцеся ў актуальных версіях NuGet і способах аўтэнтыфікацыі (API key проты Entra ID) пры прымененні будзь-каго стандарту.

// Official OpenAI SDK
dotnet add package OpenAI

// Azure AI Foundry (Azure OpenAI)
dotnet add package Azure.AI.OpenAI

// Anthropic Claude (official, beta as of 2026)
dotnet add package Anthropic

// Gemini via Google Cloud Vertex AI (IChatClient-compatible, January 2026)
dotnet add package Google.Cloud.VertexAI.Extensions --prerelease

// Abstraction layer (ships with all provider adapters)
dotnet add package Microsoft.Extensions.AI

Microsoft.Extensions.AI — гэта элемент, які ўсе ўз’еднанае: кожны SDK аб’являе IChatClient, таму рэшта прыкладнення можа залішыцца нейтральным ўжыццю падаўчыка.

Механізмы цэнавання і маршрутаванне модэляў

Кожны падаўчык берае плату за токены, але дэталі вплывают на абшчую суму: токены для вхідных і выходных дадзеных маюць разныя цены, токены з кэшу ёсць дышэўшыя, інструменты можу маць вышэйшыя тарыфы, а дзеякія пакеты маюць мінімальныя вімаганні. Дзякуючы дужа дзялёваму кантэксту і агентам, якія актыўна вікорыстоўваюць інструменты, сума рахунку шыбка зрастае. Azure выкладзе рахунок па прынцыпу сваёй сістэмы метражавання, тады калі іншыя трое — па рахунку падаўчыка.

Фінансавыя віддзелы ствараюць модэль эканамікі аб’ектаў, таму ваша архітэктура павінна выдаваць цыфры вікорыстоўвання, якімі яны можаць даверыць. Кожны вызов для завершэння задачы павінен праходзіць праз метры, якія фіксуюць модэль, токены і пазнакі функцый. Бюджэты павінны быць у кодзе і ў апавешчэннях пра білінг у воблаку. Маршрутаванне за складнасцю задачы — гэта найдышэўшы варыянт.

// Partial example — model routing based on task complexity
public class ModelRouter
{
    // Route cheap, simple tasks to the nano model
    // Route complex multi-step reasoning to the full model
    public string SelectModel(TaskComplexity complexity) => complexity switch
    {
        TaskComplexity.Classification  => "gpt-5.4-nano",   // ~20x cheaper than full
        TaskComplexity.Conversational  => "gpt-5.4-mini",   // ~5x cheaper
        TaskComplexity.Reasoning       => "gpt-5.4",         // full capability
        _                              => "gpt-5.4-mini"
    };
}

Падчырэнне з адпрацоўкай: ідэнтыфікацыя, сетка і месца розмешчэння

Анкеты з пытанням пра безпеку згубляюць праекты, якія оптымізаваны толькі для зменшэння часу адпаведзення пад час дэманстрацыі. Пытанні стосуюцца ідэнтыфікацыі, ізоляціі сеткі, зберагчэння дадзэнняў і наявнасці ў паветраных прасторах.

Azure OpenAI спадчынае сістэму Azure RBAC, прыемлівае прыемы Private Link і дозволяе выбір паветранага прастора. OpenAI і Anthropic прыменяюць механізмы кантролю над арганізацыяй і варыянты з нулявым зберагчэнням дадзэнняў, пры чым існуюць умовы, якія трэба прачытаць. Gemini следуе мадэлям Google Cloud IAM і VPC.

Па канцэпцыі аўтэнтыфікацыі ў ASP.NET Core для Azure OpenAI рэкамендуецца вікорыстоўваць кераваную ідэнтыфікацыю. Для прадаўцоў API-клучоў секрэты трэба завантажваць з Key Vault пад час запуску і зміняць іх без паўторнага развяртання. Ніколі не прыяўляйце клучы прадаўцоў да JWT-токеноў корыстувачаў.

Правовы адзінак павінен пакрыць можлівасць адмовы ад вікорыстоўвання дадзэнняў для навчання, партнероў-перапрацоўвальнікаў і тэксты дагавораў DPA для кожнага прадаўца, які ўвядзецеся, а не толькі для галоўнага. Кальколька прадаўцоў значыць кальколькі дагавораў.

Структураваны выхід з JSON Schema

Падтрымка JSON Schema і обмежаная дэкадаванне разлічаецца ў розных прадаўцах. Лепш выбіраць прадаўцоў, якія можаць прыменяць схему да аргументаў і адпаведзей інструментаў, якімы ўжо давераюць вашы дэсерыялізаторы на C#, і адзінакова прыбегаць да праверкі і прабаў занова там, дзе прымененне схемы ёсць слабкім. З Azure OpenAI вы можэце зробіць схему строгай:

// Full example — Azure OpenAI structured output with strict schema enforcement
using Azure.AI.OpenAI;
using OpenAI.Chat;
using System.ComponentModel;
using System.Text.Json;

// Define the schema type — only JSON Schema primitives are supported
public class SupportTicketAnalysis
{
    public string Category { get; set; } = string.Empty;        // e.g. "billing", "technical"
    public string Priority { get; set; } = string.Empty;        // "low", "medium", "high", "critical"

    [Description("One to two sentence summary of the issue")]
    public string Summary { get; set; } = string.Empty;

    public string[] RequiredTeams { get; set; } = [];           // which teams must be looped in

    [Description("Estimated resolution time as a human-readable string, e.g. '2 business days'")]
    public string EstimatedResolution { get; set; } = string.Empty;
}

// Build the client — structured outputs require API version 2024-08-01-preview or later
var azureClient = new AzureOpenAIClient(
    new Uri(Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")!),
    new AzureKeyCredential(Environment.GetEnvironmentVariable("AZURE_OPENAI_KEY")!),
    new AzureOpenAIClientOptions(AzureOpenAIClientOptions.ServiceVersion.V2024_08_01_Preview));

ChatClient chatClient = azureClient.GetChatClient("gpt-5.4-mini-deployment");

// Configure the request to enforce the schema strictly
var options = new ChatCompletionOptions
{
    ResponseFormat = ChatResponseFormat.CreateJsonSchemaFormat<SupportTicketAnalysis>(
        "support_ticket_analysis",  // snake_case — spaces and hyphens cause 400 errors
        strict: true)               // without this, schema compliance is best-effort only
};

List<ChatMessage> messages =
[
    new SystemChatMessage("You are a support ticket classifier. Analyze the ticket and return a structured assessment."),
    new UserChatMessage("User reports: 'My invoice shows $999 but the contract says $299. Need this fixed immediately.'")
];

// If structured outputs fail with a 400, the schema has unsupported types — check for DateTime, Uri, TimeSpan
ClientResult<ChatCompletion> result = await chatClient.CompleteChatAsync(messages, options);

// JsonSerializer.Deserialize will always succeed if the API call succeeded
SupportTicketAnalysis analysis = JsonSerializer.Deserialize<SupportTicketAnalysis>(
    result.Value.Content.Text)!;

Console.WriteLine(quot;Category: {analysis.Category}");
Console.WriteLine(quot;Priority: {analysis.Priority}");
Console.WriteLine(quot;Summary: {analysis.Summary}");

Два аспекта ў тым прыкладзе ствараюць большасць бягаў 400: назвы схемы павінны быць у фармаце snake_case, а такі тыпы, як DateTime, Uri чы TimeSpan, не ўзлегкія элементы JSON Schema. Без параметра strict: true салідарнасць з правіламі адбываецца толькі па можлівасці.

Выклікі інструментаў, эмбедынгі і RAG

Усе чатыры падтрымліваюць выклікі інструментаў чы функцый, пры чым кожны з іх выкарыстоўвае разны фармат дадзеных. На рубежы неабходна стандартызаваць іх у внутршній DTO ToolCall, ўбліжча да коду оркестрацыі, каб не было разніцы залежна ад прадавця.

Выбір прадавца чата не значыць выбору яго эмбедынгаў. У настройках неабходна зафіксаваць мадэль і размер эмбедынга, і не зміняць іх таямна пад час змены прадавця чата. Неабходна актыўна кэшаваць эмбедынгі і дэтэрміністычныя рэзультаты дзеяння інструментаў, але не кэшаваць неапранутыя рэзультаты чата, якія маюць персональныя даны корыстніка, калі толькі політыка зберагання іх не паважаецца.

Простая абстракцыя .NET з IChatClient

З’явіце маленькій інтэрфейс прадаўця з методамі стрымінгу і без стрымінгу, прыявяце кожны SDK за дапамогою адаптара і вводзіце яго праз DI. Закладзіце запіты і інструменты за межамі адаптараў. Адмовіцеся ад „божасных“ фрэймворкаў, якія маскуюць працэсы перапрыявлення пакетаў і таймауты, якія патрэбна налаштаваць. За дапамогою IChatClient рэгістрацыя чытае прадаўця з конфігурацыі і загортае усё ў OpenTelemetry:

// Partial example — Program.cs provider registration with IChatClient
using Microsoft.Extensions.AI;
using Azure.AI.OpenAI;
using OpenAI;
using Anthropic;
using Google.Cloud.VertexAI.Extensions;

var builder = WebApplication.CreateBuilder(args);
var config = builder.Configuration;

// Read which provider to use from configuration — no code change to switch
string provider = config["AI:Provider"]!; // "azure", "openai", "anthropic", "gemini"

builder.Services.AddSingleton<IChatClient>(sp =>
{
    // Return the appropriate IChatClient implementation based on config
    return provider switch
    {
        "azure" => new AzureOpenAIClient(
                        new Uri(config["AI:Azure:Endpoint"]!),
                        new Azure.AzureKeyCredential(config["AI:Azure:Key"]!))
                    .GetChatClient(config["AI:Azure:Deployment"]!)
                    .AsIChatClient(), // extension method from Azure.AI.OpenAI

        "openai" => new OpenAIClient(config["AI:OpenAI:Key"]!)
                    .GetChatClient(config["AI:OpenAI:Model"]!)
                    .AsIChatClient(),

        "anthropic" => new AnthropicClient(config["AI:Anthropic:Key"]!)
                    .AsIChatClient(), // Anthropic SDK v10+ implements IChatClient

        "gemini" => new VertexAIChatClient(
                        projectId: config["AI:Gemini:ProjectId"]!,
                        location: config["AI:Gemini:Location"]!,
                        modelId: config["AI:Gemini:Model"]!),

        _ => throw new InvalidOperationException(quot;Unknown AI provider: {provider}")
    };
});

// Add OpenTelemetry instrumentation via pipeline decorator — applies to all providers
builder.Services.AddSingleton(sp =>
{
    var inner = sp.GetRequiredService<IChatClient>();
    return new ChatClientBuilder(inner)
        .UseOpenTelemetry(loggerFactory: sp.GetRequiredService<ILoggerFactory>(),
                          sourceName: "YourApp.AI")
        .Build();
});

Флагі функцыяў должны выбіраць прадаўца па кожнаму тэнанту або па кожнай навыку. Адна статычная кліентская частка, закодаваная ў Program.cs, ўсёліквае асаблівасці рэзідэнціі ў інцыдэнты.

Для стрымінгу таксама неабходны явныя умовы ў абстракцыі: токены анулювання, механізмы контролю навантажэння і спосабы, якім частковыя запыты інструментаў доходзяць да апылальнікаў. Прадаўцы значна разніцяцца ў гэтым аспекце, таму «проста чакаць на рэзультат» прыводзіць да прасачання семантыкі прадаўцы ў вашыя кантролеры.

Функцыональны прыклад концэпцыі

Весь гэты прынцып падходзіць для невялікага Web API. Запусціце праект і дадаце неабходныя пакеты:

dotnet new webapi -n AiProviderPoc --no-openapi
cd AiProviderPoc

dotnet add package Microsoft.Extensions.AI
dotnet add package OpenAI
dotnet add package Azure.AI.OpenAI
dotnet add package Anthropic
dotnet add package Google.Cloud.VertexAI.Extensions --prerelease

Умовы запіту адаптуюцца для кожнага прадаўца. Тып выходных дадзеных падтрымлівае толькі прымітывы JSON Schema, а апісанні служыць кераваннем для модэлі:

// PromptContracts.cs — shared across all providers
using System.ComponentModel;

namespace AiProviderPoc;

// The input to every analysis request
public record AnalysisRequest(string TicketText, string? Context = null);

// The structured output — must use only JSON Schema primitives (string, int, bool, arrays)
public class TicketAnalysis
{
    [Description("Category of issue: 'billing', 'technical', 'account', 'feature-request'")]
    public string Category { get; set; } = string.Empty;

    [Description("Severity: 'low', 'medium', 'high', 'critical'")]
    public string Severity { get; set; } = string.Empty;

    [Description("One to two sentence summary of the customer's issue")]
    public string Summary { get; set; } = string.Empty;

    [Description("Suggested action for the support agent, one sentence")]
    public string SuggestedAction { get; set; } = string.Empty;

    public bool RequiresEscalation { get; set; }

    [Description("Estimated time to resolve as human-readable string, e.g. '30 minutes' or '2 business days'")]
    public string EstimatedResolution { get; set; } = string.Empty;
}

Сэрвіс выкорыстоўвае сістэмны прампт як стабільны, версіяваны контракт і завісіць толькі ад IChatClient. Ён працуе у рэжыме JSON, нейтральным да прадаўцоў; для строгага адпаведнага выканання схемы на Azure або OpenAI трэба выкорыстаць спосаб прымытку SDK, паказаны раней.

// TicketAnalysisService.cs
using Microsoft.Extensions.AI;
using System.Text.Json;

namespace AiProviderPoc;

public class TicketAnalysisService(IChatClient chatClient)
{
    // The system prompt is the stable contract — versioned and centralized here
    private const string SystemPrompt =
        """
        You are a support ticket classifier for an enterprise software product.
        Analyze the provided support ticket and return a structured assessment.
        Be concise and accurate. Do not invent information not present in the ticket.
        """;

    public async Task<TicketAnalysis> AnalyzeAsync(AnalysisRequest request, CancellationToken ct = default)
    {
        // Build the message list — system prompt is fixed, user content is the ticket
        var messages = new List<ChatMessage>
        {
            new(ChatRole.System, SystemPrompt),
            new(ChatRole.User, request.TicketText)
        };

        // Use JSON mode via ChatOptions — provider-agnostic structured output
        // For strict schema enforcement with Azure/OpenAI, use the SDK-direct approach instead
        var options = new ChatOptions
        {
            ResponseFormat = ChatResponseFormat.Json
        };

        ChatResponse response = await chatClient.GetResponseAsync(messages, options, ct);

        // Deserialize — IChatClient normalizes the response shape across all providers
        return JsonSerializer.Deserialize<TicketAnalysis>(response.Text,
            new JsonSerializerOptions { PropertyNameCaseInsensitive = true })
            ?? throw new InvalidOperationException("Model returned unparseable JSON");
    }
}

Файл Program.cs рэгіструе аднаго кліента на кожны філія прадаўцы і адкрывае адзін канцэнтраба, які ніколі не ведае, калькі прадаўцы адпаведзеў:

using AiProviderPoc.Api;
using Anthropic;
using Azure.AI.OpenAI;
using Google.GenAI;
using Microsoft.Extensions.AI;
using OpenAI;
using System.ClientModel;          // ApiKeyCredential

var builder = WebApplication.CreateBuilder(args);
var config = builder.Configuration;

// Read provider selection from config — change "AI:Provider" to switch providers
string provider = config["AI:Provider"]
    ?? throw new InvalidOperationException("AI:Provider must be set in appsettings");

// Register IChatClient — each branch returns a different SDK's implementation
builder.Services.AddSingleton<IChatClient>(_ =>
{
    return provider.ToLowerInvariant() switch
    {
        "azure" =>
            // Azure AI Foundry: needs endpoint + key + deployment name
            new AzureOpenAIClient(
                new Uri(config["AI:Azure:Endpoint"]!),
                new ApiKeyCredential(config["AI:Azure:Key"]!))
            .GetChatClient(config["AI:Azure:Deployment"]!)
            .AsIChatClient(),

        "openai" =>
            // OpenAI direct: needs API key + model name
            new OpenAIClient(config["AI:OpenAI:Key"]!)
            .GetChatClient(config["AI:OpenAI:Model"]!)
            .AsIChatClient(),

        "anthropic" =>
            // AnthropicClient expects a ClientOptions instance (not a string API key).
            // Create a ClientOptions and pass it to the constructor.
            new AnthropicClient(
                new Anthropic.Core.ClientOptions
                {
                    ApiKey = config["AI:Anthropic:Key"]!
                })
            .AsIChatClient(),

        "gemini" =>
            // Google.GenAI: named params on Client constructor, no ClientConfig class needed.
            // Uses GOOGLE_APPLICATION_CREDENTIALS / ADC for auth; no API key required for Vertex AI.
            new Client(
                project: config["AI:Gemini:ProjectId"]!,
                location: config["AI:Gemini:Location"]!,
                vertexAI: true)
            .AsIChatClient(config["AI:Gemini:Model"]!),

        _ => throw new InvalidOperationException(quot;Unknown provider: '{provider}'. Valid: azure, openai, anthropic, gemini")
    };
});

// Register the service — depends only on IChatClient
builder.Services.AddScoped<TicketAnalysisService>();

var app = builder.Build();

// Single endpoint — provider is invisible here
app.MapPost("/analyze", async (AnalysisRequest request, TicketAnalysisService service, CancellationToken ct) =>
{
    var analysis = await service.AnalyzeAsync(request, ct);
    return Results.Ok(analysis);
});

app.Run();

Змена прадаўца адбываецца праз зміну налаштоўкаў у файле appsettings.json:

{
  "AI": {
    "Provider": "azure",
    "Azure": {
      "Endpoint": "https://your-resource.openai.azure.com/",
      "Key": "your-azure-key",
      "Deployment": "gpt-5.4-mini-deployment"
    },
    "OpenAI": {
      "Key": "sk-...",
      "Model": "gpt-4o-mini"
    },
    "Anthropic": {
      "Key": "sk-ant-..."
    },
    "Gemini": {
      "ProjectId": "your-gcp-project",
      "Location": "us-central1",
      "Model": "gemini-2.0-flash"
    }
  }
}

Запусцыце яго і адправіце заявку:

dotnet run

curl -X POST http://localhost:5000/analyze \
  -H "Content-Type: application/json" \
  -d '{"ticketText": "My subscription renews tomorrow but I was charged twice this month. Account #A-1234."}'

Адказ прыходзіць у тым жа фармаце, незалежна ад таго, які прадаўцы настроены:

{
  "category": "billing",
  "severity": "high",
  "summary": "Customer was charged twice for their subscription and is seeking a refund before their next renewal date.",
  "suggestedAction": "Review billing history for account A-1234 and initiate a refund for the duplicate charge.",
  "requiresEscalation": false,
  "estimatedResolution": "1 business day"
}

Інжынірынг запросаў, ацэнкі і справядлівыя парады

Калі вы пораўнюеце якасць, зафіксаваце параметры запросаў і тэмпературы, а зменяйце толькі прадаўця і мадэль. Інакш вы пораўнюеце не самых прадаўцоў, а удачу ў інжынірынгу запросаў. Зберагаўце версіі шаблонаў запросаў і тэставаць іх у фармаце A/B незалежна ад адаптара прадаўця, інакш кожная зміна модэлі знецініць вашы експерыменты з запросамі.

Выпускайце даныя OpenTelemetry аб вызовах прадаўцяў, пры чым як атрыбуты вказывайце колькісць прадаўцоў, модэляў, токенаў і прычыну завершэння. Спаруйце гэтыя онлайн-метрыкі з нэўключанымі набрамі для ацэнкі, каб пераход на дышэўшую мадэль быў рашэннем, падтрыманым доказамі, а не лячэннем.

Бюджэты на затрымкі таксама разныя. Дзеякія прадаўцы шыркаюць першы токен быстрэй; іншыя пераважаюць у довгіх задачах. Перад тым, як выбраць стандарт, замерыце як час досягнення першага токена, так і час ад початку да канца для вашай працы.

Адкаліканне аднойчы больш чым аднаго прадаўца ў працэсе

  • Canary: у кожнай асяроддзя трэба зберагаць адзін «золаты» прыказ, які параграфуе правільна структуру JSON і паказвае паказнік затрымкі, а таксі збыткавыя запускі, якія гэтыя правіла нарабляюць, трэба блакануць для галоўнага прадаўца.
  • Фільтры кантэнту: фільтры кантэнту Azure і іншыя механізмы безпекі вяртаюць разныя фарматы памылак. Іх трэба адразу прыясніць з асоблівасцямі вашага домэна.
  • Перэкрыцча: трэба выбраць, якія памылкі можна праказаць знову на дапаможным прадаўцы, а якія трэба блакануць без праказаў, напрыклад, памылкі автарызаціі і адмовы па правілах. Абычнае перэкрыцча можа нарабіць проблемы з адпаведнасцю да умов розмешчэння дадзеных.
  • Адпаведныя спецыялісты: трэба навучыць працавальніків пра панелі калькуляцый кожнага актываўанага прадаўца. Калі інструкцыі паказваюць точную назву портала, лёгкая адчутнае зростанне навантажэння о 2 гадзіны ночы лёгкая стомканаць.
  • Анулюванне налаштаванняў: трэба выключыць клучы, адмяніць рэгістрацыі дапрыемоў, адманіць наборы дадзеных для тэставання, якія маюць тэкст кліяў, і архіваваць справаздачы пра вітраты.

Короткі крэты для прыемкі рашэння

Патрэбна рэзідэнцыя? Пачніце з Azure OpenAI. Дугі дакументы? Выберыце Benchmark Anthropic. Яшчэ на GCP? Ацэніце Gemini. Патрэбны найновейшыя мадэлі OpenAI як толькі яны выйдуць? Ожывайце платформу OpenAI. Патрэбны два з вышэзгаданых? Спачатку створыце просты адаптар і сістэму зважэння выкарыстання.

Выбор прадаўца — гэта рашэнне ў сфэрэ корпоратыўскай архітэктуры, якое паўтараецца ў аспектах SDK і віткоў. Пораўняйце прадаўцоў па рэзідэнцыі, ідэнтыфікацыі, прозрачнасці цэнаў, структураваным выходам і адпаведнасці для эксплуатацыі.