d08200d00e
* Bump Python package versions for 1.12.0 release Bump packages represented in the 1.12.0 changelog, promote Foundry Hosting, Azure Content Understanding, Gemini, Mistral, Monty, and Tools to beta, and apply the requested beta cohort date stamp. Root and core move to 1.12.0, released and RC packages use their selected increments, alpha packages including Hosting MCP use the 260721 stamp, and core floors are raised only for proven consumers. Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdf * fix version in readme * Add Responses conversation ID changes to release notes Include the breaking Hosting Responses conversation ID helper changes from #7234 in the Python 1.12.0 changelog. Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdf
140 lines
5.8 KiB
Python
140 lines
5.8 KiB
Python
# /// script
|
|
# requires-python = ">=3.10"
|
|
# dependencies = [
|
|
# "agent-framework-foundry",
|
|
# "textual>=6.2.1",
|
|
# "rich>=13.7.1",
|
|
# "python-dotenv",
|
|
# ]
|
|
# ///
|
|
# Run with any PEP 723 compatible runner, e.g.:
|
|
# uv run samples/02-agents/harness/harness_data_processing.py
|
|
|
|
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
"""Harness Data Processing Assistant with Console UI and tool approvals.
|
|
|
|
Demonstrates ``create_harness_agent`` configured with a ``FileAccessProvider``
|
|
to give an agent access to a folder of CSV data files. The agent can read,
|
|
analyze, and extract information from the data, then write results back as new
|
|
files via the ``file_access_*`` tools.
|
|
|
|
This sample also demonstrates **tool approval**. The ``FileAccessProvider``
|
|
registers all of its tools with ``approval_mode="always_require"``, so every
|
|
file operation would normally prompt the host for approval. To keep read-only
|
|
exploration frictionless while still guarding mutations, the agent is given the
|
|
:meth:`FileAccessProvider.read_only_tools_auto_approval_rule` auto-approval
|
|
rule. With this rule:
|
|
|
|
- Read-only tools (read, list files, list subdirectories, search) are
|
|
auto-approved and run without prompting.
|
|
- Write tools (save and delete) still require explicit approval, so you are
|
|
asked before the agent modifies the file store.
|
|
|
|
The sample includes a pre-populated ``working/`` folder with sales transaction
|
|
data. The ``FileAccessProvider`` is pointed at that folder (resolved relative to
|
|
this script) so it works regardless of the current working directory. Ask the
|
|
agent to analyze the data, produce summaries, or create new output files. For
|
|
example::
|
|
|
|
Please process the sales.csv file by first filtering it to only North region
|
|
sales, and then calculating the sum of sales by person. I'd like to write the
|
|
results of the processing to north_region_totals.csv
|
|
|
|
When the agent reads ``sales.csv`` it proceeds automatically, but when it tries
|
|
to save ``north_region_totals.csv`` you are prompted to approve the write.
|
|
|
|
Unused harness features (todos, plan/execute mode, web search) are disabled to
|
|
keep this a simple, conversational data-interaction sample.
|
|
|
|
Environment variables:
|
|
FOUNDRY_PROJECT_ENDPOINT — Microsoft Foundry project endpoint URL
|
|
FOUNDRY_MODEL — Model deployment name
|
|
|
|
Authentication:
|
|
Run ``az login`` before running this sample.
|
|
"""
|
|
|
|
import asyncio
|
|
from pathlib import Path
|
|
|
|
from agent_framework import FileAccessProvider, FileSystemAgentFileStore, create_harness_agent
|
|
from agent_framework.foundry import FoundryChatClient
|
|
from azure.identity import AzureCliCredential
|
|
from console import build_default_observers, run_agent_async
|
|
from dotenv import load_dotenv
|
|
|
|
DATA_ANALYST_INSTRUCTIONS = """\
|
|
You are a data analyst assistant. You have access to a folder of data files via the file_access_* tools.
|
|
|
|
## Getting started
|
|
- Start by listing available files with file_access_ls to see what data is available.
|
|
- Read the files to understand their structure and contents.
|
|
|
|
## Working with data
|
|
- When asked to analyze data, read the relevant files first, then perform the analysis.
|
|
- Show your analysis clearly with tables, summaries, and key insights.
|
|
- When calculations are needed, work through them step by step and show your reasoning.
|
|
|
|
## Writing output
|
|
- When asked to produce output files (e.g., reports, summaries, filtered data), use file_access_write to write them.
|
|
- Use appropriate file formats: CSV for tabular data, Markdown for reports.
|
|
- Confirm what you wrote and where.
|
|
|
|
## Important
|
|
- Never modify or delete the original input data files unless explicitly asked to do so.
|
|
- If asked about data you haven't read yet, read it first before answering.
|
|
- Always explain your reasoning and thought process as you work through tasks.
|
|
- Always explain what you learned and what you are going to do next between tool calls, so the user can
|
|
follow along with your thought process.
|
|
"""
|
|
|
|
MAX_CONTEXT_WINDOW_TOKENS = 1_050_000
|
|
MAX_OUTPUT_TOKENS = 128_000
|
|
|
|
|
|
async def main() -> None:
|
|
load_dotenv()
|
|
|
|
# Resolve the working/ folder bundled alongside this script. The agent reads
|
|
# the seed data from here and writes any output files back into it.
|
|
working_dir = Path(__file__).parent / "working"
|
|
|
|
# Create the chat client.
|
|
# For authentication, run `az login` in terminal or replace AzureCliCredential
|
|
# with your preferred authentication option.
|
|
client = FoundryChatClient(credential=AzureCliCredential())
|
|
|
|
# Create a harness agent with data-analyst instructions. Unused features are
|
|
# disabled. The read_only_tools_auto_approval_rule auto-approves the
|
|
# FileAccessProvider's read-only tools, so only write operations prompt.
|
|
agent = create_harness_agent(
|
|
client=client,
|
|
max_context_window_tokens=MAX_CONTEXT_WINDOW_TOKENS,
|
|
max_output_tokens=MAX_OUTPUT_TOKENS,
|
|
name="DataAnalyst",
|
|
description="A data analyst assistant that reads, analyzes, and processes data files.",
|
|
agent_instructions=DATA_ANALYST_INSTRUCTIONS,
|
|
file_access_store=FileSystemAgentFileStore(working_dir),
|
|
auto_approval_rules=[FileAccessProvider.read_only_tools_auto_approval_rule],
|
|
disable_todo=True,
|
|
disable_mode=True,
|
|
disable_web_search=True,
|
|
)
|
|
|
|
# Run the harness console. This sample has no plan/execute mode, so it uses
|
|
# the default observers (no planning observer) and no initial mode.
|
|
await run_agent_async(
|
|
agent,
|
|
session=agent.create_session(),
|
|
observers=build_default_observers(),
|
|
title="📊 Data Analyst",
|
|
placeholder="Ask me to analyze the data files, produce summaries, or create output files...",
|
|
max_context_window_tokens=MAX_CONTEXT_WINDOW_TOKENS,
|
|
max_output_tokens=MAX_OUTPUT_TOKENS,
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|