90 lines
2.4 KiB
Python
90 lines
2.4 KiB
Python
"""
|
||
Toon格式轉換工具
|
||
|
||
將JSON數據轉換為toon格式以減少token消耗
|
||
"""
|
||
from toon_format import encode, decode, estimate_savings, compare_formats
|
||
import json
|
||
from typing import Union, Dict, List
|
||
|
||
|
||
def convert_json_to_toon(json_data: Union[str, dict, list]) -> str:
|
||
"""
|
||
將JSON數據轉換為toon格式
|
||
|
||
Args:
|
||
json_data: JSON字符串或Python字典/列表
|
||
|
||
Returns:
|
||
toon格式的字符串
|
||
"""
|
||
if isinstance(json_data, str):
|
||
try:
|
||
data = json.loads(json_data)
|
||
except json.JSONDecodeError:
|
||
# 如果無法解析,直接返回原始字符串
|
||
return json_data
|
||
else:
|
||
data = json_data
|
||
|
||
try:
|
||
return encode(data)
|
||
except Exception as e:
|
||
print(f"警告:toon轉換失敗:{e},返回原始數據")
|
||
return json.dumps(data, ensure_ascii=False) if not isinstance(json_data, str) else json_data
|
||
|
||
|
||
def convert_toon_to_json(toon_data: str) -> dict:
|
||
"""
|
||
將toon數據轉換回JSON/Python字典
|
||
|
||
Args:
|
||
toon_data: toon格式的字符串
|
||
|
||
Returns:
|
||
Python字典
|
||
"""
|
||
try:
|
||
return decode(toon_data)
|
||
except Exception as e:
|
||
print(f"警告:toon解碼失敗:{e}")
|
||
# 嘗試作為JSON解析
|
||
try:
|
||
return json.loads(toon_data)
|
||
except:
|
||
return {"error": "無法解析數據", "原始數據": toon_data}
|
||
|
||
|
||
def show_toon_savings(data: Union[dict, list]) -> Dict[str, float]:
|
||
"""
|
||
顯示使用toon格式的token節省情況
|
||
|
||
Args:
|
||
data: Python字典或列表
|
||
|
||
Returns:
|
||
包含節省百分比和token數的字典
|
||
"""
|
||
try:
|
||
result = estimate_savings(data)
|
||
print(f"Token節省: {result['savings_percent']:.1f}%")
|
||
print(f"JSON tokens: {result['json_tokens']}")
|
||
print(f"Toon tokens: {result['toon_tokens']}")
|
||
return result
|
||
except Exception as e:
|
||
print(f"警告:無法計算節省:{e}")
|
||
return {"savings_percent": 0, "json_tokens": 0, "toon_tokens": 0}
|
||
|
||
|
||
def compare_format_display(data: Union[dict, list]) -> None:
|
||
"""
|
||
顯示JSON與toon格式的直觀比較
|
||
|
||
Args:
|
||
data: Python字典或列表
|
||
"""
|
||
try:
|
||
print(compare_formats(data))
|
||
except Exception as e:
|
||
print(f"警告:無法顯示格式比較:{e}")
|