Skip to content

Commit cf24a7c

Browse files
author
Davidson Gomes
committed
feat(api): integrate new AI engines and update chat routes for dynamic agent handling
1 parent 9f176bf commit cf24a7c

22 files changed

+2153
-37
lines changed

pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ dependencies = [
5151
"langgraph==0.4.1",
5252
"opentelemetry-sdk==1.33.0",
5353
"opentelemetry-exporter-otlp==1.33.0",
54+
"mcp==1.9.0",
55+
"crewai==0.120.1",
56+
"crewai-tools==0.45.0",
5457
]
5558

5659
[project.optional-dependencies]

src/api/chat_routes.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
Header,
4040
)
4141
from sqlalchemy.orm import Session
42+
from src.config.settings import settings
4243
from src.config.database import get_db
4344
from src.core.jwt_middleware import (
4445
get_jwt_token,
@@ -49,7 +50,8 @@
4950
agent_service,
5051
)
5152
from src.schemas.chat import ChatRequest, ChatResponse, ErrorResponse, FileData
52-
from src.services.agent_runner import run_agent, run_agent_stream
53+
from src.services.adk.agent_runner import run_agent as run_agent_adk, run_agent_stream
54+
from src.services.crewai.agent_runner import run_agent as run_agent_crewai
5355
from src.core.exceptions import AgentNotFoundError
5456
from src.services.service_providers import (
5557
session_service,
@@ -262,7 +264,7 @@ async def websocket_chat(
262264

263265

264266
@router.post(
265-
"",
267+
"/{agent_id}/{external_id}",
266268
response_model=ChatResponse,
267269
responses={
268270
400: {"model": ErrorResponse},
@@ -272,20 +274,32 @@ async def websocket_chat(
272274
)
273275
async def chat(
274276
request: ChatRequest,
277+
agent_id: str,
278+
external_id: str,
275279
_=Depends(get_agent_by_api_key),
276280
db: Session = Depends(get_db),
277281
):
278282
try:
279-
final_response = await run_agent(
280-
request.agent_id,
281-
request.external_id,
282-
request.message,
283-
session_service,
284-
artifacts_service,
285-
memory_service,
286-
db,
287-
files=request.files,
288-
)
283+
if settings.AI_ENGINE == "adk":
284+
final_response = await run_agent_adk(
285+
agent_id,
286+
external_id,
287+
request.message,
288+
session_service,
289+
artifacts_service,
290+
memory_service,
291+
db,
292+
files=request.files,
293+
)
294+
elif settings.AI_ENGINE == "crewai":
295+
final_response = await run_agent_crewai(
296+
agent_id,
297+
external_id,
298+
request.message,
299+
session_service,
300+
db,
301+
files=request.files,
302+
)
289303

290304
return {
291305
"response": final_response["final_response"],

src/config/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from src.config.settings import settings
2+
3+
__all__ = ["settings"]

src/config/settings.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ class Settings(BaseSettings):
5757
"POSTGRES_CONNECTION_STRING", "postgresql://postgres:root@localhost:5432/evo_ai"
5858
)
5959

60+
# AI engine settings
61+
AI_ENGINE: str = os.getenv("AI_ENGINE", "adk")
62+
6063
# Logging settings
6164
LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO")
6265
LOG_DIR: str = "logs"
@@ -83,11 +86,11 @@ class Settings(BaseSettings):
8386

8487
# Email provider settings
8588
EMAIL_PROVIDER: str = os.getenv("EMAIL_PROVIDER", "sendgrid")
86-
89+
8790
# SendGrid settings
8891
SENDGRID_API_KEY: str = os.getenv("SENDGRID_API_KEY", "")
8992
EMAIL_FROM: str = os.getenv("EMAIL_FROM", "[email protected]")
90-
93+
9194
# SMTP settings
9295
SMTP_HOST: str = os.getenv("SMTP_HOST", "")
9396
SMTP_PORT: int = int(os.getenv("SMTP_PORT", 587))
@@ -96,7 +99,7 @@ class Settings(BaseSettings):
9699
SMTP_USE_TLS: bool = os.getenv("SMTP_USE_TLS", "true").lower() == "true"
97100
SMTP_USE_SSL: bool = os.getenv("SMTP_USE_SSL", "false").lower() == "true"
98101
SMTP_FROM: str = os.getenv("SMTP_FROM", "")
99-
102+
100103
APP_URL: str = os.getenv("APP_URL", "http://localhost:8000")
101104

102105
# Server settings

src/schemas/chat.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ class FileData(BaseModel):
4343
class ChatRequest(BaseModel):
4444
"""Model to represent a chat request."""
4545

46-
agent_id: str = Field(..., description="Agent ID to process the message")
47-
external_id: str = Field(..., description="External ID for user identification")
4846
message: str = Field(..., description="User message to the agent")
47+
agent_id: Optional[str] = Field(None, description="Agent ID to process the message")
48+
external_id: Optional[str] = Field(
49+
None, description="External ID for user identification"
50+
)
4951
files: Optional[List[FileData]] = Field(
5052
None, description="List of files attached to the message"
5153
)

src/services/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from .agent_runner import run_agent
1+
from .adk.agent_runner import run_agent

src/services/a2a_task_manager.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
)
4646
from src.services.mcp_server_service import get_mcp_server
4747

48-
from src.services.agent_runner import run_agent, run_agent_stream
48+
from src.services.adk.agent_runner import run_agent, run_agent_stream
4949
from src.services.service_providers import (
5050
session_service,
5151
artifacts_service,
@@ -388,7 +388,6 @@ async def _stream_task_process(
388388
self, request: SendTaskStreamingRequest, agent: Agent
389389
) -> AsyncIterable[SendTaskStreamingResponse]:
390390
"""Processes a task in streaming mode using the specified agent."""
391-
# Extrair e processar arquivos da mesma forma que no método _process_task
392391
query = self._extract_user_query(request.params)
393392

394393
try:
@@ -448,21 +447,19 @@ async def _stream_task_process(
448447
),
449448
)
450449

451-
# Use os arquivos processados do _extract_user_query
452450
files = getattr(self, "_last_processed_files", None)
453451

454-
# Log sobre os arquivos processados
455452
if files:
456453
logger.info(
457-
f"Streaming: Passando {len(files)} arquivos processados para run_agent_stream"
454+
f"Streaming: Uploading {len(files)} files to run_agent_stream"
458455
)
459456
for file_info in files:
460457
logger.info(
461-
f"Streaming: Arquivo sendo enviado: {file_info.filename} ({file_info.content_type})"
458+
f"Streaming: File being sent: {file_info.filename} ({file_info.content_type})"
462459
)
463460
else:
464461
logger.warning(
465-
"Streaming: Nenhum arquivo processado disponível para enviar ao agente"
462+
"Streaming: No processed files available to send to the agent"
466463
)
467464

468465
async for chunk in run_agent_stream(
@@ -473,7 +470,7 @@ async def _stream_task_process(
473470
artifacts_service=artifacts_service,
474471
memory_service=memory_service,
475472
db=self.db,
476-
files=files, # Passar os arquivos processados para o streaming
473+
files=files,
477474
):
478475
try:
479476
chunk_data = json.loads(chunk)
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@
3636
from src.utils.logger import setup_logger
3737
from src.core.exceptions import AgentNotFoundError
3838
from src.services.agent_service import get_agent
39-
from src.services.custom_tools import CustomToolBuilder
40-
from src.services.mcp_service import MCPService
41-
from src.services.custom_agents.a2a_agent import A2ACustomAgent
42-
from src.services.custom_agents.workflow_agent import WorkflowAgent
43-
from src.services.custom_agents.task_agent import TaskAgent
39+
from src.services.adk.custom_tools import CustomToolBuilder
40+
from src.services.adk.mcp_service import MCPService
41+
from src.services.adk.custom_agents.a2a_agent import A2ACustomAgent
42+
from src.services.adk.custom_agents.workflow_agent import WorkflowAgent
43+
from src.services.adk.custom_agents.task_agent import TaskAgent
4444
from src.services.apikey_service import get_decrypted_api_key
4545
from sqlalchemy.orm import Session
4646
from contextlib import AsyncExitStack
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
from src.utils.logger import setup_logger
3636
from src.core.exceptions import AgentNotFoundError, InternalServerError
3737
from src.services.agent_service import get_agent
38-
from src.services.agent_builder import AgentBuilder
38+
from src.services.adk.agent_builder import AgentBuilder
3939
from sqlalchemy.orm import Session
4040
from typing import Optional, AsyncGenerator
4141
import asyncio

0 commit comments

Comments
 (0)