chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
import argparse
|
||||
import asyncio
|
||||
import os
|
||||
|
||||
from openai.types.responses import ResponseFunctionShellToolCall
|
||||
from openai.types.responses.response_container_reference import ResponseContainerReference
|
||||
|
||||
from agents import Agent, Runner, ShellTool, ShellToolSkillReference, trace
|
||||
from agents.items import ModelResponse
|
||||
|
||||
SHELL_SKILL_ID_ENV = "OPENAI_SHELL_SKILL_ID"
|
||||
SHELL_SKILL_VERSION_ENV = "OPENAI_SHELL_SKILL_VERSION"
|
||||
DEFAULT_SKILL_REFERENCE: ShellToolSkillReference = {
|
||||
"type": "skill_reference",
|
||||
"skill_id": "skill_698bbe879adc81918725cbc69dcae7960bc5613dadaed377",
|
||||
"version": "1",
|
||||
}
|
||||
|
||||
|
||||
def resolve_skill_reference() -> ShellToolSkillReference:
|
||||
skill_id = os.environ.get(SHELL_SKILL_ID_ENV)
|
||||
if not skill_id:
|
||||
return DEFAULT_SKILL_REFERENCE
|
||||
|
||||
reference: ShellToolSkillReference = {"type": "skill_reference", "skill_id": skill_id}
|
||||
skill_version = os.environ.get(SHELL_SKILL_VERSION_ENV)
|
||||
if skill_version:
|
||||
reference["version"] = skill_version
|
||||
return reference
|
||||
|
||||
|
||||
def extract_container_id(raw_responses: list[ModelResponse]) -> str | None:
|
||||
for response in raw_responses:
|
||||
for item in response.output:
|
||||
if isinstance(item, ResponseFunctionShellToolCall) and isinstance(
|
||||
item.environment, ResponseContainerReference
|
||||
):
|
||||
return item.environment.container_id
|
||||
|
||||
return None
|
||||
|
||||
|
||||
async def main(model: str) -> None:
|
||||
skill_reference = resolve_skill_reference()
|
||||
print(
|
||||
"[info] Using skill reference:",
|
||||
skill_reference["skill_id"],
|
||||
f"(version {skill_reference.get('version', 'default')})",
|
||||
)
|
||||
|
||||
with trace("container_shell_skill_reference_example"):
|
||||
agent1 = Agent(
|
||||
name="Container Shell Agent (Skill Reference)",
|
||||
model=model,
|
||||
instructions="Use the available container skill to answer user requests.",
|
||||
tools=[
|
||||
ShellTool(
|
||||
environment={
|
||||
"type": "container_auto",
|
||||
"network_policy": {"type": "disabled"},
|
||||
"skills": [skill_reference],
|
||||
}
|
||||
)
|
||||
],
|
||||
)
|
||||
|
||||
result1 = await Runner.run(
|
||||
agent1,
|
||||
(
|
||||
"Use the csv-workbench skill. Create /mnt/data/orders.csv with columns "
|
||||
"id,region,amount,status and at least 6 rows. Then report total amount by "
|
||||
"region and count failed orders."
|
||||
),
|
||||
)
|
||||
print(f"Agent: {result1.final_output}")
|
||||
|
||||
container_id = extract_container_id(result1.raw_responses)
|
||||
if not container_id:
|
||||
raise RuntimeError("Container ID was not returned in shell call output.")
|
||||
|
||||
print(f"[info] Reusing container_id={container_id}")
|
||||
|
||||
agent2 = Agent(
|
||||
name="Container Reference Shell Agent",
|
||||
model=model,
|
||||
instructions="Reuse the existing shell container and answer concisely.",
|
||||
tools=[
|
||||
ShellTool(
|
||||
environment={
|
||||
"type": "container_reference",
|
||||
"container_id": container_id,
|
||||
}
|
||||
)
|
||||
],
|
||||
)
|
||||
|
||||
result2 = await Runner.run(
|
||||
agent2,
|
||||
"Run `ls -la /mnt/data`, then summarize in one sentence.",
|
||||
)
|
||||
print(f"Agent (container reuse): {result2.final_output}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
"--model",
|
||||
default="gpt-5.6-sol",
|
||||
help="Model name to use.",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
asyncio.run(main(args.model))
|
||||
Reference in New Issue
Block a user