feat: implement conversational AI agent with tool-calling

Prototype implementation that allows:
1. Normal conversation with the AI
2. Tool-calling to update trading strategies

Created new ConversationalAgent that uses CrewAI with tools:
- get_current_strategy: Check current bot strategy
- update_trading_strategy: Update bot's trading configuration

The agent can now respond to questions like 'What is this?' without
forcing JSON output, and can update strategies when user provides
specific parameters.

Refs #51
This commit is contained in:
shokollm
2026-04-10 05:00:22 +00:00
parent 21ce282cae
commit 765e390b9b
2 changed files with 197 additions and 53 deletions

View File

@@ -16,6 +16,7 @@ from ..db.schemas import (
)
from ..db.models import Bot, BotConversation, User
from ..services.ai_agent.crew import get_trading_crew
from ..services.ai_agent.conversational import get_conversational_agent
router = APIRouter()
MAX_BOTS_PER_USER = 3
@@ -183,69 +184,45 @@ def chat(
.order_by(BotConversation.created_at)
.all()
)
history_for_crew = [
history_for_agent = [
{"role": conv.role, "content": conv.content}
for conv in conversation_history[-10:]
]
user_message = request.message
if request.strategy_config:
crew = get_trading_crew()
result = crew.chat(user_message, history_for_crew)
# Use ConversationalAgent for natural chat with tool-calling
agent = get_conversational_agent(bot_id=bot_id)
result = agent.chat(user_message, history_for_agent)
assistant_content = result.get("response", "I couldn't process your request.")
if result.get("success") and result.get("strategy_config"):
bot.strategy_config = result["strategy_config"]
db.commit()
assistant_content = result.get("response", "I couldn't process your request.")
db_conversation = BotConversation(
bot_id=bot_id,
role="user",
content=user_message,
)
db.add(db_conversation)
# Save conversation
db_conversation = BotConversation(
bot_id=bot_id,
role="user",
content=user_message,
)
db.add(db_conversation)
db_assistant = BotConversation(
bot_id=bot_id,
role="assistant",
content=assistant_content,
)
db.add(db_assistant)
db.commit()
db.refresh(db_assistant)
db_assistant = BotConversation(
bot_id=bot_id,
role="assistant",
content=assistant_content,
)
db.add(db_assistant)
db.commit()
db.refresh(db_assistant)
return BotChatResponse(
response=assistant_content,
strategy_config=result.get("strategy_config"),
success=result.get("success", False),
)
else:
crew = get_trading_crew()
result = crew.chat(user_message, history_for_crew)
# If strategy was updated via tool, refresh bot data
if result.get("strategy_updated"):
db.refresh(bot)
assistant_content = result.get("response", "I couldn't process your request.")
db_conversation = BotConversation(
bot_id=bot_id,
role="user",
content=user_message,
)
db.add(db_conversation)
db_assistant = BotConversation(
bot_id=bot_id,
role="assistant",
content=assistant_content,
)
db.add(db_assistant)
db.commit()
db.refresh(db_assistant)
return BotChatResponse(
response=assistant_content,
strategy_config=result.get("strategy_config"),
success=result.get("success", False),
)
return BotChatResponse(
response=assistant_content,
strategy_config=bot.strategy_config if result.get("strategy_updated") else None,
success=result.get("success", False),
)
@router.get("/{bot_id}/history", response_model=List[BotConversationResponse])