Microsoft Agent Framework İş Akışları Düzenlemeleri - Magentic

Magentic orchestration, AutoGen tarafından icat edilen Magentic-One sistemine göre tasarlanmıştır. Dinamik işbirliği gerektiren karmaşık, açık uçlu görevler için tasarlanmış esnek, genel amaçlı çok aracılı bir desendir. Bu düzende, ayrılmış bir Magentic yöneticisi özelleştirilmiş aracılardan oluşan bir ekibi koordine eder ve gelişen bağlam, görev ilerleme durumu ve aracı özelliklerine göre hangi aracının bir sonraki adıma geçileceğini seçer.

Magentic yöneticisi paylaşılan bir bağlam tutar, ilerleme durumunu izler ve iş akışını gerçek zamanlı olarak uyarlar. Bu, sistemin karmaşık sorunları ayırmasını, alt görevleri devretmesini ve aracı işbirliği aracılığıyla çözümleri yinelemeli olarak geliştirmesini sağlar. Düzenleme özellikle çözüm yolunun önceden bilinmediği ve birden çok mantık, araştırma ve hesaplama turu gerektirebileceği senaryolar için uygundur.

Manyetik Orkestrasyon

Tip

Magentic orchestration, aracı işbirliğini koordine etmek için planlamayı kullanan çok güçlü bir yönetici ile Grup Sohbeti düzenleme düzeniyle aynı mimariye sahiptir. Senaryonuz karmaşık planlama olmadan daha basit bir koordinasyon gerektiriyorsa bunun yerine Grup Sohbeti düzenini kullanmayı göz önünde bulundurun.

Uyarı

Magentic-One makalesinde, çok özel bir görev kümesini çözmek için 4 yüksek oranda özelleştirilmiş aracı tasarlanmıştır. Agent Framework'teki Magentic düzenlemesinde, kendi özel aracılarınızı kendi uygulama gereksinimlerinize uyacak şekilde tanımlayabilirsiniz. Ancak, Magentic düzenlemesinin özgün Magentic-One tasarımı dışında ne kadar iyi performans göstereceği test edilmemiştir.

Öğrenecekler

  • Birden çok özel aracıyı koordine etmek için bir Magentic yöneticisini ayarlamak
  • Akış olayları WorkflowEvent ile nasıl işlenir?
  • İnsan etkileşimli plan incelemesini uygulama
  • Karmaşık görevlerde ajanların işbirliği ve gelişimini izleme

Özel Aracılarınızı Tanımlayın

Magentic orchestration'da, yöneticinin görev gereksinimlerine göre dinamik olarak seçebileceği özelleştirilmiş aracılar tanımlarsınız:

#pragma warning disable MAAIW001  // Magentic types are experimental
#pragma warning disable OPENAI001 // HostedCodeInterpreterTool is experimental

using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Workflows;
using Microsoft.Agents.AI.Workflows.Specialized.Magentic;
using Microsoft.Extensions.AI;

string endpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")
    ?? throw new InvalidOperationException("FOUNDRY_PROJECT_ENDPOINT is not set.");
string deploymentName = Environment.GetEnvironmentVariable("FOUNDRY_MODEL") ?? "gpt-5.4-mini";

AIProjectClient projectClient = new(new Uri(endpoint), new DefaultAzureCredential());

AIAgent researcherAgent = projectClient.AsAIAgent(
    deploymentName,
    name: "ResearcherAgent",
    description: "Specialist in research and information gathering.",
    instructions: "You are a researcher. Find relevant information without doing additional computation or quantitative analysis.");

AIAgent coderAgent = projectClient.AsAIAgent(
    deploymentName,
    name: "CoderAgent",
    description: "A helpful assistant that writes and executes code to analyze data.",
    instructions: "You solve quantitative questions by writing and running code. Show the analysis and the computation process clearly.",
    tools: [new HostedCodeInterpreterTool()]);

AIAgent managerAgent = projectClient.AsAIAgent(
    deploymentName,
    name: "MagenticManager",
    description: "Orchestrator that coordinates the research and coding workflow.",
    instructions: "You coordinate the team to complete complex tasks efficiently.");
import os

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential

client = FoundryChatClient(
    project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
    model=os.environ["FOUNDRY_MODEL"],
    credential=AzureCliCredential(),
)

researcher_agent = Agent(
    name="ResearcherAgent",
    description="Specialist in research and information gathering",
    instructions=(
        "You are a Researcher. You find information without additional computation or quantitative analysis."
    ),
    client=client,
)

coder_agent = Agent(
    name="CoderAgent",
    description="A helpful assistant that writes and executes code to process and analyze data.",
    instructions="You solve questions using code. Please provide detailed analysis and computation process.",
    client=client,
    tools=client.get_code_interpreter_tool(),
)

# Create a manager agent for orchestration
manager_agent = Agent(
    name="MagenticManager",
    description="Orchestrator that coordinates the research and coding workflow",
    instructions="You coordinate a team to complete complex tasks efficiently.",
    client=client,
)

Manyetik İş Akışı Oluşturun

İş akışını bir yönetici ve katılımcı kümesiyle yapılandırmak için Magentic iş akışı oluşturucusunu kullanın. Oluşturucu ayrıca iç döngü sınırlarını (maksimum koordinasyon yuvarlamaları, yeniden planlamadan önce en fazla ardışık durak sayısı, maksimum plan sıfırlamaları) ve döngüde insan planı incelemesi için bir bayrak sunar.

Workflow workflow = new MagenticWorkflowBuilder(managerAgent)
    .AddParticipants([researcherAgent, coderAgent])
    .WithName("Magentic Orchestration Workflow")
    .WithDescription("Coordinates a researcher and coder to solve a complex analytical task.")
    .RequirePlanSignoff(false)
    .WithMaxRounds(10)
    .WithMaxStalls(3)
    .WithMaxResets(2)
    .Build();
from agent_framework.orchestrations import MagenticBuilder

workflow = MagenticBuilder(
    participants=[researcher_agent, coder_agent],
    intermediate_output_from=[researcher_agent, coder_agent],
    manager_agent=manager_agent,
    max_round_count=10,
    max_stall_count=3,
    max_reset_count=2,
).build()

Tip

Standart yönetici, özgün kağıttan alınan sabit istemlerle Magentic-One tasarımını temel alır. komut istemlerini MagenticBuilderadresine geçirerek yöneticinin davranışını özelleştirin.

İlk bilgi sayfasını veya plan istemlerini özelleştirdiğinizde, yeniden planlama biçiminizi koruyacak şekilde ilgili güncelleştirme istemlerini de özelleştirin. Bir özel progress_ledger_prompt , yerleşik JSON yanıt şemasını korumalıdır.

İstem parametreleri ve bunların kullanılabilir yer tutucuları için özel yönetici istemleri örneğine bakın. Yöneticiyi daha fazla özelleştirmek için alt sınıfını seçin MagenticManagerBase.

Python oluşturucusunun yönetici seçenekleri farklı sahiplik davranışlarına sahiptir:

  • manager_agent, sağlanan aracıyı paylaşarak her iş akışı için yeni bir StandardMagenticManager oluşturur.
  • manager_agent_factory ve manager_factory, build() öğesine yapılan her çağrı için bir kez çalışır.
  • manager sağlanan yönetici örneğini iş akışları arasında paylaşır.

Warning

Eşzamanlı veya iç içe geçen iş akışları arasında durum bilgisi tutan açık bir manager paylaşmayın. Her iş akışına izole yönetici durumu vermek için manager_factory kullanın.

Ara Çıkışlar

Uyarı

Bu bölüm şu anda yalnızca Python pivotu için geçerlidir.

intermediate_output_from=[...] öğesinin MagenticBuilder öğesine geçirilmesi, belirli katılımcıları ara çıktı kaynakları olarak belirler. yield_output çağrıları "intermediate" olaylarını üretirken, yöneticinin nihai sentezlenmiş yanıtı "output" (terminal) olayı olarak kalır. Bu parametre olmadan (varsayılan), yalnızca yöneticinin terminali AgentResponse ortaya çıkar.

Bu özellikle Magentic iş akışları için kullanışlıdır çünkü:

  • Görevler genellikle birçok ajan işbirliği turuyla uzun sürelidir.
  • İş akışı yayın modunda ilerledikçe her aracın katkısını gerçek zamanlı olarak görüntüleyebilirsiniz.
  • İş akışının ara mantık adımlarına görünürlük sağlar

Etkinlik Aktarımı ile İş Akışını Çalıştırma

Karmaşık bir görevi çalıştırır ve akış çıktısı ile orkestrasyon güncellemeleri için olayları yönetir. Terminal iş akışı çıkışı, yöneticinin sentezlenmiş son yanıtını içerir.

const string TaskPrompt =
    "I am preparing a report on the energy efficiency of different machine learning model architectures. " +
    "Compare the estimated training and inference energy consumption of ResNet-50, BERT-base, and GPT-2 " +
    "on standard datasets (for example, ImageNet for ResNet, GLUE for BERT, WebText for GPT-2). " +
    "Then, estimate the CO2 emissions associated with each, assuming training on an Azure Standard_NC6s_v3 " +
    "VM for 24 hours. Provide tables for clarity, and recommend the most energy-efficient model " +
    "per task type (image classification, text classification, and text generation).";

await using StreamingRun run = await InProcessExecution.RunStreamingAsync(
    workflow,
    new List<ChatMessage> { new(ChatRole.User, TaskPrompt) });

await run.TrySendMessageAsync(new TurnToken(emitEvents: true));

string? lastResponseId = null;
WorkflowOutputEvent? finalOutput = null;

await foreach (WorkflowEvent workflowEvent in run.WatchStreamAsync())
{
    switch (workflowEvent)
    {
        case AgentResponseUpdateEvent updateEvent:
            // Stream per-participant deltas. Group by ResponseId / MessageId / ExecutorId so
            // each new contiguous response prints its executor header once.
            string responseId = updateEvent.Update.ResponseId
                ?? updateEvent.Update.MessageId
                ?? updateEvent.ExecutorId;
            if (!string.Equals(responseId, lastResponseId, StringComparison.Ordinal))
            {
                if (lastResponseId is not null)
                {
                    Console.WriteLine();
                }
                Console.Write($"- {updateEvent.ExecutorId}: ");
                lastResponseId = responseId;
            }
            Console.Write(updateEvent.Update.Text);
            break;

        case MagenticPlanCreatedEvent planCreated:
            Console.WriteLine($"\n[Magentic Initial Plan]\n{planCreated.FullTaskLedger.Text}");
            break;

        case MagenticReplannedEvent replanned:
            Console.WriteLine($"\n[Magentic Replanned]\n{replanned.FullTaskLedger.Text}");
            break;

        case MagenticProgressLedgerUpdatedEvent progressUpdated:
            MagenticProgressLedger ledger = progressUpdated.ProgressLedger;
            Console.WriteLine(
                $"\n[Magentic Progress Ledger] satisfied={ledger.IsRequestSatisfied}, " +
                $"inLoop={ledger.IsInLoop}, progressing={ledger.IsProgressBeingMade}, " +
                $"nextSpeaker={ledger.NextSpeaker}, instruction={ledger.InstructionOrQuestion}");
            break;

        case WorkflowOutputEvent outputEvent when outputEvent.Is<List<ChatMessage>>():
            finalOutput = outputEvent;
            break;

        case WorkflowErrorEvent workflowError:
            Console.Error.WriteLine(workflowError.Exception?.ToString() ?? "Unknown workflow error.");
            break;

        case ExecutorFailedEvent executorFailed:
            Console.Error.WriteLine(
                $"Executor '{executorFailed.ExecutorId}' failed: " +
                (executorFailed.Data?.ToString() ?? "unknown error"));
            break;
    }
}

if (finalOutput?.As<List<ChatMessage>>() is { } transcript)
{
    Console.WriteLine("\n\n=== Final Conversation Transcript ===\n");
    foreach (ChatMessage message in transcript)
    {
        Console.WriteLine($"{message.AuthorName ?? message.Role.ToString()}: {message.Text}");
    }
}
import json
import asyncio
from typing import cast

from agent_framework import (
    AgentResponseUpdate,
    Message,
    WorkflowEvent,
)
from agent_framework.orchestrations import MagenticProgressLedger

task = (
    "I am preparing a report on the energy efficiency of different machine learning model architectures. "
    "Compare the estimated training and inference energy consumption of ResNet-50, BERT-base, and GPT-2 "
    "on standard datasets (for example, ImageNet for ResNet, GLUE for BERT, WebText for GPT-2). "
    "Then, estimate the CO2 emissions associated with each, assuming training on an Azure Standard_NC6s_v3 "
    "VM for 24 hours. Provide tables for clarity, and recommend the most energy-efficient model "
    "per task type (image classification, text classification, and text generation)."
)

# Keep track of the last executor to format output nicely in streaming mode
last_message_id: str | None = None
stream = workflow.run(task, stream=True)
async for event in stream:
    if event.type in ("intermediate", "output") and isinstance(event.data, AgentResponseUpdate):
        message_id = event.data.message_id
        if message_id != last_message_id:
            if last_message_id is not None:
                print("\n")
            print(f"- {event.executor_id}:", end=" ", flush=True)
            last_message_id = message_id
        print(event.data, end="", flush=True)

    elif event.type == "magentic_orchestrator":
        print(f"\n[Magentic Orchestrator Event] Type: {event.data.event_type.name}")
        if isinstance(event.data.content, Message):
            print(f"Please review the plan:\n{event.data.content.text}")
        elif isinstance(event.data.content, MagenticProgressLedger):
            print(f"Please review progress ledger:\n{json.dumps(event.data.content.to_dict(), indent=2)}")
        else:
            print(f"Unknown data type in MagenticOrchestratorEvent: {type(event.data.content)}")

        # Block to allow user to read the plan/progress before continuing
        # Note: this is for demonstration only and is not the recommended way to handle human interaction.
        # Please refer to `with_plan_review` for proper human interaction during planning phases.
        await asyncio.get_event_loop().run_in_executor(None, input, "Press Enter to continue...")

result = await stream.get_final_response()
if outputs := result.get_outputs():
    print(outputs[-1])

Magentic, planlama ve ilerleme kilometre taşlarını işaretleyen üç orkestratör olayını öne çıkarır:

  • İlk plan oluşturuldu — yönetici ilk görev planını oluşturmuştur.
  • Yeniden planlandı — duraklama algılama nedeniyle veya bir kişi plan incelemesi yoluyla planı revize ettiği için yeni bir plan üretildi.
  • İlerleme defteri güncelleştirildi — koordinasyon turu başına bir kez yayınlanır; geçerli ilerleme defterini (isteğin karşılanıp karşılanmadığı, ekibin döngüde olup olmadığı, ilerlemenin sağlanıp sağlanmadığı, bir sonraki konuşmacı ve onlara gönderilecek yönerge) taşır.

Python’da bunlar, MagenticOrchestratorEvent enum’unun event_type, PLAN_CREATED ve REPLANNED öğelerini ayırt ettiği tek bir PROGRESS_LEDGER_UPDATED içinde taşınır. .NET’te bunlar — MagenticPlanCreatedEvent, MagenticReplannedEvent ve MagenticProgressLedgerUpdatedEvent — MagenticOrchestratorEvent’ten türetilen üç farklı tür olarak oluşturulurlar.

Gelişmiş: Döngüdeki İnsan Planı İncelemesi

Kullanıcıların yürütmeden önce yöneticinin önerdiği planı gözden geçirmesine ve onaylamasına izin vermek için döngüdeki insan (HITL) özelliğini etkinleştirin. Bu, planın kullanıcı beklentileri ve gereksinimleriyle uyumlu olmasını sağlamak için kullanışlıdır.

Plan incelemesi için iki seçenek vardır:

  1. Düzelt: Kullanıcı, planı gözden geçirmesi için geri bildirim sağlar ve bu da yöneticinin geri bildirime göre yeniden planlamasını tetikler.
  2. Onayla: Kullanıcı planı olduğu gibi onaylar ve iş akışının devam etmesine izin verir.

Magentic iş akışını oluştururken plan gözden geçirmesini etkinleştirin. Varsayılan ayarlar dillere göre farklılık gösterir: Python'da plan gözden geçirme varsayılan olarak kapalıdır (enable_plan_review=False) ve bunu açıkça etkinleştirmeniz gerekir; .NET'te ise plan gözden geçirme varsayılan olarak açıktır (RequirePlanSignoff için varsayılan değer true'tir) ve bu sayfanın önceki bölümündeki temel örnek, etkileşim olmadan uçtan uca çalışabilmesi için bunu devre dışı bırakmıştır. Aşağıdaki kod, sonuçta elde edilen gözden geçirme isteklerinin nasıl kabul ve işleneceğini gösterir.

Plan gözden geçirme duraklamaları, iş akışının istek/yanıt mekanizması aracılığıyla MagenticPlanReviewRequest verileriyle görünür hâle getirilir. Bunları olay akışında işlersiniz ve ilgili kişi planı onayladıktan veya revize ettikten sonra iş akışını bir MagenticPlanReviewResponse ile sürdürürsünüz.

Tip

İstekler ve Yanıtlar kılavuzunda istekler ve yanıtlar hakkında daha fazla bilgi edinin.

Workflow workflow = new MagenticWorkflowBuilder(managerAgent)
    .AddParticipants([researcherAgent, coderAgent])
    .RequirePlanSignoff(true)
    .WithMaxRounds(10)
    .WithMaxStalls(1)
    .WithMaxResets(2)
    .Build();

CheckpointManager checkpointManager = CheckpointManager.CreateInMemory();
InProcessExecutionEnvironment environment = ExecutionEnvironment.InProcess_Lockstep
    .ToWorkflowExecutionEnvironment()
    .WithCheckpointing(checkpointManager);

await using StreamingRun run = await environment.OpenStreamingAsync(workflow);
await run.TrySendMessageAsync(new List<ChatMessage> { new(ChatRole.User, TaskPrompt) });
await run.TrySendMessageAsync(new TurnToken(emitEvents: true));

ExternalRequest? pendingRequest = null;
CheckpointInfo? lastCheckpoint = null;
WorkflowOutputEvent? finalOutput = null;

async Task<WorkflowOutputEvent?> DrainAsync(StreamingRun activeRun)
{
    WorkflowOutputEvent? output = null;
    await foreach (WorkflowEvent evt in activeRun.WatchStreamAsync(blockOnPendingRequest: false))
    {
        switch (evt)
        {
            case AgentResponseUpdateEvent updateEvent:
                Console.Write(updateEvent.Update.Text);
                break;
            case RequestInfoEvent requestInfo
                when requestInfo.Request.Data.As<MagenticPlanReviewRequest>() is not null:
                pendingRequest = requestInfo.Request;
                break;
            case SuperStepCompletedEvent stepCompleted:
                lastCheckpoint = stepCompleted.CompletionInfo?.Checkpoint ?? lastCheckpoint;
                break;
            case WorkflowOutputEvent outputEvent when outputEvent.Is<List<ChatMessage>>():
                output = outputEvent;
                break;
        }
    }
    return output;
}

finalOutput = await DrainAsync(run);

// Loop until the workflow finishes or the user accepts a plan that runs to completion.
while (finalOutput is null && pendingRequest is not null)
{
    MagenticPlanReviewRequest reviewRequest = pendingRequest.Data.As<MagenticPlanReviewRequest>()!;

    Console.WriteLine("\n\n[Magentic Plan Review Request]");
    if (reviewRequest.CurrentProgress is { } progress)
    {
        Console.WriteLine(
            $"Current progress: satisfied={progress.IsRequestSatisfied}, " +
            $"inLoop={progress.IsInLoop}, progressing={progress.IsProgressBeingMade}");
    }
    if (reviewRequest.IsStalled)
    {
        Console.WriteLine("(Replan triggered by stall detection.)");
    }
    Console.WriteLine($"Proposed plan:\n{reviewRequest.Plan.Text}\n");
    Console.Write("Press Enter to approve, or type feedback to request a revision: ");

    string reply = Console.ReadLine() ?? string.Empty;
    MagenticPlanReviewResponse reviewResponse = string.IsNullOrWhiteSpace(reply)
        ? reviewRequest.Approve()
        : reviewRequest.Revise(reply);

    ExternalResponse response = pendingRequest.CreateResponse(reviewResponse);
    pendingRequest = null;

    await using StreamingRun resumed = await environment.ResumeStreamingAsync(workflow, lastCheckpoint!);
    await resumed.SendResponseAsync(response);
    finalOutput = await DrainAsync(resumed);
}

if (finalOutput?.As<List<ChatMessage>>() is { } transcript)
{
    Console.WriteLine("\n\n=== Final Conversation Transcript ===\n");
    foreach (ChatMessage message in transcript)
    {
        Console.WriteLine($"{message.AuthorName ?? message.Role.ToString()}: {message.Text}");
    }
}
import json
import asyncio
from typing import cast

from agent_framework import (
    AgentResponseUpdate,
    Agent,
    Message,
    WorkflowEvent,
)
from agent_framework.orchestrations import (
    MagenticBuilder,
    MagenticPlanReviewRequest,
    MagenticPlanReviewResponse,
)

workflow = MagenticBuilder(
    participants=[researcher_agent, coder_agent],
    intermediate_output_from=[researcher_agent, coder_agent],
    enable_plan_review=True,
    manager_agent=manager_agent,
    max_round_count=10,
    max_stall_count=1,
    max_reset_count=2,
).build()

pending_request: WorkflowEvent | None = None
pending_responses: dict[str, MagenticPlanReviewResponse] | None = None
final_response: object | None = None

while not final_response:
    if pending_responses is not None:
        stream = workflow.run(stream=True, responses=pending_responses)
    else:
        stream = workflow.run(task, stream=True)

    last_message_id: str | None = None
    async for event in stream:
        if event.type in ("intermediate", "output") and isinstance(event.data, AgentResponseUpdate):
            message_id = event.data.message_id
            if message_id != last_message_id:
                if last_message_id is not None:
                    print("\n")
                print(f"- {event.executor_id}:", end=" ", flush=True)
                last_message_id = message_id
            print(event.data, end="", flush=True)

        elif event.type == "request_info" and event.request_type is MagenticPlanReviewRequest:
            pending_request = event

    result = await stream.get_final_response()
    if outputs := result.get_outputs():
        final_response = outputs[-1]

    pending_responses = None

    # Handle plan review request if any
    if pending_request is not None:
        event_data = cast(MagenticPlanReviewRequest, pending_request.data)

        print("\n\n[Magentic Plan Review Request]")
        if event_data.current_progress is not None:
            print("Current Progress Ledger:")
            print(json.dumps(event_data.current_progress.to_dict(), indent=2))
            print()
        print(f"Proposed Plan:\n{event_data.plan.text}\n")
        print("Please provide your feedback (press Enter to approve):")

        reply = await asyncio.get_event_loop().run_in_executor(None, input, "> ")
        if reply.strip() == "":
            print("Plan approved.\n")
            pending_responses = {pending_request.request_id: event_data.approve()}
        else:
            print("Plan revised by human.\n")
            pending_responses = {pending_request.request_id: event_data.revise(reply)}
        pending_request = None

MagenticPlanReviewRequest, önerilen planı, mevcut ilerleme kaydını (null / None ilk incelemede oluşturulan ve duraksama nedeniyle tetiklenen yeniden planlamalarda doldurulan) ve yeniden planlamanın duraksama algılaması tarafından tetiklenip tetiklenmediğini gösteren bir bayrağı içerir. Yanıtı, planı olduğu gibi kabul etmek için approve() öğesini çağırarak veya yöneticiden yeniden planlama yapmasını istemek için geri bildirimle birlikte revise(...) öğesini çağırarak oluşturun.

Önemli Kavramlar

  • Dinamik Koordinasyon: Magentic yöneticisi, gelişen bağlama göre hangi aracının bir sonraki adıma geçileceğini dinamik olarak seçer.
  • Terminal Output: Terminal iş akışı çıkışı, yöneticinin sentezlenmiş son yanıtını (Python bir AgentResponse; .NET'de WorkflowOutputEvent yüküne sahip List<ChatMessage>) taşır.
  • Orchestrator Events: Plan oluşturulan, yeniden planlanan ve ilerleme defteri güncellenen kilometre taşları MagenticOrchestratorEvent aracılığıyla sunulur (Python’da bir event_type enum’u içeren tek bir olay; .NET’te ise türetilmiş üç tür). Katılımcı başına akış deltaları, çerçevenin standart aracı yanıt güncelleştirme olayları aracılığıyla teslim edilir.
  • Yinelemeli İyileştirme: Sistem karmaşık sorunları ayırabilir ve çözümleri birden çok tur aracılığıyla yinelemeli olarak geliştirebilir.
  • İlerleme İzleme ve Durak Algılama: İlerleme defteri isteğin karşılanıp karşılanmadığını, ekibin döngüde olup olmadığını ve ilerlemenin sağlanıp sağlanmadığını izler. Art arda ilerleme kaydedilmeyen turlar duraksama sayacını artırır ve yapılandırılmış azami değerin aşılması otomatik sıfırlama ve yeniden planlamayı tetikler.
  • Esnek İşbirliği: Aracılar, yönetici tarafından belirlenen herhangi bir sırayla birden çok kez çağrılabilir.
  • İnsan Gözetimi: MagenticPlanReviewRequest / MagenticPlanReviewResponse aracılığıyla isteğe bağlı insan denetimli plan incelemesi.
  • Ara Çıktılar (şimdilik yalnızca Python için): yield_output çağrılarının, yöneticinin terminal çıktısının yanında "intermediate" olayları olarak görünmesi gereken katılımcıları belirleyin.

İş Akışı Yürütme Süreci

Magentic düzenlemesi şu yürütme desenini izler:

  1. Planlama Aşaması: Yönetici görevi analiz eder ve bir ilk plan oluşturur
  2. İsteğe Bağlı Plan İncelemesi: Etkinleştirilirse, insanlar planı gözden geçirebilir ve onaylayabilir/değiştirebilir
  3. Aracı Seçimi: Yönetici her alt görev için en uygun aracıyı seçer
  4. Yürütme: Seçili aracı görevin kendi bölümünü yürütür
  5. İlerleme Değerlendirmesi: Yönetici ilerleme durumunu değerlendirir ve planı güncelleştirir
  6. Durak Algılama: İlerleme durursa, isteğe bağlı bir insan inceleme işlemiyle otomatik olarak yeniden planlayın
  7. Yineleme: 3-6 arası adımlar, görev tamamlanana veya sınırlara ulaşılana kadar yinelenir
  8. Son Sentez: Yönetici tüm aracı çıkışlarını nihai bir sonucta sentezler

Tam Örnek

Uyarı

Bu özellik için Go desteği yakında sunulacaktır. En son durum için bkz. Agent Framework Go deposu .

Sonraki Adımlar