|
|
|
import yaml |
|
from jinja2 import Template |
|
from textwrap import dedent |
|
|
|
prompt_code_example = dedent(""" |
|
User: How the following repo has implemented Logging, and how can I make it compatible with Facebook Standard Logging? github url: https://github.com/askbudi/tinyagent |
|
|
|
function_calling: run_python |
|
run_python("task='How the following repo has implemented Logging, and how can I make it compatible with Facebook Standard Logging?'", |
|
"repo_result = code_research(repo_url='https://github.com/askbudi/tinyagent',task='How the following repo has implemented Logging, and how can I make it compatible with Facebook Standard Logging?')", |
|
"print(repo_result)", |
|
"answer_for_user_review = problem_solver(task=task,context=repo_result)", |
|
"print(answer_for_user_review)", |
|
|
|
|
|
|
|
""") |
|
|
|
prompt_qwen_helper = dedent(""" |
|
|
|
**Your learning from past mistakes** |
|
- User can't directly see the response of run_python tool, so you need to use final_answer or ask_question whenever you want to show a response to the user. |
|
Other tools calls and their responses are not visible to the user. |
|
- run_python is a capable tool, if you need to call a function with different arguments, you can do it in one take, just like you would do in a python code you developed to be executed in one cell of Jupyter Notebook Cell. |
|
""") |
|
|
|
def load_template(path: str) -> str: |
|
""" |
|
Load the YAML file and extract its 'system_prompt' field. |
|
""" |
|
with open(path, "r") as f: |
|
data = yaml.safe_load(f) |
|
return data["system_prompt"] |
|
|
|
def render_system_prompt(template_str: str, |
|
tools: dict, |
|
managed_agents: dict, |
|
authorized_imports) -> str: |
|
""" |
|
Render the Jinja2 template with the given context. |
|
""" |
|
tmpl = Template(template_str) |
|
return tmpl.render( |
|
tools=tools, |
|
managed_agents=managed_agents, |
|
authorized_imports=authorized_imports |
|
) |
|
|
|
|
|
from tinyagent import tool |
|
import asyncio |
|
from typing import Any, Dict |
|
import inspect |
|
from typing import get_type_hints |
|
|
|
def translate_tool_for_code_agent(tool_func_or_class: Any) -> Dict[str, Any]: |
|
""" |
|
Translate a tool decorated with @tool into a format compatible with code_agent.yaml. |
|
|
|
Args: |
|
tool_func_or_class: A function or class decorated with @tool |
|
|
|
Returns: |
|
A dictionary with the tool configuration in code_agent.yaml format |
|
""" |
|
def _get_type_as_string(type_hint: Any) -> str: |
|
""" |
|
Convert a type hint to its string representation. |
|
|
|
Args: |
|
type_hint: The type hint to convert |
|
|
|
Returns: |
|
String representation of the type |
|
""" |
|
if type_hint is Any: |
|
return "Any" |
|
|
|
|
|
type_map = { |
|
str: "str", |
|
int: "int", |
|
float: "float", |
|
bool: "bool", |
|
list: "List", |
|
dict: "Dict", |
|
tuple: "Tuple", |
|
None: "None" |
|
} |
|
|
|
if type_hint in type_map: |
|
return type_map[type_hint] |
|
|
|
|
|
if hasattr(type_hint, "__name__"): |
|
return type_hint.__name__ |
|
|
|
|
|
return str(type_hint).replace("typing.", "") |
|
|
|
if not hasattr(tool_func_or_class, '_tool_metadata'): |
|
raise ValueError("Tool must be decorated with @tool decorator") |
|
|
|
metadata = tool_func_or_class._tool_metadata |
|
|
|
|
|
is_async = asyncio.iscoroutinefunction(tool_func_or_class) |
|
if metadata["is_class"] and hasattr(tool_func_or_class, "__call__"): |
|
is_async = asyncio.iscoroutinefunction(tool_func_or_class.__call__) |
|
|
|
|
|
if metadata["is_class"]: |
|
func_to_inspect = tool_func_or_class.__init__ |
|
else: |
|
func_to_inspect = tool_func_or_class |
|
|
|
sig = inspect.signature(func_to_inspect) |
|
type_hints = get_type_hints(func_to_inspect) |
|
|
|
|
|
inputs = {} |
|
for name, param in sig.parameters.items(): |
|
if name in ['self', 'cls']: |
|
continue |
|
|
|
param_type = type_hints.get(name, Any) |
|
param_type_str = _get_type_as_string(param_type) |
|
|
|
|
|
param_desc = "" |
|
if metadata["schema"] and "properties" in metadata["schema"]: |
|
if name in metadata["schema"]["properties"]: |
|
param_desc = metadata["schema"]["properties"][name].get("description", "") |
|
|
|
inputs[name] = { |
|
"type": param_type_str, |
|
"description": param_desc |
|
} |
|
|
|
|
|
output_type = "Any" |
|
if "return" in type_hints: |
|
output_type = _get_type_as_string(type_hints["return"]) |
|
|
|
|
|
tool_config = { |
|
"name": metadata["name"], |
|
"description": metadata["description"], |
|
"inputs": inputs, |
|
"output_type": output_type, |
|
"is_async": is_async |
|
} |
|
|
|
return tool_config |
|
|
|
|
|
|
|
|
|
|