chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
"""
|
||||
Show how a non-sandbox agent can hand work to a sandbox agent.
|
||||
|
||||
The intake agent never sees a workspace directly. It hands document-heavy work
|
||||
to a sandbox reviewer, and that reviewer then hands the synthesized result to a
|
||||
plain account-facing writer.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import asyncio
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
from agents import Agent, Runner
|
||||
from agents.run import RunConfig
|
||||
from agents.sandbox import SandboxAgent, SandboxRunConfig
|
||||
from agents.sandbox.sandboxes.unix_local import UnixLocalSandboxClient
|
||||
|
||||
if __package__ is None or __package__ == "":
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
|
||||
|
||||
from examples.sandbox.misc.example_support import text_manifest
|
||||
from examples.sandbox.misc.workspace_shell import WorkspaceShellCapability
|
||||
|
||||
DEFAULT_QUESTION = (
|
||||
"Review the attached onboarding packet and draft a short internal note for the account "
|
||||
"executive about what to confirm before kickoff."
|
||||
)
|
||||
|
||||
|
||||
async def main(model: str, question: str) -> None:
|
||||
# The manifest becomes the workspace that only the sandbox reviewer can inspect.
|
||||
manifest = text_manifest(
|
||||
{
|
||||
"customer_background.md": (
|
||||
"# Customer background\n\n"
|
||||
"- Customer: Bluebird Logistics.\n"
|
||||
"- Region: North America.\n"
|
||||
"- New purchase: analytics workspace plus SSO.\n"
|
||||
),
|
||||
"kickoff_checklist.md": (
|
||||
"# Kickoff checklist\n\n"
|
||||
"- Security questionnaire is still in review.\n"
|
||||
"- Two customer admins still need to complete access training.\n"
|
||||
"- Target kickoff date is next Tuesday.\n"
|
||||
),
|
||||
"implementation_scope.md": (
|
||||
"# Implementation scope\n\n"
|
||||
"- The customer wants historical data migration for 5 years of records.\n"
|
||||
"- Data engineering support is available only starting next month.\n"
|
||||
),
|
||||
}
|
||||
)
|
||||
|
||||
# This final agent does not inspect files. It only rewrites reviewed facts into a note.
|
||||
account_manager = Agent(
|
||||
name="Account Executive Assistant",
|
||||
model=model,
|
||||
instructions=(
|
||||
"You write concise internal updates for account teams. Convert the sandbox review "
|
||||
"into a short note with a headline, the top risks, and a recommended next step."
|
||||
),
|
||||
)
|
||||
|
||||
# This sandbox agent can inspect the workspace, then hand its findings to the writer above.
|
||||
sandbox_reviewer = SandboxAgent(
|
||||
name="Onboarding Packet Reviewer",
|
||||
model=model,
|
||||
instructions=(
|
||||
"You inspect onboarding documents in the sandbox, verify the facts, then hand off "
|
||||
"to the account executive assistant to draft the final note. Do not answer the user "
|
||||
"directly after reviewing the packet."
|
||||
),
|
||||
default_manifest=manifest,
|
||||
handoffs=[account_manager],
|
||||
capabilities=[WorkspaceShellCapability()],
|
||||
)
|
||||
|
||||
# The starting agent is a normal agent. It only decides when to hand off into the sandbox.
|
||||
intake_agent = Agent(
|
||||
name="Deal Desk Intake",
|
||||
model=model,
|
||||
instructions=(
|
||||
"You triage internal requests. If a request depends on attached documents, hand off "
|
||||
"to the onboarding packet reviewer immediately."
|
||||
),
|
||||
handoffs=[sandbox_reviewer],
|
||||
)
|
||||
|
||||
result = await Runner.run(
|
||||
intake_agent,
|
||||
question,
|
||||
run_config=RunConfig(sandbox=SandboxRunConfig(client=UnixLocalSandboxClient())),
|
||||
)
|
||||
print(result.final_output)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--model", default="gpt-5.6-sol", help="Model name to use.")
|
||||
parser.add_argument("--question", default=DEFAULT_QUESTION, help="Prompt to send to the agent.")
|
||||
args = parser.parse_args()
|
||||
|
||||
asyncio.run(main(args.model, args.question))
|
||||
Reference in New Issue
Block a user