Python: [BREAKING] changed AIFunction to FunctionTool and @ai_function to @tool (#3413)

* changed AIFunction to FunctionTool and @ai_function to @tool

* test and mypy fixes

* mypy fix

* switch function tool to always_require

* fix noop

* fix github copilot imports

* test fixes

* fix ollama test

* fixes for tests

* fix tests

* reverted change to always_require and extended timeout

* fix test
This commit is contained in:
Eduard van Valkenburg
2026-01-28 15:53:53 +01:00
committed by GitHub
Unverified
parent 15b43f2abe
commit a7d924a7d2
255 changed files with 1202 additions and 1290 deletions
@@ -15,6 +15,7 @@ from agent_framework import (
WorkflowBuilder,
WorkflowContext,
executor,
tool,
)
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity import AzureCliCredential
@@ -4,20 +4,20 @@ import asyncio
import json
from typing import Annotated, Any
from agent_framework import ChatMessage, SequentialBuilder, WorkflowOutputEvent, ai_function
from agent_framework import ChatMessage, SequentialBuilder, WorkflowOutputEvent, tool
from agent_framework.openai import OpenAIChatClient
from pydantic import Field
"""
Sample: Workflow kwargs Flow to @ai_function Tools
Sample: Workflow kwargs Flow to @tool Tools
This sample demonstrates how to flow custom context (skill data, user tokens, etc.)
through any workflow pattern to @ai_function tools using the **kwargs pattern.
through any workflow pattern to @tool functions using the **kwargs pattern.
Key Concepts:
- Pass custom context as kwargs when invoking workflow.run_stream() or workflow.run()
- kwargs are stored in SharedState and passed to all agent invocations
- @ai_function tools receive kwargs via **kwargs parameter
- @tool functions receive kwargs via **kwargs parameter
- Works with Sequential, Concurrent, GroupChat, Handoff, and Magentic patterns
Prerequisites:
@@ -26,7 +26,8 @@ Prerequisites:
# Define tools that accept custom context via **kwargs
@ai_function
# NOTE: approval_mode="never_require" is for sample brevity. Use "always_require" in production; see samples/getting_started/tools/function_tool_with_approval.py and samples/getting_started/tools/function_tool_with_approval_and_threads.py.
@tool(approval_mode="never_require")
def get_user_data(
query: Annotated[str, Field(description="What user data to retrieve")],
**kwargs: Any,
@@ -43,7 +44,7 @@ def get_user_data(
return f"Retrieved data for user {user_name} with {access_level} access: {query}"
@ai_function
@tool(approval_mode="never_require")
def call_api(
endpoint_name: Annotated[str, Field(description="Name of the API endpoint to call")],
**kwargs: Any,
@@ -86,7 +87,7 @@ async def main() -> None:
# Build a simple sequential workflow
workflow = SequentialBuilder().participants([agent]).build()
# Define custom context that will flow to ai_functions via kwargs
# Define custom context that will flow to tools via kwargs
custom_data = {
"api_config": {
"base_url": "https://api.example.com",
@@ -110,7 +111,7 @@ async def main() -> None:
print("Workflow Execution (watch for [tool_name] logs showing kwargs received):")
print("-" * 70)
# Run workflow with kwargs - these will flow through to ai_functions
# Run workflow with kwargs - these will flow through to tools
async for event in workflow.run_stream(
"Please get my user data and then call the users API endpoint.",
custom_data=custom_data,