Fix: Ensure UTF-8 encoding and ensure_ascii=False for remaining file/JSON operations
This commit is contained in:
@@ -116,7 +116,7 @@ class WebFetchTool(Tool):
|
|||||||
# Validate URL before fetching
|
# Validate URL before fetching
|
||||||
is_valid, error_msg = _validate_url(url)
|
is_valid, error_msg = _validate_url(url)
|
||||||
if not is_valid:
|
if not is_valid:
|
||||||
return json.dumps({"error": f"URL validation failed: {error_msg}", "url": url})
|
return json.dumps({"error": f"URL validation failed: {error_msg}", "url": url}, ensure_ascii=False)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
async with httpx.AsyncClient(
|
async with httpx.AsyncClient(
|
||||||
@@ -131,7 +131,7 @@ class WebFetchTool(Tool):
|
|||||||
|
|
||||||
# JSON
|
# JSON
|
||||||
if "application/json" in ctype:
|
if "application/json" in ctype:
|
||||||
text, extractor = json.dumps(r.json(), indent=2), "json"
|
text, extractor = json.dumps(r.json(), indent=2, ensure_ascii=False), "json"
|
||||||
# HTML
|
# HTML
|
||||||
elif "text/html" in ctype or r.text[:256].lower().startswith(("<!doctype", "<html")):
|
elif "text/html" in ctype or r.text[:256].lower().startswith(("<!doctype", "<html")):
|
||||||
doc = Document(r.text)
|
doc = Document(r.text)
|
||||||
@@ -146,9 +146,9 @@ class WebFetchTool(Tool):
|
|||||||
text = text[:max_chars]
|
text = text[:max_chars]
|
||||||
|
|
||||||
return json.dumps({"url": url, "finalUrl": str(r.url), "status": r.status_code,
|
return json.dumps({"url": url, "finalUrl": str(r.url), "status": r.status_code,
|
||||||
"extractor": extractor, "truncated": truncated, "length": len(text), "text": text})
|
"extractor": extractor, "truncated": truncated, "length": len(text), "text": text}, ensure_ascii=False)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return json.dumps({"error": str(e), "url": url})
|
return json.dumps({"error": str(e), "url": url}, ensure_ascii=False)
|
||||||
|
|
||||||
def _to_markdown(self, html: str) -> str:
|
def _to_markdown(self, html: str) -> str:
|
||||||
"""Convert HTML to markdown."""
|
"""Convert HTML to markdown."""
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ class DingTalkChannel(BaseChannel):
|
|||||||
"msgParam": json.dumps({
|
"msgParam": json.dumps({
|
||||||
"text": msg.content,
|
"text": msg.content,
|
||||||
"title": "Nanobot Reply",
|
"title": "Nanobot Reply",
|
||||||
}),
|
}, ensure_ascii=False),
|
||||||
}
|
}
|
||||||
|
|
||||||
if not self._http:
|
if not self._http:
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ Information about the user goes here.
|
|||||||
for filename, content in templates.items():
|
for filename, content in templates.items():
|
||||||
file_path = workspace / filename
|
file_path = workspace / filename
|
||||||
if not file_path.exists():
|
if not file_path.exists():
|
||||||
file_path.write_text(content)
|
file_path.write_text(content, encoding="utf-8")
|
||||||
console.print(f" [dim]Created {filename}[/dim]")
|
console.print(f" [dim]Created {filename}[/dim]")
|
||||||
|
|
||||||
# Create memory directory and MEMORY.md
|
# Create memory directory and MEMORY.md
|
||||||
@@ -266,12 +266,12 @@ This file stores important information that should persist across sessions.
|
|||||||
## Important Notes
|
## Important Notes
|
||||||
|
|
||||||
(Things to remember)
|
(Things to remember)
|
||||||
""")
|
""", encoding="utf-8")
|
||||||
console.print(" [dim]Created memory/MEMORY.md[/dim]")
|
console.print(" [dim]Created memory/MEMORY.md[/dim]")
|
||||||
|
|
||||||
history_file = memory_dir / "HISTORY.md"
|
history_file = memory_dir / "HISTORY.md"
|
||||||
if not history_file.exists():
|
if not history_file.exists():
|
||||||
history_file.write_text("")
|
history_file.write_text("", encoding="utf-8")
|
||||||
console.print(" [dim]Created memory/HISTORY.md[/dim]")
|
console.print(" [dim]Created memory/HISTORY.md[/dim]")
|
||||||
|
|
||||||
# Create skills directory for custom user skills
|
# Create skills directory for custom user skills
|
||||||
|
|||||||
@@ -55,8 +55,8 @@ def save_config(config: Config, config_path: Path | None = None) -> None:
|
|||||||
|
|
||||||
data = config.model_dump(by_alias=True)
|
data = config.model_dump(by_alias=True)
|
||||||
|
|
||||||
with open(path, "w") as f:
|
with open(path, "w", encoding="utf-8") as f:
|
||||||
json.dump(data, f, indent=2)
|
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
|
||||||
def _migrate_config(data: dict) -> dict:
|
def _migrate_config(data: dict) -> dict:
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class HeartbeatService:
|
|||||||
"""Read HEARTBEAT.md content."""
|
"""Read HEARTBEAT.md content."""
|
||||||
if self.heartbeat_file.exists():
|
if self.heartbeat_file.exists():
|
||||||
try:
|
try:
|
||||||
return self.heartbeat_file.read_text()
|
return self.heartbeat_file.read_text(encoding="utf-8")
|
||||||
except Exception:
|
except Exception:
|
||||||
return None
|
return None
|
||||||
return None
|
return None
|
||||||
|
|||||||
Reference in New Issue
Block a user