diff --git a/src/openclaw/admin.py b/src/openclaw/admin.py new file mode 100644 index 0000000..5b24f69 --- /dev/null +++ b/src/openclaw/admin.py @@ -0,0 +1,67 @@ +from django.contrib import admin +from openclaw.models import Session, Message, ToolCall + + +class MessageInline(admin.TabularInline): + model = Message + extra = 0 + fields = ("seq", "role", "content_text", "timestamp") + readonly_fields = ("seq", "role", "content_text", "timestamp") + + def has_add_permission(self, request, obj=None): + return False + + def has_delete_permission(self, request, obj=None): + return False + + +class ToolCallInline(admin.TabularInline): + model = ToolCall + extra = 0 + fields = ("seq", "tool_name", "tool_call_id", "is_error", "duration_ms") + readonly_fields = ("seq", "tool_name", "tool_call_id", "is_error", "duration_ms") + + def has_add_permission(self, request, obj=None): + return False + + def has_delete_permission(self, request, obj=None): + return False + + +@admin.register(Session) +class SessionAdmin(admin.ModelAdmin): + list_display = ( + "session_id", + "agent_name", + "model_id", + "total_tokens", + "message_count", + "start_time", + ) + list_filter = ("agent_name", "source_node", "model_id", "start_time") + search_fields = ("session_id", "cwd") + ordering = ("-start_time",) + inlines = [MessageInline, ToolCallInline] + readonly_fields = ( + "session_id", + "agent_name", + "source_node", + "start_time", + "end_time", + "pushed_at", + ) + + +@admin.register(Message) +class MessageAdmin(admin.ModelAdmin): + list_display = ("message_id", "session", "role", "timestamp", "tokens_total") + list_filter = ("role", "model", "timestamp") + search_fields = ("content_text",) + ordering = ("-timestamp",) + + +@admin.register(ToolCall) +class ToolCallAdmin(admin.ModelAdmin): + list_display = ("tool_name", "tool_call_id", "session", "is_error", "duration_ms") + list_filter = ("tool_name", "is_error", "exit_code") + ordering = ("-created_at",)