mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
93cbf6b3f0
* Parse structuredContent from MCP CallToolResult (#3313) The _parse_tool_result_from_mcp method only iterated over the content field from CallToolResult, ignoring the structuredContent field entirely. MCP servers that return JSON data via structuredContent (e.g., Power BI MCP) appeared to return None. Add handling for structuredContent: when present, serialize it as JSON text and append it to the result list. This preserves the data for the LLM while maintaining backward compatibility with existing behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: Parse MCP CallToolResult.structuredContent field to prevent tool results returning None Fixes #3313 * Address review feedback: add default=str to json.dumps and remove .checkpoints/ - Add default=str to json.dumps for structuredContent serialization so non-JSON-serializable values (e.g. bytes) degrade gracefully instead of raising TypeError - Remove all .checkpoints/ runtime artifacts from the repository - Add **/.checkpoints/ to .gitignore to prevent future accidental commits - Add test for non-serializable structuredContent values Fixes #3313 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address review feedback for #3313: Python: MCP CallToolResult.structuredContent field is not parsed, causing tool results to return None --------- Co-authored-by: Copilot <copilot@github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
"""Todo command handler — /todos to display the todo list."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
from .base import CommandHandler
|
|
|
|
if TYPE_CHECKING:
|
|
from agent_framework import AgentSession, TodoProvider
|
|
|
|
from ..state_driver import IUXStateDriver
|
|
|
|
|
|
class TodoCommandHandler(CommandHandler):
|
|
"""Handle the /todos command to display the current todo list."""
|
|
|
|
def __init__(self, todo_provider: TodoProvider | None) -> None:
|
|
"""Initialize with the todo provider.
|
|
|
|
Args:
|
|
todo_provider: The todo provider, or None if not available.
|
|
"""
|
|
self._todo_provider = todo_provider
|
|
|
|
def get_help_text(self) -> str | None:
|
|
"""Return help text, or None if todo provider is unavailable."""
|
|
if self._todo_provider is None:
|
|
return None
|
|
return "/todos (show todo list)"
|
|
|
|
async def try_handle(
|
|
self,
|
|
user_input: str,
|
|
session: AgentSession,
|
|
ux: IUXStateDriver,
|
|
) -> bool:
|
|
"""Handle /todos by displaying the todo list."""
|
|
if user_input.strip().lower() != "/todos":
|
|
return False
|
|
|
|
if self._todo_provider is None:
|
|
ux.append_info_line("TodoProvider is not available.")
|
|
return True
|
|
|
|
todos = await self._todo_provider.store.load_items(session, source_id=self._todo_provider.source_id)
|
|
|
|
if not todos:
|
|
ux.append_info_line("No todos yet.")
|
|
return True
|
|
|
|
ux.append_info_line("── Todo List ──")
|
|
for item in todos:
|
|
status = "✓" if item.is_complete else "○"
|
|
color = "dim" if item.is_complete else None
|
|
description = f" — {item.description}" if item.description else ""
|
|
ux.append_info_line(
|
|
f"[{status}] #{item.id} {item.title}{description}",
|
|
color=color,
|
|
)
|
|
|
|
return True
|