GitHub Copilot

Microsoft Agent Framework поддерживает создание агентов, использующих пакет SDK для GitHub Copilot в качестве серверной части. Агенты GitHub Copilot предоставляют доступ к мощным возможностям ИИ, ориентированным на кодирование, включая выполнение команд оболочки, операции с файлами, получение URL-адресов и интеграцию с сервером mcP.

Это важно

Агентам GitHub Copilot требуется аутентифицированная среда выполнения GitHub Copilot. Некоторые пакеты SDK используют установленный интерфейс командной строки, а пакет SDK Go использует пакетную среду выполнения по умолчанию. Для обеспечения безопасности рекомендуется запускать агенты с разрешениями оболочки или файла в контейнерной среде (контейнер Docker/Dev).

Getting Started

Добавьте необходимые пакеты NuGet в проект.

dotnet add package Microsoft.Agents.AI.GitHub.Copilot

Создание агента GitHub Copilot

Сначала создайте CopilotClient и запустите его. Затем используйте AsAIAgent метод расширения для создания агента.

using GitHub.Copilot;
using Microsoft.Agents.AI;

await using CopilotClient copilotClient = new();
await copilotClient.StartAsync();

AIAgent agent = copilotClient.AsAIAgent(sessionConfig: null);

Console.WriteLine(await agent.RunAsync("What is Microsoft Agent Framework?"));

С инструментами и инструкциями

Вы можете предоставить средства функций и пользовательские инструкции при создании агента:

using GitHub.Copilot;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

AIFunction weatherTool = AIFunctionFactory.Create((string location) =>
{
    return $"The weather in {location} is sunny with a high of 25C.";
}, "GetWeather", "Get the weather for a given location.");

await using CopilotClient copilotClient = new();
await copilotClient.StartAsync();

AIAgent agent = copilotClient.AsAIAgent(
    tools: [weatherTool],
    instructions: "You are a helpful weather agent.");

Console.WriteLine(await agent.RunAsync("What's the weather like in Seattle?"));

Компоненты агента

Ответы потоковые

Получайте ответы по мере их создания.

await using CopilotClient copilotClient = new();
await copilotClient.StartAsync();

AIAgent agent = copilotClient.AsAIAgent(sessionConfig: null);

await foreach (AgentResponseUpdate update in agent.RunStreamingAsync("Tell me a short story."))
{
    Console.Write(update);
}

Console.WriteLine();

Управление сеансами

Сохраняйте контекст беседы в нескольких взаимодействиях с помощью сеансов:

await using CopilotClient copilotClient = new();
await copilotClient.StartAsync();

await using GitHubCopilotAgent agent = new(
    copilotClient,
    instructions: "You are a helpful assistant. Keep your answers short.");

AgentSession session = await agent.CreateSessionAsync();

// First turn
await agent.RunAsync("My name is Alice.", session);

// Second turn - agent remembers the context
AgentResponse response = await agent.RunAsync("What is my name?", session);
Console.WriteLine(response); // Should mention "Alice"

Permissions

По умолчанию агент не может выполнять команды оболочки, читать/записывать файлы или получать URL-адреса. Чтобы включить эти возможности, предоставьте обработчик разрешений с помощью SessionConfig:

static Task<PermissionDecision> PromptPermission(
    PermissionRequest request, PermissionInvocation invocation)
{
    Console.WriteLine($"\n[Permission Request: {request.Kind}]");
    Console.Write("Approve? (y/n): ");

    string? input = Console.ReadLine()?.Trim().ToUpperInvariant();
    PermissionDecision decision = input is "Y" or "YES"
        ? PermissionDecision.ApproveOnce()
        : PermissionDecision.Reject();

    return Task.FromResult(decision);
}

await using CopilotClient copilotClient = new();
await copilotClient.StartAsync();

SessionConfig sessionConfig = new()
{
    OnPermissionRequest = PromptPermission,
};

AIAgent agent = copilotClient.AsAIAgent(sessionConfig);

Console.WriteLine(await agent.RunAsync("List all files in the current directory"));

Утверждение инструмента

Поскольку GitHub Copilot SDK управляет циклом вызова инструментов, подтверждение для пользовательских инструментов-функций обеспечивается через встроенный в SDK хук, срабатывающий перед выполнением, а не через стандартный цикл согласования в Agent Framework. Когда вы регистрируете инструмент, обёрнутый в ApprovalRequiredAIFunction, агент устанавливает хук OnPreToolUse по умолчанию, который возвращает "ask" для этого инструмента и передаёт принятие решения вашему обработчику OnPermissionRequest:

using GitHub.Copilot;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

AIFunction deleteFile = AIFunctionFactory.Create(
    (string path) => $"Deleted {path}.",
    "DeleteFile",
    "Deletes a file.");

await using CopilotClient copilotClient = new();
await copilotClient.StartAsync();

SessionConfig sessionConfig = new()
{
    // Wrapping the tool marks it approval-required; the agent turns this into an "ask" at OnPreToolUse.
    Tools = [new ApprovalRequiredAIFunction(deleteFile)],

    // OnPermissionRequest decides the "asked" tools (and Copilot's built-in shell/file/URL prompts).
    OnPermissionRequest = PromptPermission,
};

AIAgent agent = copilotClient.AsAIAgent(sessionConfig);

Console.WriteLine(await agent.RunAsync("Delete the file temp.txt"));

Предупреждение

Если вы предоставляете собственный OnPreToolUse хук через SessionConfig.Hooks, он имеет приоритет, и агент не устанавливает свой хук подтверждения по умолчанию. После этого вы несете полную ответственность за обеспечение утверждения для любого зарегистрированного вами ApprovalRequiredAIFunction (например, возвращая решение "deny" или "ask"). Агент записывает в журнал предупреждение с указанием любого инструмента, требующего подтверждения, который ваш хук должен обрабатывать.

Серверы MCP

Подключитесь к локальным (stdio) или удаленным (HTTP) СЕРВЕРАм MCP для расширенных возможностей:

await using CopilotClient copilotClient = new();
await copilotClient.StartAsync();

SessionConfig sessionConfig = new()
{
    OnPermissionRequest = PromptPermission,
    McpServers = new Dictionary<string, McpServerConfig>
    {
        // Local stdio server
        ["filesystem"] = new McpStdioServerConfig
        {
            Command = "npx",
            Args = ["-y", "@modelcontextprotocol/server-filesystem", "."],
            Tools = ["*"],
        },
        // Remote HTTP server
        ["microsoft-learn"] = new McpHttpServerConfig
        {
            Url = "https://learn.microsoft.com/api/mcp",
            Tools = ["*"],
        },
    },
};

AIAgent agent = copilotClient.AsAIAgent(sessionConfig);

Console.WriteLine(await agent.RunAsync("Search Microsoft Learn for 'Azure Functions' and summarize the top result"));

Tip

Полные примеры запуска см. в примерах .NET .

Tools

инструмент Статус Notes
Средства функций ✅ Стандартные AIFunction экземпляры.
Утверждение инструмента ✅ Предоставляется чат-клиентом фреймворка с вызовом функций; работает с любым вызовом функции-инструмента.
Интерпретатор кода ❌ Это не является возможностью Copilot CLI.
Поиск файлов ❌ Это не является возможностью Copilot CLI.
Поиск в Интернете ❌ Недоступно в виде размещённого инструмента.
Оболочка / файловая система / получение URL-адреса ✅ Встроена в среду выполнения Copilot CLI, а доступ к ней контролируется предоставленным вами обработчиком Permissions.
Размещенные средства MCP ✅ Удаленные (HTTP) СЕРВЕРы MCP, настроенные с помощью SessionConfig.McpServers. См. статью "Серверы MCP".
Локальные средства MCP ✅ Локальные (stdio) серверы MCP, настроенные с помощью SessionConfig.McpServers. См. статью "Серверы MCP".

Использование агента

Агент является стандартным AIAgent и поддерживает все стандартные AIAgent операции.

Дополнительные сведения о запуске и взаимодействии с агентами см. в руководствах по началу работы агента.

Prerequisites

Установите пакет Microsoft Agent Framework GitHub Copilot.

pip install agent-framework-github-copilot

Configuration

Агент можно настроить при необходимости с помощью следующих переменных среды:

Variable Описание
GITHUB_COPILOT_CLI_PATH Путь к исполняемому файлу Copilot CLI
GITHUB_COPILOT_MODEL Модель для использования (например, gpt-5, ) claude-sonnet-4
GITHUB_COPILOT_TIMEOUT Время ожидания запроса в секундах
GITHUB_COPILOT_LOG_LEVEL Уровень журнала CLI
GITHUB_COPILOT_BASE_DIRECTORY Каталог для состояния сеанса CLI и конфигурации (по умолчанию — ~/.copilot)

Getting Started

Импортируйте необходимые классы из Agent Framework:

import asyncio
from agent_framework.github import GitHubCopilotAgent, GitHubCopilotOptions

Создание агента GitHub Copilot

Базовое создание агента

Самый простой способ создания агента GitHub Copilot:

async def basic_example():
    agent = GitHubCopilotAgent(
        instructions="You are a helpful assistant.",
    )

    async with agent:
        result = await agent.run("What is Microsoft Agent Framework?")
        print(result)

С явной конфигурацией

Вы можете предоставить явную конфигурацию с помощью default_options:

async def explicit_config_example():
    agent = GitHubCopilotAgent(
        instructions="You are a helpful assistant.",
        default_options={
            "model": "gpt-5",
            "timeout": 120,
        },
    )

    async with agent:
        result = await agent.run("What can you do?")
        print(result)

Tip

default_options (а для каждого запуска — options) передаёт любой параметр, который поддерживается create_session в Copilot SDK, — например, reasoning_effort, context_tier, enable_citations, provider (использование собственного ключа) или skill_directories, — а не только ключи, показанные здесь. Неизвестные имена параметров вызывают TypeError, поэтому опечатки обнаруживаются, а не молча игнорируются.

Управление хуками файлов рабочего пространства

По умолчанию GitHubCopilotAgent не загружает файловые хуки из папки .github/hooks/ в рабочем каталоге. Соглашайтесь только в том случае, если вы доверяете рабочему каталогу и хотите, чтобы его хуки влияли на сеанс:

from agent_framework.github import GitHubCopilotAgent, GitHubCopilotOptions
async def opt_in_to_file_hooks() -> None:
    """2. Opt in for a working directory whose hooks you trust."""
    print("=== 2. Opted in: file hooks from the working directory are loaded ===\n")

    agent: GitHubCopilotAgent[GitHubCopilotOptions] = GitHubCopilotAgent(
        instructions="You are a helpful assistant.",
        default_options=GitHubCopilotOptions(enable_file_hooks=True),
    )

    async with agent:
        result = await agent.run("In one sentence, what can you help me with?")
        print(f"Agent: {result}\n")

Предупреждение

Файловые хуки выполняют команды от имени пользователя, который запускает ваше приложение. Они не зависят от on_permission_request или других обратных вызовов для подтверждения инструментов.

Если рабочий каталог определяет хуки и параметр enable_file_hooks не указан, агент по умолчанию задаёт ему значение False и один раз записывает предупреждение через средство ведения журнала agent_framework.github_copilot. Явная установка enable_file_hooks=False отключает хуки без вывода этого предупреждения.

приносите свой ключ (BYOK)

Используйте поддержку BYOK в Copilot SDK, чтобы направлять запросы к модели через собственную конечную точку OpenAI, Azure OpenAI, Anthropic или совместимую с OpenAI конечную точку вместо бэкенда GitHub Copilot. Передайте ProviderConfig через GitHubCopilotOptions(provider=...) и задайте один и тот же идентификатор модели и в конфигурации поставщика, и в параметре model на уровне сеанса.

В этом исполняемом примере используются следующие переменные среды:

Variable Описание
BYOK_PROVIDER_TYPE Тип поставщика: openai, azureили anthropic. По умолчанию — openai.
BYOK_BASE_URL Базовый URL-адрес конечной точки поставщика.
BYOK_API_KEY Статический ключ API для конечной точки поставщика.
BYOK_MODEL_ID Идентификатор запрашиваемой модели. По умолчанию — gpt-4o.

В примере используется статический ключ API. Для ротации учетных данных задайте в ProviderConfig экспериментальное поле bearer_token_provider, указав синхронный или асинхронный обратный вызов, возвращающий токен. Copilot SDK вызывает функцию обратного вызова для каждого запроса к поставщику, и эта функция отвечает за получение токена, кэширование и обновление. Поставщик токена Bearer имеет приоритет над api_key и bearer_token, если они также заданы.

Предупреждение

Не храните статические ключи API и токены в системе контроля версий. Загрузите их из переменных среды или секретного хранилища. Поставщик, а не GitHub, отслеживает использование и выставление счетов.

import asyncio
import os
from typing import Literal, cast

from agent_framework.github import GitHubCopilotAgent, GitHubCopilotOptions
from copilot.session import ProviderConfig


async def main() -> None:
    print("=== GitHub Copilot Agent with BYOK (Bring Your Own Key) ===\n")

    model_id = os.environ.get("BYOK_MODEL_ID", "gpt-4o")
    provider_type = cast(Literal["openai", "azure", "anthropic"], os.environ.get("BYOK_PROVIDER_TYPE", "openai"))

    # ProviderConfig routes the session through a custom endpoint instead of the GitHub
    # Copilot backend. `wire_api="completions"` is the broadly compatible choice; use
    # "responses" for providers that support the OpenAI Responses API.
    provider: ProviderConfig = {
        "type": provider_type,
        "base_url": os.environ["BYOK_BASE_URL"],
        "api_key": os.environ["BYOK_API_KEY"],
        "wire_api": "completions",
        "model_id": model_id,
    }

    # BYOK requires the model to also be set at the session level.
    agent: GitHubCopilotAgent[GitHubCopilotOptions] = GitHubCopilotAgent(
        instructions="You are a helpful assistant.",
        default_options=GitHubCopilotOptions(model=model_id, provider=provider),
    )

    async with agent:
        query = "What are the benefits of using your own API keys with an agent framework?"
        print(f"User: {query}")
        result = await agent.run(query)
        print(f"\nAgent: {result}\n")

Компоненты агента

Поставщики контекстов

Python GitHubCopilotAgent также поддерживает context_providers=[...]. Поставщики выполняются до и после каждого вызова, поэтому сообщения и инструкции, добавленные поставщиками, включены в запрос Copilot, и поставщики данных могут наблюдать окончательный ответ.

from agent_framework import InMemoryHistoryProvider

agent = GitHubCopilotAgent(
    instructions="You are a helpful coding assistant.",
    context_providers=[InMemoryHistoryProvider()],
)

Встроенных поставщиков истории можно объединить с настраиваемыми поставщиками контекста. Шаблоны реализации см. в разделе "Поставщики контекста".

Инструменты функций

Оснастите вашего агента настраиваемыми функциями:

from typing import Annotated
from pydantic import Field

def get_weather(
    location: Annotated[str, Field(description="The location to get the weather for.")],
) -> str:
    """Get the weather for a given location."""
    return f"The weather in {location} is sunny with a high of 25C."

async def tools_example():
    agent = GitHubCopilotAgent(
        instructions="You are a helpful weather agent.",
        tools=[get_weather],
    )

    async with agent:
        result = await agent.run("What's the weather like in Seattle?")
        print(result)

Чтобы передать в инструмент значения, доступные только на хосте, объявите параметр с аннотацией FunctionInvocationContext, и передайте function_invocation_kwargs при запуске. Параметр контекста скрыт от схемы, отправленной модели. Он содержит текущие значения выполнения в ctx.kwargs и текущий AgentSession в ctx.session.

from agent_framework import FunctionInvocationContext


def get_customer_status(
    customer_id: str,
    ctx: FunctionInvocationContext,
) -> str:
    tenant_id = ctx.kwargs["tenant_id"]
    session_id = ctx.session.session_id if ctx.session else "none"
    return f"{tenant_id}:{customer_id} in session {session_id}"


agent = GitHubCopilotAgent(tools=[get_customer_status])
session = agent.create_session()

async with agent:
    result = await agent.run(
        "Check customer 123.",
        session=session,
        function_invocation_kwargs={"tenant_id": "contoso"},
    )

Такое же перенаправление контекста применяется к потоковым запускам и восстановленным сеансам Copilot. Средства без параметра контекста сохраняют существующее поведение.

Потоковая передача ответов

Получите ответы по мере их создания для лучшего взаимодействия с пользователем:

async def streaming_example():
    agent = GitHubCopilotAgent(
        instructions="You are a helpful assistant.",
    )

    async with agent:
        print("Agent: ", end="", flush=True)
        async for chunk in agent.run("Tell me a short story.", stream=True):
            if chunk.text:
                print(chunk.text, end="", flush=True)
        print()

Управление потоками

Сохраняйте контекст беседы в нескольких взаимодействиях:

async def thread_example():
    agent = GitHubCopilotAgent(
        instructions="You are a helpful assistant.",
    )

    async with agent:
        session = agent.create_session()

        # First interaction
        result1 = await agent.run("My name is Alice.", session=session)
        print(f"Agent: {result1}")

        # Second interaction - agent remembers the context
        result2 = await agent.run("What's my name?", session=session)
        print(f"Agent: {result2}")  # Should remember "Alice"

Permissions

По умолчанию агент не может выполнять команды оболочки, читать/записывать файлы или получать URL-адреса. Чтобы включить эти возможности, предоставьте обработчик разрешений:

import asyncio

from copilot.generated.rpc import PermissionDecisionDeniedInteractivelyByUser
from copilot.session import PermissionHandler, PermissionRequestResult
from copilot.session_events import PermissionRequest


async def prompt_permission(
    request: PermissionRequest, context: dict[str, str]
) -> PermissionRequestResult:
    print(f"\n[Permission Request: {request.kind}]")
    response = (await asyncio.to_thread(input, "Approve? (y/n): ")).strip().lower()
    if response in ("y", "yes"):
        return PermissionHandler.approve_all(request, context)
    return PermissionDecisionDeniedInteractivelyByUser()

async def permissions_example():
    agent = GitHubCopilotAgent(
        instructions="You are a helpful assistant that can execute shell commands.",
        default_options={
            "on_permission_request": prompt_permission,
        },
    )

    async with agent:
        result = await agent.run("List the Python files in the current directory")
        print(result)

В доверенных средах, где все разрешения должны автоматически одобряться, используйте встроенный PermissionHandler.approve_all:

from copilot.session import PermissionHandler

agent = GitHubCopilotAgent(
    default_options={
        "on_permission_request": PermissionHandler.approve_all,
    },
)

Обработчики разрешений поддерживают синхронизацию и асинхронные обратные вызовы. Используйте asyncio.to_thread для интерактивных приглашений в асинхронных обработчиках, чтобы избежать блокировки цикла событий.

Утверждение инструмента

Поскольку GitHub Copilot SDK управляет циклом вызова инструментов, подтверждение для пользовательских инструментов-функций обеспечивается через встроенный в SDK хук, срабатывающий перед выполнением, а не через стандартный цикл согласования в Agent Framework. Когда вы регистрируете инструмент, объявленный с помощью approval_mode="always_require", и не предоставляете собственный on_pre_tool_use hook, агент устанавливает hook по умолчанию, который возвращает "ask" для этого инструмента и передаёт решение в ваш обработчик on_permission_request:

from agent_framework import tool
from agent_framework.github import GitHubCopilotAgent, GitHubCopilotOptions
from copilot.session import PermissionHandler


@tool(approval_mode="always_require")
def delete_file(path: str) -> str:
    """Delete a file."""
    return f"Deleted {path}."


agent = GitHubCopilotAgent(
    tools=[delete_file],
    # The "ask" decision is routed here; approve or deny the call.
    default_options=GitHubCopilotOptions(on_permission_request=PermissionHandler.approve_all),
)

Другие перехватчики сеансов, такие как on_post_tool_use или on_session_start, остаются активными вместе с хуком подтверждения по умолчанию. Только хук on_pre_tool_use, предоставленный вызывающей стороной, заменяет хук подтверждения по умолчанию.

Предупреждение

Если вы предоставляете собственный on_pre_tool_use хук, он имеет приоритет, и агент не устанавливает свой хук подтверждения по умолчанию. Затем вы несете полную ответственность за обеспечение утверждения любого approval_mode="always_require" инструмента (например, возвращая решение "deny" или "ask"). Агент записывает в журнал предупреждение с указанием любого инструмента, требующего подтверждения, который ваш хук должен обрабатывать. При использовании обработчика разрешений с политикой «запрещено всё» по умолчанию использование инструмента always_require запрещено, если только вы не подключите одобряющий on_permission_request.

Серверы MCP

Подключитесь к локальным (stdio) или удаленным (HTTP) СЕРВЕРАм MCP для расширенных возможностей:

from copilot.session import MCPServerConfig, PermissionHandler

async def mcp_example():
    mcp_servers: dict[str, MCPServerConfig] = {
        # Local stdio server
        "filesystem": {
            "type": "stdio",
            "command": "npx",
            "args": ["-y", "@modelcontextprotocol/server-filesystem", "."],
            "tools": ["*"],
        },
        # Remote HTTP server
        "microsoft-learn": {
            "type": "http",
            "url": "https://learn.microsoft.com/api/mcp",
            "tools": ["*"],
        },
    }

    agent = GitHubCopilotAgent(
        instructions="You are a helpful assistant with access to the filesystem and Microsoft Learn.",
        default_options={
            "on_permission_request": PermissionHandler.approve_all,
            "mcp_servers": mcp_servers,
        },
    )

    async with agent:
        result = await agent.run("Search Microsoft Learn for 'Azure Functions' and summarize the top result")
        print(result)

Observability

GitHubCopilotAgent имеет встроенную поддержку трассировки OpenTelemetry. Вызов configure_otel_providers() один раз при запуске, чтобы включить диапазоны, метрики и журналы для каждого запуска:

from agent_framework.observability import configure_otel_providers
from agent_framework.github import GitHubCopilotAgent

configure_otel_providers(enable_console_exporters=True)

async with GitHubCopilotAgent() as agent:
    response = await agent.run("Hello!")

Если вам нужен базовый агент без слоя телеметрии (например, чтобы обернуть его в собственный), импортируйте RawGitHubCopilotAgent из agent_framework.github.

Примеры наблюдаемости см. в примерах для экспортеров OTLP и более богатых примеров.

Tools

инструмент Статус Notes
Средства функций ✅ Стандартные вызываемые объекты Python или @ai_function.
Утверждение инструмента ✅ Предоставляется чат-клиентом фреймворка с вызовом функций; работает с любым вызовом функции-инструмента.
Интерпретатор кода ❌ Это не является возможностью Copilot CLI.
Поиск файлов ❌ Это не является возможностью Copilot CLI.
Поиск в Интернете ❌ Недоступно в виде размещённого инструмента.
Оболочка / файловая система / получение URL-адреса ✅ Встроена в среду выполнения Copilot CLI и управляется предоставляемым вами обработчиком Permissions.
Размещенные средства MCP ✅ Удаленные (HTTP) СЕРВЕРы MCP, настроенные с помощью default_options["mcp_servers"]. См. статью "Серверы MCP".
Локальные средства MCP ✅ Локальные (stdio) серверы MCP, настроенные с помощью default_options["mcp_servers"]. См. статью "Серверы MCP".

Использование агента

Агент стандартный BaseAgent и поддерживает все стандартные операции агента.

Дополнительные сведения о запуске и взаимодействии с агентами см. в руководствах по началу работы агента.

Getting Started

Установите модуль Microsoft Agent Framework Go и пакет SDK GitHub Copilot для Go. Пакет SDK для Agent Framework Go требует go 1.26 или более поздней версии.

go get github.com/microsoft/agent-framework-go github.com/github/copilot-sdk/go

Создание агента GitHub Copilot

Создайте и запустите copilot.Client, затем передайте его в copilotprovider.NewAgent.

import (
    "context"
    "fmt"

    copilot "github.com/github/copilot-sdk/go"
    "github.com/microsoft/agent-framework-go/provider/copilotprovider"
)

ctx := context.Background()

copilotClient := copilot.NewClient(nil)
if err := copilotClient.Start(ctx); err != nil {
    panic(err)
}
defer func() { _ = copilotClient.Stop() }()

copilotAgent := copilotprovider.NewAgent(
    copilotClient,
    copilotprovider.AgentConfig{
        Instructions: "You are a helpful assistant.",
    },
)

response, err := copilotAgent.RunText(ctx, "What is Microsoft Agent Framework?").Collect()
if err != nil {
    panic(err)
}
fmt.Println(response)

С инструментами и инструкциями

Вы можете предоставить средства функций и пользовательские инструкции при создании агента:

import (
    "context"
    "fmt"

    copilot "github.com/github/copilot-sdk/go"
    "github.com/microsoft/agent-framework-go/agent"
    "github.com/microsoft/agent-framework-go/provider/copilotprovider"
    "github.com/microsoft/agent-framework-go/tool"
    "github.com/microsoft/agent-framework-go/tool/functool"
)

weatherTool := functool.MustNew(
    functool.Config{
        Name:        "GetWeather",
        Description: "Get the weather for a given location.",
    },
    func(_ context.Context, location string) (string, error) {
        return fmt.Sprintf("The weather in %s is sunny with a high of 25C.", location), nil
    },
)

copilotAgent := copilotprovider.NewAgent(
    copilotClient,
    copilotprovider.AgentConfig{
        Instructions: "You are a helpful weather agent.",
        Config: agent.Config{
            Tools: []tool.Tool{weatherTool},
        },
    },
)

response, err := copilotAgent.RunText(ctx, "What's the weather like in Seattle?").Collect()
if err != nil {
    panic(err)
}
fmt.Println(response)

Компоненты агента

Ответы потоковые

Получайте ответы по мере их создания.

for update, err := range copilotAgent.RunText(ctx, "Tell me a short story.", agent.Stream(true)) {
    if err != nil {
        panic(err)
    }
    fmt.Print(update)
}

fmt.Println()

Управление сеансами

Сохраняйте контекст беседы в нескольких взаимодействиях с помощью сеансов:

session, err := copilotAgent.CreateSession(ctx)
if err != nil {
    panic(err)
}

// First turn
response, err := copilotAgent.RunText(ctx, "My name is Alice.", agent.WithSession(session)).Collect()
if err != nil {
    panic(err)
}
fmt.Println(response)

// Second turn - the agent remembers the context
response, err = copilotAgent.RunText(ctx, "What is my name?", agent.WithSession(session)).Collect()
if err != nil {
    panic(err)
}
fmt.Println(response)

Permissions

По умолчанию агент не может выполнять команды оболочки, читать/записывать файлы или получать URL-адреса. Чтобы включить эти возможности, предоставьте обработчик разрешений с помощью copilot.SessionConfig:

import (
    "bufio"
    "fmt"
    "os"
    "strings"

    copilot "github.com/github/copilot-sdk/go"
    "github.com/github/copilot-sdk/go/rpc"
    "github.com/microsoft/agent-framework-go/provider/copilotprovider"
)

func promptPermission(request copilot.PermissionRequest, _ copilot.PermissionInvocation) (rpc.PermissionDecision, error) {
    fmt.Printf("\n[Permission Request: %s]\n", request.Kind())
    fmt.Print("Approve? (y/n): ")

    input, _ := bufio.NewReader(os.Stdin).ReadString('\n')
    input = strings.TrimSpace(strings.ToUpper(input))
    if input == "Y" || input == "YES" {
        return &rpc.PermissionDecisionApproveOnce{}, nil
    }
    return &rpc.PermissionDecisionReject{}, nil
}

copilotAgent := copilotprovider.NewAgent(
    copilotClient,
    copilotprovider.AgentConfig{
        SessionConfig: &copilot.SessionConfig{
            OnPermissionRequest: promptPermission,
        },
    },
)

response, err := copilotAgent.RunText(ctx, "List all files in the current directory").Collect()
if err != nil {
    panic(err)
}
fmt.Println(response)

Серверы MCP

Подключитесь к локальным (stdio) или удаленным (HTTP) СЕРВЕРАм MCP для расширенных возможностей:

import (
    copilot "github.com/github/copilot-sdk/go"
    "github.com/microsoft/agent-framework-go/provider/copilotprovider"
)

mcpServers := map[string]copilot.MCPServerConfig{
    // Local stdio server
    "filesystem": copilot.MCPStdioServerConfig{
        Command: "npx",
        Args:    []string{"-y", "@modelcontextprotocol/server-filesystem", "."},
        Tools:   []string{"*"},
    },
    // Remote HTTP server
    "microsoft-learn": copilot.MCPHTTPServerConfig{
        URL:   "https://learn.microsoft.com/api/mcp",
        Tools: []string{"*"},
    },
}

copilotAgent := copilotprovider.NewAgent(
    copilotClient,
    copilotprovider.AgentConfig{
        Instructions: "You are a helpful assistant with access to the filesystem and Microsoft Learn.",
        SessionConfig: &copilot.SessionConfig{
            OnPermissionRequest: promptPermission,
            MCPServers:          mcpServers,
        },
    },
)

response, err := copilotAgent.RunText(ctx, "Search Microsoft Learn for 'Azure Functions' and summarize the top result").Collect()
if err != nil {
    panic(err)
}
fmt.Println(response)

Tip

Полный пример запуска см. в примере go GitHub Copilot.

Tools

инструмент Статус Notes
Средства функций ✅ Стандартные экземпляры Go tool.Tool, включая функции functool.
Утверждение инструмента ✅ Инструменты Function могут использовать стандартный механизм согласования инструментов Go; разрешения среды выполнения Copilot обрабатываются с помощью SessionConfig.OnPermissionRequest.
Интерпретатор кода ❌ Это не является возможностью Copilot CLI.
Поиск файлов ❌ Это не является возможностью Copilot CLI.
Поиск в Интернете ❌ Недоступно в виде размещённого инструмента.
Оболочка / файловая система / получение URL-адреса ✅ Встроена в среду выполнения Copilot CLI и управляется предоставляемым вами обработчиком Permissions.
Размещенные средства MCP ✅ Удаленные (HTTP) СЕРВЕРы MCP, настроенные с помощью copilot.SessionConfig.MCPServers. См. статью "Серверы MCP".
Локальные средства MCP ✅ Локальные (stdio) серверы MCP, настроенные с помощью copilot.SessionConfig.MCPServers. См. статью "Серверы MCP".

Использование агента

Агент стандартный *agent.Agent и поддерживает все стандартные операции агента.

Дополнительные сведения о запуске и взаимодействии с агентами см. в руководствах по началу работы агента.

Дальнейшие действия