chore: import upstream snapshot with attribution
CodeQL / Analyze (csharp) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
dotnet-build-and-test / dotnet-test-functions (push) Has been cancelled
dotnet-build-and-test / paths-filter (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Debug, windows-latest, net9.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net8.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-foundry-hosted-it (push) Has been cancelled
dotnet-build-and-test / dotnet-build-and-test-check (push) Has been cancelled
dotnet-build-and-test / Integration Test Report (push) Has been cancelled
CodeQL / Analyze (csharp) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
dotnet-build-and-test / dotnet-test-functions (push) Has been cancelled
dotnet-build-and-test / paths-filter (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Debug, windows-latest, net9.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net8.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-foundry-hosted-it (push) Has been cancelled
dotnet-build-and-test / dotnet-build-and-test-check (push) Has been cancelled
dotnet-build-and-test / Integration Test Report (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
# /// script
|
||||
# requires-python = ">=3.10"
|
||||
# dependencies = [
|
||||
# "agent-framework-foundry",
|
||||
# "textual>=6.2.1",
|
||||
# "rich>=13.7.1",
|
||||
# "azure-identity",
|
||||
# "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 — Azure AI 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())
|
||||
Reference in New Issue
Block a user