Если я использую игровую площадку в Foundry, агент реагирует соответствующим образом. Когда я пытаюсь использовать сервер MCP, мне предоставляется ссылка для аутентификации (опять же, это ожидаемо, поскольку сервер mcp требует аутентификации), если я прохожу аутентификацию, игровая площадка может использовать MCP, и я получаю ожидаемые данные.
Я хочу иметь клиент чата, написанный на Blazor, поэтому я настроил бэкэнд для установления соединения с Foundry с конечной точкой API для вызова с сообщениями чата (код ниже).
Если я отключу инструмент MCP тогда код работает отлично, сообщения передаются агенту, а ответы передаются обратно в соответствии с инструкциями, данными агенту в Foundry.
Если я включаю инструмент MCP, я получаю ответ от Foundry, но он не соответствует типам контента, которые руководство предлагает использовать для потоковых данных (например, FunctionToolContent, ToolCallContent, DataContent, TextContent, ErrorContent) и поэтому не позволяет мне идентифицировать его для отображения. Я почти уверен, что этот ответ предназначен для ответа на аутентификацию MCP. Я почти уверен в этом, потому что если я удалю свой инструмент и добавлю «веб-поиск» (который не требует аутентификации), я смогу успешно запустить этот инструмент из моего интерфейса (если я попрошу его выполнить веб-поиск, чтобы найти ответ на вопрос).
Я проверил обновление, ChatUpdate и отдельные объекты содержимого, и в ответе нет ничего, что могло бы помочь мне определить, что это ссылка для аутентификации. Насколько я понимаю, библиотека Microsoft AGUI принимает ответы от Foundry и структурирует ответы так, чтобы они относились к определенным типам, чтобы их было легче обрабатывать, поэтому возможно, что в настоящее время это не поддерживается библиотекой (что разрушило бы мои планы). Я ценю, что AGUI является новым протоколом, но, попробовав использовать API OpenAI в Foundry и обнаружив его ограниченность, я был впечатлен простотой использования библиотек AGUI.
Кто-нибудь знает, как я могу идентифицировать и обрабатывать запрос аутентификации инструмента на внешнем интерфейсе?
Внутренний код
Код: Выделить всё
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Hosting.AGUI.AspNetCore;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient().AddLogging();
builder.Services.AddAGUI();
WebApplication app = builder.Build();
const string endpoint = "";
const string agentId = "";
// Connect to the existing AI agent
AIAgent agent = new AIProjectClient(
new Uri(endpoint),
new DefaultAzureCredential())
.AsAIAgent(agentId);
// Map the AG-UI agent endpoint
app.MapAGUI("/", agent);
await app.RunAsync();
Код: Выделить всё
StringBuilder finalMessage = new StringBuilder();
messages.Add(new Microsoft.Extensions.AI.ChatMessage(Microsoft.Extensions.AI.ChatRole.User, text));
await foreach (AgentResponseUpdate update in agent.RunStreamingAsync(messages, session))
{
ChatResponseUpdate chatUpdate = update.AsChatResponseUpdate();
// Display streaming text content
if (update.Contents.Count > 0)
{
foreach (AIContent content in update.Contents)
{
if (content is DataContent dataContent)
{
finalMessage.Append("DATACONTENT:" + JsonSerializer.Serialize(dataContent));
}
if (content is FunctionCallContent functionCallContent)
{
}
if (content is ToolCallContent toolCallContent)
{
finalMessage.Append(JsonSerializer.Serialize(content));
}
if (content is TextContent textContent)
{
finalMessage.Append(textContent.Text);
InProgressMessage += textContent.Text;
StateHasChanged();
}
else if (content is ErrorContent errorContent)
{
finalMessage.Append("THERE WAS AN ERROR: " + errorContent.Message);
InProgressMessage = finalMessage.ToString();
}
}
}
else
{
finalMessage.Append(JsonSerializer.Serialize(update));
}
}
messages.Add(new ChatMessage(ChatRole.Assistant, finalMessage.ToString()));
InProgressMessage = string.Empty;
Мобильная версия