diff --git a/scripts/agno_agent.py b/scripts/agno_agent.py index 3b7e48c1..612ad1ea 100644 --- a/scripts/agno_agent.py +++ b/scripts/agno_agent.py @@ -1,6 +1,7 @@ import os from logging import Logger +import click from agno.agent.agent import Agent from agno.memory.agent import AgentMemory from agno.models.anthropic.claude import Claude @@ -9,6 +10,7 @@ from agno.playground.playground import Playground from agno.playground.serve import serve_playground_app from agno.storage.sqlite import SqliteStorage from dotenv import load_dotenv +from fastapi import FastAPI from sensai.util import logging from sensai.util.helper import mark_used @@ -22,41 +24,52 @@ Logger.root.setLevel(logging.INFO) load_dotenv() -project_file_path = "../myproject.yml" -serena_agent = SerenaAgent(project_file_path, start_language_server=True) - -# Even though we don't want to keep history between sessions, -# for the agno ui to work as a conversation, we a persistent storage on disk -# This storage should be deleted between sessions. -# Note that this might collide with custom options for the agent, like adding vector-search based tools. -# See here for an explanation: https://www.reddit.com/r/agno/comments/1jk6qea/regarding_the_built_in_memory/ -sql_db_path = os.path.join("tmp", "agent_storage.db") -os.makedirs(os.path.dirname(sql_db_path), exist_ok=True) -# delete the db file if it exists -if os.path.exists(sql_db_path): - os.remove(sql_db_path) - -model = Claude(id="claude-3-7-sonnet-20250219") -# model = Gemini(id="gemini-2.5-pro-exp-03-25") - -agno_agent = Agent( - name="Serena", - model=model, - storage=SqliteStorage(table_name="serena_agent_sessions", db_file=sql_db_path), - description="A fully-featured coding assistant", - tools=[SerenaAgnoToolkit(serena_agent)], # type: ignore - show_tool_calls=False, - markdown=True, - system_message=serena_agent.prompt_factory.create_system_prompt(), - read_tool_call_history=False, - telemetry=False, - memory=AgentMemory(), - add_history_to_messages=True, - num_history_responses=100, # you might want to adjust this (expense vs. history awareness) -) - # The app object must be in the module scope so that the server can access it for hot reloading -app = Playground(agents=[agno_agent]).get_app() +app: FastAPI | None = None + + +@click.command() +@click.option("--project-file", default="../myproject.yml", help="Path to the project configuration YAML file") +def main(project_file): + global app # noqa: PLW0603 + serena_agent = SerenaAgent(project_file, start_language_server=True) + + # Even though we don't want to keep history between sessions, + # for the agno ui to work as a conversation, we a persistent storage on disk + # This storage should be deleted between sessions. + # Note that this might collide with custom options for the agent, like adding vector-search based tools. + # See here for an explanation: https://www.reddit.com/r/agno/comments/1jk6qea/regarding_the_built_in_memory/ + sql_db_path = os.path.join("tmp", "agent_storage.db") + os.makedirs(os.path.dirname(sql_db_path), exist_ok=True) + # delete the db file if it exists + if os.path.exists(sql_db_path): + os.remove(sql_db_path) + + model = Claude(id="claude-3-7-sonnet-20250219") + # Or use any other model supported by agno, e.g. the newest Gemini: + # model = Gemini(id="gemini-2.5-pro-exp-03-25") + + agno_agent = Agent( + name="Serena", + model=model, + # See explanation above on why storage is needed + storage=SqliteStorage(table_name="serena_agent_sessions", db_file=sql_db_path), + description="A fully-featured coding assistant", + tools=[SerenaAgnoToolkit(serena_agent)], # type: ignore + # The tool calls will be shown in the UI anyway since whether to show them is configurable per tool + # To see detailed logs, you should use the serena logger (configure it in the project file path) + show_tool_calls=False, + markdown=True, + system_message=serena_agent.prompt_factory.create_system_prompt(), + telemetry=False, + memory=AgentMemory(), + add_history_to_messages=True, + num_history_responses=100, # you might want to adjust this (expense vs. history awareness) + ) + + app = Playground(agents=[agno_agent]).get_app() + serve_playground_app("agno_agent:app", reload=False) + if __name__ == "__main__": - serve_playground_app("agno_agent:app", reload=False) + main()