How the Agent Reach `format` Command Cleans and Formats Xiaohongshu API Output
The Agent Reach format command for Xiaohongshu uses the format_xhs_result function in agent_reach/channels/xiaohongshu.py to strip raw XHS API responses down to essential fields, reducing payload size by up to 90% while ensuring a deterministic schema for downstream LLM consumption.
The Agent Reach CLI provides a dedicated formatting pipeline for Xiaohongshu (XiaoHongShu / XHS / 小红书) API data. According to the Panniantong/Agent-Reach source code, this system handles the platform's inconsistent response structures through a three-layer cleaning process: list/dispatch logic, note-level extraction, and comment-level simplification.
The format_xhs_result Entry Point
The primary interface for formatting Xiaohongshu API output is the format_xhs_result function, defined at lines 51-71 of agent_reach/channels/xiaohongshu.py.
This function receives raw JSON data and branches based on input type:
- List input — Each element is passed to
_clean_note(), returning a list of cleaned notes - Dict input — Detects common wrapper keys (
items,data → items,data → notes) and processes the wrapped list, or treats the dict as a single note if no wrapper is found - Other types — Returned unchanged (strings,
None, etc.)
def format_xhs_result(data):
"""Clean XHS API response, keeping only useful fields."""
# ──► Handles lists (search results) or single objects
Note-Level Transformation with _clean_note
The _clean_note function, located at lines 73-141, performs the core field extraction and normalization.
Field Extraction Strategy
| Step | Action | Purpose |
|---|---|---|
| Normalize nesting | inner = note.get("note_card") or note.get("note") or note |
Handles variable wrapper keys (note_card, note) |
| Basic metadata | Copies id, note_id, xsec_token, title, desc, type, time |
Minimal identifiers for lookups |
| Content fallback | Adds content if desc is missing |
Guarantees textual body presence |
| Author extraction | Pulls nickname, user_id, nick_name from user/author object |
Strips full profile noise |
| Engagement metrics | Collects liked_count, collected_count, comment_count, share_count from interact_info or top level |
Provides popularity signals |
| Images | Extracts url, url_default, original URLs only |
Removes image metadata bloat |
| Tags | Normalizes tag objects to plain strings | Simplifies downstream processing |
| Comments | Processes each through _clean_comment |
Lightweight comment snapshots |
Comment Cleaning via _clean_comment
Comments are simplified at lines 44-57 to retain only:
content- Author
nickname like_countsub_comment_count
def _clean_comment(comment):
"""Extract useful fields from a comment."""
Practical Example: Raw to Clean Transformation
>>> from agent_reach.channels.xiaohongshu import format_xhs_result
>>> raw = {
... "data": {
... "items": [
... {
... "note_id": "12345",
... "title": "My first XHS note",
... "desc": "Short description",
... "user": {"nickname": "alice", "user_id": "u01"},
... "interact_info": {"liked_count": 42},
... "image_list": [{"url": "https://example.com/img1.jpg"}],
... "tag_list": [{"name": "travel"}],
... }
... ]
... }
... }
>>> clean = format_xhs_result(raw)
>>> clean
[{
'note_id': '12345',
'title': 'My first XHS note',
'desc': 'Short description',
'user': {'nickname': 'alice', 'user_id': 'u01'},
'liked_count': 42,
'images': ['https://example.com/img1.jpg'],
'tags': ['travel']
}]
Performance and Design Characteristics
The Xiaohongshu format command achieves three critical objectives:
- Token efficiency — Up to 90% payload reduction by discarding nested structures, unused keys, and binary blobs (per issue #134 referenced in source docstrings)
- Schema determinism — Downstream agents receive predictable field shapes regardless of which XHS endpoint emitted the data
- Operational safety — Pure JSON transformation with no network I/O; operates only on data already retrieved by the channel's
readmethod
Related Source Files
| File | Role |
|---|---|
agent_reach/channels/xiaohongshu.py |
Core implementation: format_xhs_result, _clean_note, _clean_comment |
tests/test_xhs_format.py |
Unit tests for cleaning logic and edge case handling |
agent_reach/utils/text.py |
Generic text-processing utilities (used indirectly) |
Summary
- The
formatcommand for Xiaohongshu is implemented inagent_reach/channels/xiaohongshu.pyvia theformat_xhs_resultfunction _clean_notenormalizes variable XHS response structures and extracts only essential note fields_clean_commentprovides lightweight comment snapshots with content, author, and interaction counts- The pipeline handles both list and dict inputs, detects common wrapper keys, and produces flat, deterministic output
- Zero network dependencies make the formatting operation safe and fast for LLM prompt preparation
Frequently Asked Questions
What fields does the Agent Reach Xiaohongshu formatter keep?
The formatter retains note_id, title, desc (or content as fallback), user with nickname and user_id, engagement metrics (liked_count, collected_count, comment_count, share_count), image URLs, tag names, and simplified comments. All other metadata is discarded to minimize token usage.
How does the formatter handle different XHS API response shapes?
format_xhs_result detects whether the input is a list or dict, then checks for common wrapper keys (items, data → items, data → notes). It unwraps nested structures as needed before passing elements to _clean_note, ensuring consistent output regardless of the source endpoint.
Where are the tests for the Xiaohongshu formatting logic?
Unit tests reside in tests/test_xhs_format.py, covering edge cases including list inputs, single dict inputs, wrapped responses, and verification that redundant fields are properly stripped while essential fields are preserved.
Can I use format_xhs_result outside the Agent Reach CLI?
Yes. The function is importable from agent_reach.channels.xiaohongshu and operates as a pure function on JSON data. It requires no CLI context, authentication, or network access—only the raw API response dictionary or list.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →