mirror of https://github.com/langgenius/dify.git
92 lines
3.2 KiB
Python
92 lines
3.2 KiB
Python
from datetime import datetime
|
|
|
|
from sqlalchemy import and_, func, select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from models import App, Message
|
|
from models.model import AppMode
|
|
from services.message_app_log_service import MessageAppLogServiceBase
|
|
|
|
|
|
class CompletionAppLogService(MessageAppLogServiceBase):
|
|
def get_paginate_completion_app_logs(
|
|
self,
|
|
*,
|
|
session: Session,
|
|
app_model: App,
|
|
status: str | None = None,
|
|
created_at_before: datetime | None = None,
|
|
created_at_after: datetime | None = None,
|
|
page: int = 1,
|
|
limit: int = 20,
|
|
created_by_end_user_session_id: str | None = None,
|
|
created_by_account: str | None = None,
|
|
) -> dict:
|
|
"""
|
|
Get paginated completion app logs with token consumption information.
|
|
"""
|
|
return self.get_paginate_app_logs(
|
|
session=session,
|
|
app_model=app_model,
|
|
status=status,
|
|
created_at_before=created_at_before,
|
|
created_at_after=created_at_after,
|
|
page=page,
|
|
limit=limit,
|
|
created_by_end_user_session_id=created_by_end_user_session_id,
|
|
created_by_account=created_by_account,
|
|
)
|
|
|
|
def get_app_mode_filter(self):
|
|
"""Return the filter condition for completion app mode."""
|
|
return Message.app_mode == AppMode.COMPLETION.value
|
|
|
|
def build_log_data(self, session, message, conversation=None):
|
|
"""Build log data for completion app."""
|
|
account_obj, end_user_obj, created_from, created_by_role = self._get_creator_info(session, message)
|
|
|
|
return {
|
|
"id": str(message.id),
|
|
"message": {
|
|
"id": str(message.id),
|
|
"query": message.query,
|
|
"answer": message.answer,
|
|
"status": message.status,
|
|
"message_tokens": message.message_tokens,
|
|
"total_tokens": message.total_tokens,
|
|
"created_at": message.created_at,
|
|
"error": message.error,
|
|
"provider_response_latency": message.provider_response_latency,
|
|
"from_source": message.from_source,
|
|
"from_end_user_id": message.from_end_user_id,
|
|
"from_account_id": message.from_account_id,
|
|
},
|
|
"created_from": created_from,
|
|
"created_by_role": created_by_role,
|
|
"created_by_account": account_obj,
|
|
"created_by_end_user": end_user_obj,
|
|
"created_at": message.created_at,
|
|
}
|
|
|
|
def _build_base_query(self, app_model: App):
|
|
"""Build the base query for completion apps."""
|
|
return (
|
|
select(Message)
|
|
.where(
|
|
and_(
|
|
Message.app_id == app_model.id,
|
|
self.get_app_mode_filter(),
|
|
)
|
|
)
|
|
.order_by(Message.created_at.desc())
|
|
)
|
|
|
|
def _build_total_count_query(self, app_model: App):
|
|
"""Build the total count query for completion apps."""
|
|
return select(func.count(Message.id)).where(
|
|
and_(
|
|
Message.app_id == app_model.id,
|
|
self.get_app_mode_filter(),
|
|
)
|
|
)
|