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
}