mirror of
https://github.com/encounter/adk-python.git
synced 2026-07-09 18:19:28 -07:00
chore: Let tools to handle root directory resolvement and model only knows the project name and always use relative path
PiperOrigin-RevId: 816213558
This commit is contained in:
committed by
Copybara-Service
parent
3f4bd67b49
commit
3be9cd844c
@@ -34,7 +34,6 @@ from .tools.delete_files import delete_files
|
||||
from .tools.explore_project import explore_project
|
||||
from .tools.read_config_files import read_config_files
|
||||
from .tools.read_files import read_files
|
||||
from .tools.resolve_root_directory import resolve_root_directory
|
||||
from .tools.search_adk_source import search_adk_source
|
||||
from .tools.write_config_files import write_config_files
|
||||
from .tools.write_files import write_files
|
||||
@@ -60,9 +59,7 @@ class AgentBuilderAssistant:
|
||||
Configured LlmAgent with embedded ADK AgentConfig schema
|
||||
"""
|
||||
# Load full ADK AgentConfig schema directly into instruction context
|
||||
instruction = AgentBuilderAssistant._load_instruction_with_schema(
|
||||
model, working_directory
|
||||
)
|
||||
instruction = AgentBuilderAssistant._load_instruction_with_schema(model)
|
||||
|
||||
# TOOL ARCHITECTURE: Hybrid approach using both AgentTools and FunctionTools
|
||||
#
|
||||
@@ -95,8 +92,6 @@ class AgentBuilderAssistant:
|
||||
write_config_files
|
||||
), # Write/validate multiple YAML configs
|
||||
FunctionTool(explore_project), # Analyze project structure
|
||||
# Working directory context tools
|
||||
FunctionTool(resolve_root_directory),
|
||||
# File management tools (multi-file support)
|
||||
FunctionTool(read_files), # Read multiple files
|
||||
FunctionTool(write_files), # Write multiple files
|
||||
@@ -135,7 +130,6 @@ class AgentBuilderAssistant:
|
||||
# ADK AgentConfig schema loading with caching and error handling.
|
||||
schema_content = load_agent_config_schema(
|
||||
raw_format=True, # Get as JSON string
|
||||
escape_braces=True, # Escape braces for template embedding
|
||||
)
|
||||
|
||||
# Format as indented code block for instruction embedding
|
||||
@@ -157,7 +151,6 @@ class AgentBuilderAssistant:
|
||||
@staticmethod
|
||||
def _load_instruction_with_schema(
|
||||
model: Union[str, BaseLlm],
|
||||
working_directory: Optional[str] = None,
|
||||
) -> Callable[[ReadonlyContext], str]:
|
||||
"""Load instruction template and embed ADK AgentConfig schema content."""
|
||||
instruction_template = (
|
||||
@@ -172,19 +165,43 @@ class AgentBuilderAssistant:
|
||||
else getattr(model, "model_name", str(model))
|
||||
)
|
||||
|
||||
# Fill the instruction template with ADK AgentConfig schema content and default model
|
||||
instruction_text = instruction_template.format(
|
||||
schema_content=schema_content, default_model=model_str
|
||||
)
|
||||
|
||||
# Return a function that accepts ReadonlyContext and returns the instruction
|
||||
def instruction_provider(context: ReadonlyContext) -> str:
|
||||
return AgentBuilderAssistant._compile_instruction_with_context(
|
||||
instruction_text, context, working_directory
|
||||
# Extract project folder name from session state
|
||||
project_folder_name = AgentBuilderAssistant._extract_project_folder_name(
|
||||
context
|
||||
)
|
||||
|
||||
# Fill the instruction template with all variables
|
||||
instruction_text = instruction_template.format(
|
||||
schema_content=schema_content,
|
||||
default_model=model_str,
|
||||
project_folder_name=project_folder_name,
|
||||
)
|
||||
return instruction_text
|
||||
|
||||
return instruction_provider
|
||||
|
||||
@staticmethod
|
||||
def _extract_project_folder_name(context: ReadonlyContext) -> str:
|
||||
"""Extract project folder name from session state using resolve_file_path."""
|
||||
from .utils.resolve_root_directory import resolve_file_path
|
||||
|
||||
session_state = context._invocation_context.session.state
|
||||
|
||||
# Use resolve_file_path to get the full resolved path for "."
|
||||
# This handles all the root_directory resolution logic consistently
|
||||
resolved_path = resolve_file_path(".", session_state)
|
||||
|
||||
# Extract the project folder name from the resolved path
|
||||
project_folder_name = resolved_path.name
|
||||
|
||||
# Fallback to "project" if we somehow get an empty name
|
||||
if not project_folder_name:
|
||||
project_folder_name = "project"
|
||||
|
||||
return project_folder_name
|
||||
|
||||
@staticmethod
|
||||
def _load_embedded_schema_instruction_template() -> str:
|
||||
"""Load instruction template for embedded ADK AgentConfig schema mode."""
|
||||
@@ -197,70 +214,3 @@ class AgentBuilderAssistant:
|
||||
|
||||
with open(template_path, "r", encoding="utf-8") as f:
|
||||
return f.read()
|
||||
|
||||
@staticmethod
|
||||
def _compile_instruction_with_context(
|
||||
instruction_text: str,
|
||||
context: ReadonlyContext,
|
||||
working_directory: Optional[str] = None,
|
||||
) -> str:
|
||||
"""Compile instruction with session context and working directory information.
|
||||
|
||||
This method enhances instructions with:
|
||||
1. Working directory information for path resolution
|
||||
2. Session-based root directory binding if available
|
||||
|
||||
Args:
|
||||
instruction_text: Base instruction text
|
||||
context: ReadonlyContext from the agent session
|
||||
working_directory: Optional working directory for path resolution
|
||||
|
||||
Returns:
|
||||
Enhanced instruction text with context information
|
||||
"""
|
||||
import os
|
||||
|
||||
# Get working directory (use provided or current working directory)
|
||||
actual_working_dir = working_directory or os.getcwd()
|
||||
|
||||
# Check for existing root directory in session state
|
||||
session_root_directory = context._invocation_context.session.state.get(
|
||||
"root_directory"
|
||||
)
|
||||
|
||||
# Compile additional context information
|
||||
context_info = f"""
|
||||
|
||||
## SESSION CONTEXT
|
||||
|
||||
**Working Directory**: `{actual_working_dir}`
|
||||
- Use this as the base directory for path resolution when calling resolve_root_directory
|
||||
- Pass this as the working_directory parameter to resolve_root_directory tool
|
||||
|
||||
"""
|
||||
|
||||
if session_root_directory:
|
||||
context_info += f"""**Established Root Directory**: `{session_root_directory}`
|
||||
- This session is bound to root directory: {session_root_directory}
|
||||
- DO NOT ask the user for root directory - use this established path
|
||||
- All agent building should happen within this root directory
|
||||
- If user wants to work in a different directory, ask them to start a new chat session
|
||||
|
||||
"""
|
||||
else:
|
||||
context_info += f"""**Root Directory**: Not yet established
|
||||
- You MUST ask the user for their desired root directory first
|
||||
- Use resolve_root_directory tool to validate the path
|
||||
- Once confirmed, this session will be bound to that root directory
|
||||
|
||||
"""
|
||||
|
||||
context_info += """**Session Binding Rules**:
|
||||
- Each chat session is bound to ONE root directory
|
||||
- Once established, work only within that root directory
|
||||
- To switch directories, user must start a new chat session
|
||||
- Always verify paths using resolve_root_directory tool before creating files
|
||||
|
||||
"""
|
||||
|
||||
return instruction_text + context_info
|
||||
|
||||
Reference in New Issue
Block a user