diff --git a/apps/server/models/run_log.py b/apps/server/models/run_log.py index b11d02843..0384f3ac9 100644 --- a/apps/server/models/run_log.py +++ b/apps/server/models/run_log.py @@ -1,9 +1,11 @@ from __future__ import annotations import uuid +from datetime import datetime from typing import Dict -from sqlalchemy import UUID, Boolean, Column, ForeignKey, String +from sqlalchemy import (UUID, Boolean, Column, DateTime, ForeignKey, Integer, + String) from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import Session, relationship from sqlalchemy.sql import or_ @@ -32,6 +34,11 @@ class RunLogModel(BaseModel): type = Column(String) # LLM, Tool messages = Column(JSONB) + start_date = Column(DateTime(timezone=True), default=datetime.utcnow) + end_date = Column(DateTime(timezone=True)) + + toolkit_id = Column(UUID, nullable=True) + run_id = Column( UUID, ForeignKey("run.id", ondelete="CASCADE"), nullable=True, index=True ) @@ -131,6 +138,7 @@ def add_message_to_latest_run_log( new_messages = list(old_run_log.messages) if old_run_log.messages else [] new_messages.append(message) + old_run_log.end_date = datetime.utcnow() old_run_log.messages = new_messages old_run_log.modified_by = user_id diff --git a/apps/server/services/run_log.py b/apps/server/services/run_log.py index 9d0c3c1ca..921c7e5b4 100644 --- a/apps/server/services/run_log.py +++ b/apps/server/services/run_log.py @@ -7,6 +7,7 @@ from sqlalchemy.orm import Session from models.run_log import RunLogModel +from tools.get_tools import get_toolkit_id_by_tool_name from typings.run import RunLogInput, RunLogType @@ -42,7 +43,11 @@ def get_tool_callback_handler(self) -> BaseCallbackHandler: return callback_handler def create_run_log( - self, type: RunLogType, name: Optional[str] = "", messages: Optional[Dict] = [] + self, + type: RunLogType, + name: Optional[str] = "", + messages: Optional[Dict] = [], + toolkit_id: Optional[UUID] = None, ): return RunLogModel.create_run_log( self.session, @@ -54,6 +59,7 @@ def create_run_log( name=name, type=str(type), messages=messages, + toolkit_id=toolkit_id, ), self.user_id, self.account_id, @@ -70,6 +76,8 @@ def create_llm_run_log(self, messages: List[BaseMessage]): { "name": message_mapping[message.type], "content": message.content, + "additional_kwargs": message.additional_kwargs, + "is_chat_history": message.additional_kwargs.get("uuid") is not None, } for message in messages ] @@ -86,7 +94,14 @@ def create_tool_run_log(self, name: str, input: str): } ] - return self.create_run_log(type=RunLogType.TOOL, name=name, messages=messages) + toolkit_id = get_toolkit_id_by_tool_name(name) + + return self.create_run_log( + type=RunLogType.TOOL, + name=name, + messages=messages, + toolkit_id=UUID(toolkit_id), + ) def add_message_to_run_log(self, type: RunLogType, name: str, content: str): return RunLogModel.add_message_to_latest_run_log( diff --git a/apps/server/tools/get_tools.py b/apps/server/tools/get_tools.py index 69ba277ed..d8589ea2b 100644 --- a/apps/server/tools/get_tools.py +++ b/apps/server/tools/get_tools.py @@ -80,6 +80,15 @@ def get_all_tools(): return result +def get_toolkit_id_by_tool_name(tool_name: str) -> str | None: + toolkits = get_all_tools() + + for toolkit in toolkits: + for tool in toolkit["tools"]: + if tool["name"] == tool_name: + return toolkit["toolkit_id"] + + def get_agent_tools( toolkit_ids: List[str], db, account, settings, agent_with_configs, callback_handler ) -> List[BaseTool]: diff --git a/apps/server/typings/run.py b/apps/server/typings/run.py index 44d8e7e97..0eb834ea1 100644 --- a/apps/server/typings/run.py +++ b/apps/server/typings/run.py @@ -28,10 +28,20 @@ class RunLogInput(BaseModel): session_id: Optional[str] name: Optional[str] messages: Optional[List[Dict]] + toolkit_id: Optional[UUID4] + + +class RunLogMessageOutput(BaseModel): + name: str + content: str + is_chat_history: Optional[bool] class RunLogOutput(BaseModel): id: UUID4 name: str type: str - messages: Optional[List[Dict]] + messages: Optional[List[RunLogMessageOutput]] + start_date: Optional[str] + end_date: Optional[str] + toolkit_id: Optional[UUID4] diff --git a/apps/ui/src/gql/ai/run/runLogs.gql b/apps/ui/src/gql/ai/run/runLogs.gql index 212734572..14c754350 100644 --- a/apps/ui/src/gql/ai/run/runLogs.gql +++ b/apps/ui/src/gql/ai/run/runLogs.gql @@ -7,7 +7,11 @@ query runLogs($run_id: run_id!) @api(name: "ai") { messages { name content + is_chat_history } + start_date + end_date created_on + toolkit_id } } diff --git a/apps/ui/src/modals/RunLogsModal/RunLogs/RunLogMessages/RunLogMessages.tsx b/apps/ui/src/modals/RunLogsModal/RunLogs/RunLogMessages/RunLogMessages.tsx new file mode 100644 index 000000000..52b91f1ba --- /dev/null +++ b/apps/ui/src/modals/RunLogsModal/RunLogs/RunLogMessages/RunLogMessages.tsx @@ -0,0 +1,70 @@ +import styled from 'styled-components' +import { RunLog } from 'types' + +type RunLogMessagesProps = { + log: RunLog +} + +const RunLogMessages = ({ log }: RunLogMessagesProps) => { + const { messages } = log + + return ( + + {messages.map(({ name, content, is_chat_history }, index: number) => { + // TODO: use is_chat_history to render chat history in collapse + return ( + + {name} + + {content && ( + + {content} + + )} + + ) + })} + + ) +} + +export default RunLogMessages + +const StyledCards = styled.div` + display: flex; + flex-direction: column; + align-items: stretch; + width: 100%; + gap: 20px; +` + +const StyledCard = styled.div` + border-radius: 10px; + padding: 20px; + width: 100%; + background: #fff; + color: #000; +` + +const StyledTitle = styled.h2` + margin: 0; + padding: 0; + font-size: 18px; + color: #000; +` + +const StyledCodeCard = styled.div` + margin-top: 15px; + padding: 16px; + background-color: #f1f1f1; + border-radius: 10px; +` + +const StyledCodeContent = styled.pre` + margin: 0; + padding: 0; + font-family: monospace; + white-space: pre-wrap; + font-size: 12px; + color: #000; +` diff --git a/apps/ui/src/modals/RunLogsModal/RunLogs/RunLogMessages/index.tsx b/apps/ui/src/modals/RunLogsModal/RunLogs/RunLogMessages/index.tsx new file mode 100644 index 000000000..2e1e44dc1 --- /dev/null +++ b/apps/ui/src/modals/RunLogsModal/RunLogs/RunLogMessages/index.tsx @@ -0,0 +1 @@ +export { default } from './RunLogMessages' diff --git a/apps/ui/src/modals/RunLogsModal/RunLogs/RunLogs.tsx b/apps/ui/src/modals/RunLogsModal/RunLogs/RunLogs.tsx index 88aa123ad..25ad72a88 100644 --- a/apps/ui/src/modals/RunLogsModal/RunLogs/RunLogs.tsx +++ b/apps/ui/src/modals/RunLogsModal/RunLogs/RunLogs.tsx @@ -7,6 +7,7 @@ import TabPanels from '@l3-lib/ui-core/dist/TabPanels' import TabsContext from '@l3-lib/ui-core/dist/TabsContext' import { useState } from 'react' import { StyledFormTabList, StyledFormTabsWrapper } from 'pages/Agents/AgentForm/AgentForm' +import RunLogMessages from './RunLogMessages' type RunLogsProps = { runId: string @@ -43,23 +44,9 @@ const RunLogs = ({ runId }: RunLogsProps) => { - {data.map(({ messages }, index) => ( + {data.map((log, index) => ( - - {messages.map(({ name, content }, index: number) => { - return ( - - {name} - - {content && ( - - {content} - - )} - - ) - })} - + ))} @@ -78,14 +65,6 @@ const StyledWrapper = styled.div` overflow-y: scroll; ` -const StyledCards = styled.div` - display: flex; - flex-direction: column; - align-items: stretch; - width: 100%; - gap: 20px; -` - const StyledLoaderWrapper = styled.div` position: absolute; width: 40px; @@ -96,34 +75,3 @@ const StyledLoaderWrapper = styled.div` margin-bottom: 20px; margin-left: 5px; ` - -const StyledLogCard = styled.div` - border-radius: 10px; - padding: 20px; - width: 100%; - background: #fff; - color: #000; -` - -const StyledLogTitle = styled.h2` - margin: 0; - padding: 0; - font-size: 18px; - color: #000; -` - -const StyledCodeCard = styled.div` - margin-top: 15px; - padding: 16px; - background-color: #f1f1f1; - border-radius: 10px; -` - -const StyledCodeContent = styled.pre` - margin: 0; - padding: 0; - font-family: monospace; - white-space: pre-wrap; - font-size: 12px; - color: #000; -` diff --git a/apps/ui/src/types/run.ts b/apps/ui/src/types/run.ts index 6101b14d4..4344cd94f 100644 --- a/apps/ui/src/types/run.ts +++ b/apps/ui/src/types/run.ts @@ -1,3 +1,5 @@ +import { Nullable } from './utils' + export interface RunLog { id: string name: string @@ -5,6 +7,10 @@ export interface RunLog { messages: { name: string content: string + is_chat_history: Nullable }[] created_on: string + start_date: Nullable + end_date: Nullable + toolkit_id: Nullable }