From b1f57922da961fc0f29e2930fca8455c7be2bf42 Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Tue, 17 Mar 2026 21:53:17 +0800 Subject: [PATCH] feat(08-02): add CommentData models for comment crawling - Add CommentAuthor model for comment author info - Add CommentData model with content, author, likes, child_count - Add CommentsResult model for crawl operation result - Update CrawlResult to include optional comments field Co-Authored-By: Claude Opus 4.6 --- kb_workflow/crawler/models.py | 57 ++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/kb_workflow/crawler/models.py b/kb_workflow/crawler/models.py index 884242f..00f52ca 100644 --- a/kb_workflow/crawler/models.py +++ b/kb_workflow/crawler/models.py @@ -3,7 +3,7 @@ Pydantic models for structured data from Zhihu API responses. """ -from typing import Optional, Union +from typing import Optional, Union, List from pydantic import BaseModel, Field @@ -79,6 +79,56 @@ class ArticleData(BaseModel): ) +class CommentAuthor(BaseModel): + """Comment author information. + + Attributes: + name: Author display name + url_token: Author URL token (e.g., 'zhang-san-12') + """ + name: str = Field(..., description="Author display name") + url_token: Optional[str] = Field(None, description="Author URL token") + + +class CommentData(BaseModel): + """Data model for Zhihu comment. + + Attributes: + id: Comment ID + content: Comment content in plain text + author: Comment author information + created_time: Unix timestamp of creation + like_count: Number of likes/upvotes + child_count: Number of child/reply comments + is_author: Whether the commenter is the content author + """ + id: int = Field(..., description="Comment ID") + content: str = Field(default="", description="Comment content") + author: Optional[CommentAuthor] = Field(None, description="Comment author") + created_time: Optional[int] = Field(None, description="Creation timestamp") + like_count: int = Field(default=0, description="Like/upvote count") + child_count: int = Field(default=0, description="Number of child comments") + is_author: bool = Field(default=False, description="Whether commenter is content author") + + +class CommentsResult(BaseModel): + """Result of comment crawling operation. + + Attributes: + content_type: Type of content ("answers" or "articles") + content_id: ID of the content + comments: List of comments + total_count: Total number of comments (may exceed returned count) + """ + content_type: str = Field(..., description="Content type: answers or articles") + content_id: int = Field(..., description="Content ID") + comments: List[CommentData] = Field( + default_factory=list, + description="List of comments" + ) + total_count: int = Field(default=0, description="Total comment count") + + class CrawlResult(BaseModel): """Result of a crawl operation. @@ -86,6 +136,7 @@ class CrawlResult(BaseModel): success: Whether the crawl was successful content_type: Type of content ("answer" or "article") data: Extracted content data if successful + comments: Optional list of comments (when include_comments=True) error: Error message if failed """ success: bool = Field(..., description="Whether crawl succeeded") @@ -94,4 +145,8 @@ class CrawlResult(BaseModel): None, description="Extracted content data" ) + comments: Optional[List[CommentData]] = Field( + None, + description="Comments if include_comments was True" + ) error: Optional[str] = Field(None, description="Error message if failed")