Skip to content
Open
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
15 changes: 15 additions & 0 deletions internal/application/service/knowledge.go
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,21 @@ func (s *knowledgeService) processDocumentFromURL(ctx context.Context,
return
}

// Update knowledge title if extracted from HTML
logger.GetLogger(ctx).Infof("DEBUG: resp.GetTitle()='%s', knowledge.Title='%s'", resp.GetTitle(), knowledge.Title)
if resp.GetTitle() != "" && knowledge.Title == "" {
knowledge.Title = resp.GetTitle()
logger.GetLogger(ctx).Infof("Extracted title from URL: %s", knowledge.Title)
// Update database immediately
if err := s.repo.UpdateKnowledge(ctx, knowledge); err != nil {
logger.GetLogger(ctx).WithField("error", err).Errorf("Failed to update knowledge title")
} else {
logger.GetLogger(ctx).Infof("DEBUG: Successfully updated knowledge title in database")
}
} else {
logger.GetLogger(ctx).Infof("DEBUG: Skipping title update - condition not met")
}

// Process and store chunks
s.processChunks(ctx, kb, knowledge, resp.Chunks)
}
Expand Down
6 changes: 5 additions & 1 deletion services/docreader/src/parser/base_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class ParseResult:

text: str # Extracted text content
chunks: Optional[List[Chunk]] = None # Chunk results
title: Optional[str] = None # Document title (for URLs)


class BaseParser(ABC):
Expand Down Expand Up @@ -672,7 +673,10 @@ def parse(self, content: bytes) -> ParseResult:
f"Skipping image processing for unsupported file type: {file_ext}"
)

return ParseResult(text=text, chunks=chunks)
# Include title if available (for WebParser)
title = getattr(self, 'extracted_title', None)
logger.info(f"DEBUG: Creating ParseResult with title='{title}'")
return ParseResult(text=text, chunks=chunks, title=title)

def _split_into_units(self, text: str) -> List[str]:
"""
Expand Down
4 changes: 4 additions & 0 deletions services/docreader/src/parser/web_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class WebParser(BaseParser):

def __init__(self, title: str, **kwargs):
self.title = title
self.extracted_title = None # Store extracted title from HTML
self.proxy = os.environ.get("WEB_PROXY", "")
super().__init__(file_name=title, **kwargs)
logger.info(f"Initialized WebParser with title: {title}")
Expand Down Expand Up @@ -110,6 +111,9 @@ def parse_into_text(self, content: bytes) -> Union[str, Tuple[str, Dict[str, Any
logger.info("No title found, using default")

logger.info(f"Web page title: {title}")
# Store the extracted title for later use
self.extracted_title = title.strip() if title else ""
logger.info(f"DEBUG: Stored extracted_title='{self.extracted_title}'")
text = "\n".join(
(line.strip() for line in text.splitlines() if line.strip())
)
Expand Down
8 changes: 8 additions & 0 deletions services/docreader/src/proto/docreader.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions services/docreader/src/proto/docreader.proto
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,5 @@ message Chunk {
message ReadResponse {
repeated Chunk chunks = 1; // 文档分块
string error = 2; // 错误信息
string title = 3; // 文档标题 (仅从URL读取时返回)
}
9 changes: 6 additions & 3 deletions services/docreader/src/server/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -262,13 +262,16 @@ def ReadFromURL(self, request, context):
context.set_details(error_msg)
return ReadResponse(error=error_msg)

# Convert to protobuf message, including image info
# Convert to protobuf message, including image info and title
logger.info(
f"Successfully parsed URL {request.url}, returning {len(result.chunks)} chunks"
f"Successfully parsed URL {request.url}, returning {len(result.chunks)} chunks, title: {result.title}"
)

response_title = result.title if result.title else ""
logger.info(f"DEBUG: Building ReadResponse with title='{response_title}'")
response = ReadResponse(
chunks=[self._convert_chunk_to_proto(chunk) for chunk in result.chunks]
chunks=[self._convert_chunk_to_proto(chunk) for chunk in result.chunks],
title=response_title
)
logger.info(f"Response size: {response.ByteSize()} bytes")
return response
Expand Down