Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 28 additions & 2 deletions apps/homepage/api/home_page_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@
from common.mixins.api_mixin import APIMixin




class ApplicationMonitoringAPI(APIMixin):
@staticmethod
def get_parameters():
Expand Down Expand Up @@ -50,10 +48,12 @@ def get_parameters():
required=True,
),
]

@staticmethod
def get_response():
return ApplicationStatsResult


class RankingBaseAPI(APIMixin):

@staticmethod
Expand Down Expand Up @@ -222,6 +222,32 @@ def get_parameters():
]


class TokensAggregationAPI(APIMixin):
@staticmethod
def get_parameters():
return [
OpenApiParameter(
name="workspace_id",
type=OpenApiTypes.STR,
location=OpenApiParameter.PATH,
required=True,
description=_("Workspace ID"),
),
OpenApiParameter(
name="start_time",
description="start Time",
type=OpenApiTypes.STR,
required=True,
),
OpenApiParameter(
name="end_time",
description="end Time",
type=OpenApiTypes.STR,
required=True,
),
]


class KnowledgeAggregationAPI(APIMixin):

@staticmethod
Expand Down
61 changes: 60 additions & 1 deletion apps/homepage/serializers/homepage.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers

from application.models import Application, ApplicationChatUserStats, Chat
from application.models import Application, ApplicationChatUserStats, Chat, ChatRecord
from common.constants.permission_constants import RoleConstants
from common.db.search import native_search, get_dynamics_model, page_search
from common.utils.common import get_file_content
Expand Down Expand Up @@ -49,6 +49,65 @@ def get_format_time(date_time):


class HomePageSerializer(serializers.Serializer):
class TokensAggregation(serializers.Serializer):
workspace_id = serializers.CharField(required=False, label=_("Workspace ID"))
user_id = serializers.UUIDField(required=True, label=_("User ID"))
start_time = serializers.DateField(format='%Y-%m-%d', label=_("Start time"))
end_time = serializers.DateField(format='%Y-%m-%d', label=_("End time"))

def aggregation(self, auth, with_valid=True):
if with_valid:
self.is_valid(raise_exception=True)
data = self.data
user_id = data["user_id"]
workspace_id = data.get("workspace_id")
start_time = get_format_time(data["start_time"])
end_time = get_format_time(data["end_time"])
workspace_manage = is_workspace_manage(auth, workspace_id)
query = ChatRecord.objects.filter(
create_time__gte=start_time,
create_time__lte=end_time,
)
if workspace_manage:
query = query.filter(
chat__application__workspace_id=workspace_id
)
else:
permission_list = (
["VIEW", "MANAGE", "ROLE"]
if hasPermission(auth, "APPLICATION:READ")
else ["VIEW", "MANAGE"]
)
permission_subquery = (
WorkspaceUserResourcePermission.objects
.filter(
workspace_id=workspace_id,
user_id=user_id,
auth_type="APPLICATION",
permission_list__overlap=permission_list
)
.annotate(
target_uuid=Cast(
"target",
output_field=UUIDField()
)
)
.values("target_uuid")
)
query = query.filter(
chat__application_id__in=permission_subquery
)

return query.aggregate(
total_tokens=Coalesce(
Sum(
F("message_tokens") + F("answer_tokens"),
output_field=IntegerField()
),
0
)
)["total_tokens"]

class ApplicationUserTokenRanking(serializers.Serializer):
workspace_id = serializers.CharField(required=False, label=_("Workspace ID"))
user_id = serializers.UUIDField(required=True, label=_("User ID"))
Expand Down
3 changes: 2 additions & 1 deletion apps/homepage/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@
path("workspace/<str:workspace_id>/homepage/monitoring/aggregation",views.HomePageAPI.ApplicationMonitoring.as_view()),
path("workspace/<str:workspace_id>/homepage/knowledge/aggregation",views.HomePageAPI.KnowledgeAggregation.as_view()),
path("workspace/<str:workspace_id>/homepage/tool/aggregation",views.HomePageAPI.ToolAggregation.as_view()),
path("workspace/<str:workspace_id>/homepage/model/aggregation",views.HomePageAPI.ModelAggregation.as_view())
path("workspace/<str:workspace_id>/homepage/model/aggregation",views.HomePageAPI.ModelAggregation.as_view()),
path("workspace/<str:workspace_id>/homepage/tokens/aggregation",views.HomePageAPI.TokensAggregation.as_view())
]
42 changes: 32 additions & 10 deletions apps/homepage/views/homepage.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,48 @@
from common.auth import TokenAuth
from homepage.api.home_page_api import ApplicationTokensRankingAPI, ApplicationQuestionRankingAPI, UserTokensRankingAPI, \
ApplicationAggregationAPI, KnowledgeAggregationAPI, ToolAggregationAPI, ModelAggregationAPI, \
ApplicationMonitoringAPI
ApplicationMonitoringAPI, RankingBaseAPI, TokensAggregationAPI
from homepage.serializers.homepage import HomePageSerializer
from django.utils.translation import gettext_lazy as _


class HomePageAPI(APIView):
authentication_classes = [TokenAuth]

@extend_schema(
methods=["GET"],
description=_("Top applications by token consumption"),
summary=_("Top applications by token consumption"),
operation_id="homepage_application_tokens_ranking",
parameters=ApplicationTokensRankingAPI.get_parameters(),
responses=ApplicationTokensRankingAPI.get_response(),
tags=[_("Home page")],
)
class TokensAggregation(APIView):
authentication_classes = [TokenAuth]

@extend_schema(
methods=["GET"],
description=_("Tokens data aggregation"),
summary=_("Tokens data aggregation"),
operation_id="homepage_model_aggregation",
parameters=TokensAggregationAPI.get_parameters(),
responses=TokensAggregationAPI.get_response(),
tags=[_("Home page")],
)
def get(self, request: Request, workspace_id: str):
return result.success(
HomePageSerializer.TokensAggregation(
data={'workspace_id': workspace_id, 'user_id': request.user.id,
'start_time': request.query_params.get(
'start_time'),
'end_time': request.query_params.get(
'end_time')}).aggregation(
request.auth))

class ApplicationTokensRanking(APIView):
authentication_classes = [TokenAuth]

@extend_schema(
methods=["GET"],
description=_("Top applications by token consumption"),
summary=_("Top applications by token consumption"),
operation_id="homepage_application_tokens_ranking",
parameters=ApplicationTokensRankingAPI.get_parameters(),
responses=ApplicationTokensRankingAPI.get_response(),
tags=[_("Home page")],
)
def get(self, request: Request, workspace_id: str, current_page: int, page_size: int):
return result.success(HomePageSerializer.ApplicationTokensRanking(
data={'user_id': request.user.id, 'workspace_id': workspace_id,
Expand Down
Loading