mirror of
https://github.com/HKUDS/LightRAG.git
synced 2025-06-26 22:00:19 +00:00
Fix time zone problem of doc status
This commit is contained in:
parent
3117bc2e4a
commit
a561be0cff
@ -9,7 +9,7 @@ import aiofiles
|
||||
import shutil
|
||||
import traceback
|
||||
import pipmaster as pm
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional, Any, Literal
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, File, HTTPException, UploadFile
|
||||
@ -20,6 +20,30 @@ from lightrag.base import DocProcessingStatus, DocStatus
|
||||
from lightrag.api.utils_api import get_combined_auth_dependency
|
||||
from ..config import global_args
|
||||
|
||||
# Function to format datetime to ISO format string with timezone information
|
||||
def format_datetime(dt: Any) -> Optional[str]:
|
||||
"""Format datetime to ISO format string with timezone information
|
||||
|
||||
Args:
|
||||
dt: Datetime object, string, or None
|
||||
|
||||
Returns:
|
||||
ISO format string with timezone information, or None if input is None
|
||||
"""
|
||||
if dt is None:
|
||||
return None
|
||||
if isinstance(dt, str):
|
||||
return dt
|
||||
|
||||
# Check if datetime object has timezone information
|
||||
if isinstance(dt, datetime):
|
||||
# If datetime object has no timezone info (naive datetime), add UTC timezone
|
||||
if dt.tzinfo is None:
|
||||
dt = dt.replace(tzinfo=timezone.utc)
|
||||
|
||||
# Return ISO format string with timezone information
|
||||
return dt.isoformat()
|
||||
|
||||
router = APIRouter(
|
||||
prefix="/documents",
|
||||
tags=["documents"],
|
||||
@ -207,14 +231,6 @@ Attributes:
|
||||
|
||||
|
||||
class DocStatusResponse(BaseModel):
|
||||
@staticmethod
|
||||
def format_datetime(dt: Any) -> Optional[str]:
|
||||
if dt is None:
|
||||
return None
|
||||
if isinstance(dt, str):
|
||||
return dt
|
||||
return dt.isoformat()
|
||||
|
||||
id: str = Field(description="Document identifier")
|
||||
content_summary: str = Field(description="Summary of document content")
|
||||
content_length: int = Field(description="Length of document content in characters")
|
||||
@ -300,7 +316,7 @@ class PipelineStatusResponse(BaseModel):
|
||||
autoscanned: Whether auto-scan has started
|
||||
busy: Whether the pipeline is currently busy
|
||||
job_name: Current job name (e.g., indexing files/indexing texts)
|
||||
job_start: Job start time as ISO format string (optional)
|
||||
job_start: Job start time as ISO format string with timezone (optional)
|
||||
docs: Total number of documents to be indexed
|
||||
batchs: Number of batches for processing documents
|
||||
cur_batch: Current processing batch
|
||||
@ -322,6 +338,12 @@ class PipelineStatusResponse(BaseModel):
|
||||
history_messages: Optional[List[str]] = None
|
||||
update_status: Optional[dict] = None
|
||||
|
||||
@field_validator('job_start', mode='before')
|
||||
@classmethod
|
||||
def parse_job_start(cls, value):
|
||||
"""Process datetime and return as ISO format string with timezone"""
|
||||
return format_datetime(value)
|
||||
|
||||
class Config:
|
||||
extra = "allow" # Allow additional fields from the pipeline status
|
||||
|
||||
@ -1188,9 +1210,10 @@ def create_document_routes(
|
||||
if "history_messages" in status_dict:
|
||||
status_dict["history_messages"] = list(status_dict["history_messages"])
|
||||
|
||||
# Format the job_start time if it exists
|
||||
if status_dict.get("job_start"):
|
||||
status_dict["job_start"] = str(status_dict["job_start"])
|
||||
# Ensure job_start is properly formatted as a string with timezone information
|
||||
if "job_start" in status_dict and status_dict["job_start"]:
|
||||
# Use format_datetime to ensure consistent formatting
|
||||
status_dict["job_start"] = format_datetime(status_dict["job_start"])
|
||||
|
||||
return PipelineStatusResponse(**status_dict)
|
||||
except Exception as e:
|
||||
@ -1240,10 +1263,10 @@ def create_document_routes(
|
||||
content_summary=doc_status.content_summary,
|
||||
content_length=doc_status.content_length,
|
||||
status=doc_status.status,
|
||||
created_at=DocStatusResponse.format_datetime(
|
||||
created_at=format_datetime(
|
||||
doc_status.created_at
|
||||
),
|
||||
updated_at=DocStatusResponse.format_datetime(
|
||||
updated_at=format_datetime(
|
||||
doc_status.updated_at
|
||||
),
|
||||
chunks_count=doc_status.chunks_count,
|
||||
|
@ -6,7 +6,7 @@ import configparser
|
||||
import os
|
||||
import warnings
|
||||
from dataclasses import asdict, dataclass, field
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from functools import partial
|
||||
from typing import (
|
||||
Any,
|
||||
@ -756,8 +756,8 @@ class LightRAG:
|
||||
"content": content_data["content"],
|
||||
"content_summary": get_content_summary(content_data["content"]),
|
||||
"content_length": len(content_data["content"]),
|
||||
"created_at": datetime.now().isoformat(),
|
||||
"updated_at": datetime.now().isoformat(),
|
||||
"created_at": datetime.now(timezone.utc).isoformat(),
|
||||
"updated_at": datetime.now(timezone.utc).isoformat(),
|
||||
"file_path": content_data[
|
||||
"file_path"
|
||||
], # Store file path in document status
|
||||
@ -840,7 +840,7 @@ class LightRAG:
|
||||
{
|
||||
"busy": True,
|
||||
"job_name": "Default Job",
|
||||
"job_start": datetime.now().isoformat(),
|
||||
"job_start": datetime.now(timezone.utc).isoformat(),
|
||||
"docs": 0,
|
||||
"batchs": 0, # Total number of files to be processed
|
||||
"cur_batch": 0, # Number of files already processed
|
||||
@ -958,7 +958,7 @@ class LightRAG:
|
||||
"content_summary": status_doc.content_summary,
|
||||
"content_length": status_doc.content_length,
|
||||
"created_at": status_doc.created_at,
|
||||
"updated_at": datetime.now().isoformat(),
|
||||
"updated_at": datetime.now(timezone.utc).isoformat(),
|
||||
"file_path": file_path,
|
||||
}
|
||||
}
|
||||
@ -1018,7 +1018,7 @@ class LightRAG:
|
||||
"content_summary": status_doc.content_summary,
|
||||
"content_length": status_doc.content_length,
|
||||
"created_at": status_doc.created_at,
|
||||
"updated_at": datetime.now().isoformat(),
|
||||
"updated_at": datetime.now(timezone.utc).isoformat(),
|
||||
"file_path": file_path,
|
||||
}
|
||||
}
|
||||
@ -1053,7 +1053,7 @@ class LightRAG:
|
||||
"content_summary": status_doc.content_summary,
|
||||
"content_length": status_doc.content_length,
|
||||
"created_at": status_doc.created_at,
|
||||
"updated_at": datetime.now().isoformat(),
|
||||
"updated_at": datetime.now(timezone.utc).isoformat(),
|
||||
"file_path": file_path,
|
||||
}
|
||||
}
|
||||
|
@ -158,7 +158,16 @@ export default function PipelineStatusDialog({
|
||||
<div className="rounded-md border p-3 space-y-2">
|
||||
<div>{t('documentPanel.pipelineStatus.jobName')}: {status?.job_name || '-'}</div>
|
||||
<div className="flex justify-between">
|
||||
<span>{t('documentPanel.pipelineStatus.startTime')}: {status?.job_start ? new Date(status.job_start).toLocaleString() : '-'}</span>
|
||||
<span>{t('documentPanel.pipelineStatus.startTime')}: {status?.job_start
|
||||
? new Date(status.job_start).toLocaleString(undefined, {
|
||||
year: 'numeric',
|
||||
month: 'numeric',
|
||||
day: 'numeric',
|
||||
hour: 'numeric',
|
||||
minute: 'numeric',
|
||||
second: 'numeric'
|
||||
})
|
||||
: '-'}</span>
|
||||
<span>{t('documentPanel.pipelineStatus.progress')}: {status ? `${status.cur_batch}/${status.batchs} ${t('documentPanel.pipelineStatus.unit')}` : '-'}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
Loading…
x
Reference in New Issue
Block a user