Files
2026-07-13 12:39:17 +08:00

87 lines
2.7 KiB
Python

import argparse
import asyncio
import json
from typing import Literal
from agents import (
Agent,
HostedMCPTool,
MCPToolApprovalFunctionResult,
MCPToolApprovalRequest,
Runner,
RunResult,
RunResultStreaming,
)
from examples.auto_mode import confirm_with_fallback
def prompt_approval(request: MCPToolApprovalRequest) -> MCPToolApprovalFunctionResult:
params: object = request.data.arguments or {}
approved = confirm_with_fallback(
f"Approve running tool (mcp: {request.data.name}, params: {json.dumps(params)})? (y/n) ",
default=True,
)
result: MCPToolApprovalFunctionResult = {"approve": approved}
if not approved:
result["reason"] = "User denied"
return result
async def main(verbose: bool, stream: bool) -> None:
require_approval: Literal["always"] = "always"
agent = Agent(
name="MCP Assistant",
instructions=(
"You must always use the MCP tools to answer questions. "
"Use the DeepWiki hosted MCP server to answer questions and do not ask the user for "
"additional configuration."
),
tools=[
HostedMCPTool(
tool_config={
"type": "mcp",
"server_label": "deepwiki",
"server_url": "https://mcp.deepwiki.com/mcp",
"allowed_tools": ["ask_question"],
"require_approval": require_approval,
},
on_approval_request=prompt_approval,
)
],
)
question = "Which language is the repository openai/codex written in?"
run_result: RunResult | RunResultStreaming
if stream:
run_result = Runner.run_streamed(agent, question)
async for event in run_result.stream_events():
if verbose:
print(event)
elif (
event.type == "raw_response_event"
and event.data.type == "response.output_text.delta"
):
print(event.data.delta, end="", flush=True)
if not verbose:
print()
print(f"Done streaming; final result: {run_result.final_output}")
else:
run_result = await Runner.run(agent, question)
while run_result.interruptions:
run_result = await Runner.run(agent, run_result.to_state())
print(run_result.final_output)
if verbose:
for item in run_result.new_items:
print(item)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", action="store_true", default=False)
parser.add_argument("--stream", action="store_true", default=False)
args = parser.parse_args()
asyncio.run(main(args.verbose, args.stream))