الخطوة 7: استضافة وكيلك

للمقارنة بين عوامل Foundry المستضافة المدارة Microsoft والاستضافة الذاتية والتنفيذ الدائم مع Durable Extension، راجع تطبيقات إطار عمل عامل الاستضافة.

الاستضافة في ASP.NET Core

يوفر إطار عمل العامل مكتبات استضافة تمكنك من دمج وكلاء الذكاء الاصطناعي في تطبيقات ASP.NET Core. تبسط هذه المكتبات تسجيل العوامل وتكوينها وكشفها من خلال بروتوكولات مختلفة.

كما هو موضح في العوامل، AIAgent هو تجريد العامل الأساسي في إطار عمل العامل. وهو يعرف "برنامج تضمين LLM" الذي يعالج مدخلات المستخدم، ويتخذ القرارات، ويستدعي الأدوات، وينفذ عملا إضافيا لتنفيذ الإجراءات وإنشاء الاستجابات. الكشف عن وكلاء الذكاء الاصطناعي من تطبيق ASP.NET Core الخاص بك ليس أمرا تافها. تحل مكتبات الاستضافة هذا عن طريق تسجيل وكلاء الذكاء الاصطناعي في حاوية حقن التبعية، ما يسمح لك بحلها واستخدامها في خدمات التطبيق الخاصة بك. كما أنها تمكنك من إدارة تبعيات العامل، مثل الأدوات وتخزين الجلسة، من نفس الحاوية. يمكن استضافة الوكلاء جنبا إلى جنب مع البنية الأساسية للتطبيق الخاص بك، بغض النظر عن البروتوكولات التي يستخدمونها. وبالمثل، يمكن استضافة مهام سير العمل والاستفادة من البنية الأساسية الشائعة لتطبيقك.

مكتبة الاستضافة الأساسية

Microsoft.Agents.AI.Hosting المكتبة هي الأساس لاستضافة وكلاء الذكاء الاصطناعي في ASP.NET Core. يوفر ملحقات IHostApplicationBuilder لتسجيل وتكوين عوامل الذكاء الاصطناعي ومهام سير العمل. في ASP.NET Core، IHostApplicationBuilder هو النوع الأساسي الذي يمثل المنشئ للتطبيقات والخدمات المستضافة وإدارة التكوين والتسجيل ومدة البقاء والمزيد.

قبل تكوين العوامل أو مهام سير العمل، قم بتسجيل IChatClient في حاوية إدخال التبعية. في الأمثلة أدناه، يتم تسجيله كقاعدة بيانات مفردة ذات مفتاح تحت الاسم chat-model:

// endpoint is your Microsoft Foundry project endpoint
// deploymentName is 'gpt-4o-mini' for example

IChatClient chatClient = new AIProjectClient(
        new Uri(endpoint),
        new DefaultAzureCredential())
    .GetProjectOpenAIClient()
    .GetProjectResponsesClient()
    .AsIChatClient(deploymentName);
builder.Services.AddSingleton(chatClient);

تحذير

DefaultAzureCredential مناسب للتنمية ولكنه يتطلب دراسة متأنية في الإنتاج. في الإنتاج، ضع في اعتبارك استخدام بيانات اعتماد محددة (على سبيل المثال، ManagedIdentityCredential) لتجنب مشكلات زمن الانتقال، وبحث بيانات الاعتماد غير المقصودة، والمخاطر الأمنية المحتملة من الآليات الاحتياطية.

AddAIAgent

تسجيل عامل الذكاء الاصطناعي مع حقن التبعية:

var pirateAgent = builder.AddAIAgent(
    "pirate",
    instructions: "You are a pirate. Speak like a pirate",
    description: "An agent that speaks like a pirate.",
    chatClientServiceKey: "chat-model");

يقوم AddAIAgent() الأسلوب بإرجاع IHostedAgentBuilder، والذي يوفر أساليب ملحق لتكوين العامل. على سبيل المثال، يمكنك إضافة أدوات إلى العامل:

var pirateAgent = builder.AddAIAgent("pirate", instructions: "You are a pirate. Speak like a pirate")
    .WithAITool(new MyTool()); // MyTool is a custom type derived from AITool

يمكنك أيضا تكوين مخزن الجلسة (تخزين بيانات المحادثة):

var pirateAgent = builder.AddAIAgent("pirate", instructions: "You are a pirate. Speak like a pirate")
    .WithInMemorySessionStore();

AddWorkflow

تسجيل مهام سير العمل التي تنسق عوامل متعددة. سير العمل هو في الأساس "رسم بياني" حيث تكون كل عقدة AIAgent، ويتواصل الوكلاء مع بعضهم البعض.

في هذا المثال، يعمل عاملان بشكل تسلسلي. يتم إرسال إدخال المستخدم أولا إلى agent-1، والذي ينتج استجابة ويرسلها إلى agent-2. ثم يقوم سير العمل إخراج الاستجابة النهائية. هناك أيضا BuildConcurrent أسلوب يقوم بإنشاء سير عمل عامل متزامن.

builder.AddAIAgent("agent-1", instructions: "you are agent 1!");
builder.AddAIAgent("agent-2", instructions: "you are agent 2!");

var workflow = builder.AddWorkflow("my-workflow", (sp, key) =>
{
    var agent1 = sp.GetRequiredKeyedService<AIAgent>("agent-1");
    var agent2 = sp.GetRequiredKeyedService<AIAgent>("agent-2");
    return AgentWorkflowBuilder.BuildSequential(key, [agent1, agent2]);
});

كشف سير العمل ك AIAgent

لاستخدام تكاملات البروتوكول (مثل A2A أو OpenAI) مع سير عمل، قم بتحويله إلى عامل مستقل. حاليا، لا توفر مهام سير العمل قدرات تكامل مماثلة من تلقاء نفسها، لذا فإن خطوة التحويل هذه مطلوبة:

var workflowAsAgent = builder
    .AddWorkflow("science-workflow", (sp, key) => { ... })
    .AddAsAIAgent();  // Now the workflow can be used as an agent

تفاصيل التنفيذ

تعمل مكتبات الاستضافة كمحولات بروتوكول تقوم بوصل بروتوكولات الاتصال الخارجية والتنفيذ الداخلي AIAgent لإطار عمل العامل. عند استخدام مكتبة تكامل استضافة، تسترد المكتبة المسجلة AIAgent من حقن التبعية، وتغلفها مع برنامج وسيط خاص بالبروتوكول لترجمة الطلبات الواردة والاستجابات الصادرة، وتستدعي AIAgent لمعالجة الطلبات. تحافظ هذه البنية على بروتوكول تنفيذ العامل الخاص بك غير محدد.

على سبيل المثال، استخدام مكتبة استضافة ASP.NET Core مع محول بروتوكول A2A:

// Register the agent
var pirateAgent = builder.AddAIAgent("pirate",
    instructions: "You are a pirate. Speak like a pirate",
    description: "An agent that speaks like a pirate.");

// Expose via a protocol (e.g. A2A)
builder.Services.AddA2AServer();
var app = builder.Build();
app.MapA2AServer();
app.Run();

Microsoft Foundry Hosted Agents هو خيار الاستضافة المدارة الأساسي. أكمل المتطلبات الأساسية ل Foundry Hosted Agents، بما في ذلك ملحق عامل AI لمطور CLI Azure وتسجيل الدخول Azure CLI.

ينشئ نموذج البدء عامل مع تعطيل تخزين النموذج من جانب الخادم ويبدأ ResponsesHostServer:

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient, ResponsesHostServer
from azure.identity import DefaultAzureCredential


def main() -> None:
    agent = Agent(
        client=FoundryChatClient(
            project_endpoint="https://your-account.services.ai.azure.com/api/projects/your-project",
            model="gpt-6-luna",
            credential=DefaultAzureCredential(),
        ),
        instructions="You are a friendly assistant. Keep your answers brief.",
        default_options={"store": False},
    )
    ResponsesHostServer(agent=agent, history_source="agent_server").run()


if __name__ == "__main__":
    main()

استبدل نقطة نهاية المشروع المشفرة واسم نشر النموذج، ثم قم بتشغيل عينة PEP 723 محليا من جذر مستودع Agent Framework:

uv run python/samples/01-get-started/07_hosting.py

لنشر مشروع عامل مستضاف كامل، قم بتهيئة من النموذج azure.yamlالذي تم الاحتفاظ به:

mkdir my-hosted-agent && cd my-hosted-agent
azd ai agent init -t https://github.com/microsoft-foundry/foundry-samples/blob/main/samples/python/hosted-agents/agent-framework/responses/01-basic/azure.yaml --src .

تشغيل مضيف العامل:

azd ai agent run

في محطة طرفية أخرى، استدع العامل المحلي:

azd ai agent invoke --local "Hello!"

Tip

راجع نموذج بدء الاستخدام الكاملونموذج النشر الكامل. للحصول على إرشادات النشر، راجع Foundry Hosted Agents.

الاستضافة باستخدام بروتوكول A2A

يوفر منفذ Go استضافة A2A من خلال a2aprovider، والذي يلتف عامل في معالج HTTP متوافق مع بروتوكول عامل إلى عامل.

Note

استضافة Durable Extension غير متوفرة حاليا ل Go. للحصول على أحدث حالة Go SDK، راجع مستودع Agent Framework Go.

إنشاء عامل:

import (
    "github.com/microsoft/agent-framework-go/agent"
    "github.com/microsoft/agent-framework-go/provider/a2aprovider"
    "github.com/microsoft/agent-framework-go/provider/foundryprovider"

    "github.com/a2aproject/a2a-go/v2/a2a"
    "github.com/a2aproject/a2a-go/v2/a2asrv"
)

a := foundryprovider.NewAgent(endpoint, token, foundryprovider.ModelDeployment(model), foundryprovider.AgentConfig{
    Instructions: "You are a helpful assistant.",
    Config: agent.Config{
    },
})

كشف العامل عبر A2A:

url := "http://localhost:5000"
card := &a2a.AgentCard{
    Name:               "MyAgent",
    Description:        "A helpful assistant.",
    Version:            "1.0.0",
    DefaultInputModes:  []string{"text"},
    DefaultOutputModes: []string{"text"},
    Capabilities:       a2a.AgentCapabilities{Streaming: false},
    SupportedInterfaces: []*a2a.AgentInterface{
        a2a.NewAgentInterface(url, a2a.TransportProtocolJSONRPC),
    },
}

mux := http.NewServeMux()
requestHandler := a2asrv.NewHandler(
    a2aprovider.NewExecutor(a, a2aprovider.ExecutorConfig{}),
    a2asrv.WithExtendedAgentCard(card),
)
mux.Handle("/", a2asrv.NewJSONRPCHandler(requestHandler))
mux.Handle(a2asrv.WellKnownAgentCardPath, a2asrv.NewStaticAgentCardHandler(card))

log.Println("A2A server listening on :5000")
http.ListenAndServe(":5000", mux)

Tip

راجع نموذج خادم عميل A2A الكامل للحصول على مثال كامل قابل للتشغيل.

الخطوات التالية

انتقل إلى أبعد من ذلك:

(راجع أيضًا)