diff --git a/pyproject.toml b/pyproject.toml index dde69b81..e4df3a86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,7 +65,7 @@ dev = [ "syrupy>=4.9.1", "types-requests>=2.32.4.20241230", ] -agno = ["agno>=1.2.6", "sqlalchemy>=2.0.40"] +agno = ["agno>=2.2.1", "sqlalchemy>=2.0.40"] google = ["google-genai>=1.8.0"] [project.urls] @@ -289,4 +289,4 @@ markers = [ skip = '.git*,*.svg,*.lock,*.min.*' check-hidden = true # ignore-regex = '' -# ignore-words-list = '' \ No newline at end of file +# ignore-words-list = '' diff --git a/scripts/agno_agent.py b/scripts/agno_agent.py index 5c8e50a4..53473fd2 100644 --- a/scripts/agno_agent.py +++ b/scripts/agno_agent.py @@ -1,7 +1,6 @@ from agno.models.anthropic.claude import Claude from agno.models.google.gemini import Gemini -from agno.playground.playground import Playground -from agno.playground.serve import serve_playground_app +from agno.os import AgentOS from sensai.util import logging from sensai.util.helper import mark_used @@ -9,16 +8,26 @@ from serena.agno import SerenaAgnoAgentProvider mark_used(Gemini, Claude) -# initialize logging (Note: since this module is reimported by serve_playground_app and the logging configuration -# is extended by SerenaAgentProvider, we must handle this here conditionally) +# initialize logging if __name__ == "__main__": logging.configure(level=logging.INFO) # Define the model to use (see Agno documentation for supported models; these are just examples) # model = Claude(id="claude-3-7-sonnet-20250219") -model = Gemini(id="gemini-2.5-pro-exp-03-25") +model = Gemini(id="gemini-2.5-pro") -app = Playground(agents=[SerenaAgnoAgentProvider.get_agent(model)]).get_app() +# Create the Serena agent using the existing provider +serena_agent = SerenaAgnoAgentProvider.get_agent(model) + +# Create AgentOS app with the Serena agent +agent_os = AgentOS( + description="Serena coding assistant powered by AgentOS", + id="serena-agentos", + agents=[serena_agent], +) + +app = agent_os.get_app() if __name__ == "__main__": - serve_playground_app("agno_agent:app", reload=False, log_config=None) + # Start the AgentOS server + agent_os.serve(app="agno_agent:app", reload=False) diff --git a/src/serena/agno.py b/src/serena/agno.py index 07ab7371..253c4a49 100644 --- a/src/serena/agno.py +++ b/src/serena/agno.py @@ -6,9 +6,9 @@ from pathlib import Path from typing import Any from agno.agent import Agent -from agno.memory import AgentMemory +from agno.db.sqlite import SqliteDb +from agno.memory import MemoryManager from agno.models.base import Model -from agno.storage.sqlite import SqliteStorage from agno.tools.function import Function from agno.tools.toolkit import Toolkit from dotenv import load_dotenv @@ -111,10 +111,9 @@ class SerenaAgnoAgentProvider: raise # Even though we don't want to keep history between sessions, - # for agno-ui to work as a conversation, we use a persistent storage on disk. - # This storage should be deleted between sessions. + # for agno-ui to work as a conversation, we use a persistent database on disk. + # This database 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 = (Path("temp") / "agno_agent_storage.db").absolute() sql_db_path.parent.mkdir(exist_ok=True) # delete the db file if it exists @@ -125,19 +124,18 @@ class SerenaAgnoAgentProvider: agno_agent = Agent( name="Serena", model=model, - # See explanation above on why storage is needed - storage=SqliteStorage(table_name="serena_agent_sessions", db_file=str(sql_db_path)), + # See explanation above on why database is needed + db=SqliteDb(db_file=str(sql_db_path)), description="A fully-featured coding assistant", tools=[SerenaAgnoToolkit(serena_agent)], - # The tool calls will be shown in the UI anyway since whether to show them is configurable per tool + # Tool calls will be shown in the UI since that's 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.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) + memory_manager=MemoryManager(), + add_history_to_context=True, + num_history_runs=100, # you might want to adjust this (expense vs. history awareness) ) cls._agent = agno_agent log.info(f"Agent instantiated: {agno_agent}")