diff --git a/apps/rowboat/app/api/v1/[projectId]/chat/route.ts b/apps/rowboat/app/api/v1/[projectId]/chat/route.ts index 9671ab1c..7d350b84 100644 --- a/apps/rowboat/app/api/v1/[projectId]/chat/route.ts +++ b/apps/rowboat/app/api/v1/[projectId]/chat/route.ts @@ -96,8 +96,8 @@ export async function POST( prompts, startAgent, testProfile: testProfile ?? undefined, - mcpServers: project.mcpServers ?? undefined, - toolWebhookUrl: project.webhookUrl ?? undefined, + mcpServers: project.mcpServers ?? [], + toolWebhookUrl: project.webhookUrl ?? '', }; const { messages: agenticMessages, state } = await getAgenticApiResponse(request); diff --git a/apps/rowboat/app/api/widget/v1/chats/[chatId]/turn/route.ts b/apps/rowboat/app/api/widget/v1/chats/[chatId]/turn/route.ts index 8d136e58..d5d2c1bf 100644 --- a/apps/rowboat/app/api/widget/v1/chats/[chatId]/turn/route.ts +++ b/apps/rowboat/app/api/widget/v1/chats/[chatId]/turn/route.ts @@ -102,8 +102,8 @@ export async function POST( tools, prompts, startAgent, - mcpServers: projectSettings.mcpServers ?? undefined, - toolWebhookUrl: projectSettings.webhookUrl ?? undefined, + mcpServers: projectSettings.mcpServers ?? [], + toolWebhookUrl: projectSettings.webhookUrl ?? '', testProfile: undefined, }; logger.log(`Sending agentic request`); diff --git a/apps/rowboat/app/lib/types/agents_api_types.ts b/apps/rowboat/app/lib/types/agents_api_types.ts index c4d111ec..4b1d3243 100644 --- a/apps/rowboat/app/lib/types/agents_api_types.ts +++ b/apps/rowboat/app/lib/types/agents_api_types.ts @@ -55,8 +55,8 @@ export const AgenticAPIChatRequest = z.object({ prompts: z.array(WorkflowPrompt), startAgent: z.string(), testProfile: TestProfile.optional(), - mcpServers: z.array(MCPServer).optional(), - toolWebhookUrl: z.string().optional(), + mcpServers: z.array(MCPServer), + toolWebhookUrl: z.string(), }); export const AgenticAPIChatResponse = z.object({ diff --git a/apps/rowboat_agents/src/app/main.py b/apps/rowboat_agents/src/app/main.py index 6d6d501d..b555f8b5 100644 --- a/apps/rowboat_agents/src/app/main.py +++ b/apps/rowboat_agents/src/app/main.py @@ -1,3 +1,4 @@ +import traceback from quart import Quart, request, jsonify, Response from datetime import datetime from functools import wraps @@ -18,6 +19,7 @@ from pprint import pprint logger = common_logger redis_client = redis.from_url(os.environ.get('REDIS_URL', 'redis://localhost:6379')) app = Quart(__name__) +config = read_json_from_file("./configs/default_config.json") # filter out agent transfer messages using a function def is_agent_transfer_message(msg): @@ -64,7 +66,7 @@ async def chat(): logger.info(f"{'*'*100}Running server mode{'*'*100}") try: request_data = await request.get_json() - config = read_json_from_file("./configs/default_config.json") + print("Request:", json.dumps(request_data)) # filter out agent transfer messages input_messages = [msg for msg in request_data["messages"] if not is_agent_transfer_message(msg)] @@ -82,11 +84,12 @@ async def chat(): elif not msg.get("role"): msg["role"] = "user" - print("Request:") - pprint(request_data) - data = request_data - resp_messages, resp_tokens_used, resp_state = await run_turn( + messages = [] + final_state = {} + # tokens_used = 0 + + async for event_type, event_data in run_turn_streamed( messages=input_messages, start_agent_name=data.get("startAgent", ""), agent_configs=data.get("agents", []), @@ -95,16 +98,16 @@ async def chat(): state=data.get("state", {}), additional_tool_configs=[RAG_TOOL, CLOSE_CHAT_TOOL], complete_request=data - ) - - logger.info('-'*100) - logger.info('Raw output:') - logger.info((resp_messages, resp_tokens_used, resp_state)) + ): + if event_type == 'message': + messages.append(event_data) + elif event_type == 'done': + final_state = event_data['state'] + # tokens_used = event_data["tokens_used"] out = { - "messages": resp_messages, - "tokens_used": resp_tokens_used, - "state": resp_state, + "messages": messages, + "state": final_state, } logger.info("Output:") @@ -115,7 +118,8 @@ async def chat(): return jsonify(out) except Exception as e: - logger.error(f"Error: {e}") + print(traceback.format_exc()) + logger.error(f"Error: {str(e)}") return jsonify({"error": str(e)}), 500 @app.route("/chat_stream_init", methods=["POST"]) @@ -144,8 +148,8 @@ async def chat_stream(stream_id): if not request_data: return jsonify({"error": "Stream not found"}), 404 + print("Request:", request_data.decode('utf-8')) request_data = json.loads(request_data) - config = read_json_from_file("./configs/default_config.json") # filter out agent transfer messages input_messages = [msg for msg in request_data["messages"] if not is_agent_transfer_message(msg)] @@ -163,9 +167,6 @@ async def chat_stream(stream_id): elif not msg.get("role"): msg["role"] = "user" - print("Request:") - pprint(request_data) - async def generate(): try: async for event_type, event_data in run_turn_streamed( diff --git a/apps/rowboat_agents/src/graph/core.py b/apps/rowboat_agents/src/graph/core.py index 1cb8171a..9d81e69e 100644 --- a/apps/rowboat_agents/src/graph/core.py +++ b/apps/rowboat_agents/src/graph/core.py @@ -1,3 +1,4 @@ +import traceback from copy import deepcopy from datetime import datetime import json @@ -394,7 +395,6 @@ async def run_turn_streamed( yield ('done', {'state': final_state}) except Exception as e: - import traceback print(traceback.format_exc()) print(f"Error in stream processing: {str(e)}") yield ('error', {'error': str(e), 'state': final_state}) # Include final_state in error response \ No newline at end of file diff --git a/apps/rowboat_agents/src/utils/common.py b/apps/rowboat_agents/src/utils/common.py index 57c1c58c..eab6e558 100644 --- a/apps/rowboat_agents/src/utils/common.py +++ b/apps/rowboat_agents/src/utils/common.py @@ -9,15 +9,12 @@ from openai import OpenAI load_dotenv() -def setup_logger(name, log_file='./run.log', level=logging.INFO, log_to_file=True): +def setup_logger(name, log_file='./run.log', level=logging.INFO, log_to_file=False): """Function to set up a logger with a specific name and log file.""" formatter = logging.Formatter('%(asctime)s %(levelname)s [%(filename)s:%(lineno)d] %(message)s') - if log_to_file: - handler = logging.FileHandler(log_file) - else: - handler = logging.StreamHandler(sys.stdout) - + # Changed to use stderr instead of stdout + handler = logging.StreamHandler(sys.stderr) handler.setFormatter(formatter) # Create a logger and set its level