2025-12-04 11:04:16 +08:00
|
|
|
|
import httpx
|
|
|
|
|
|
from typing import Dict, Any, List
|
|
|
|
|
|
from config.logger import setup_logging
|
|
|
|
|
|
|
|
|
|
|
|
TAG = __name__
|
|
|
|
|
|
|
|
|
|
|
|
class ContextDataProvider:
|
|
|
|
|
|
"""数据上下文填充,负责从配置的API获取数据"""
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, config: Dict[str, Any], logger=None):
|
|
|
|
|
|
self.config = config
|
|
|
|
|
|
self.logger = logger or setup_logging()
|
|
|
|
|
|
self.context_data = ""
|
|
|
|
|
|
|
|
|
|
|
|
def fetch_all(self, device_id: str) -> str:
|
|
|
|
|
|
"""获取所有配置的上下文数据"""
|
|
|
|
|
|
context_providers = self.config.get("context_providers", [])
|
|
|
|
|
|
if not context_providers:
|
|
|
|
|
|
return ""
|
|
|
|
|
|
|
|
|
|
|
|
formatted_lines = []
|
|
|
|
|
|
for provider in context_providers:
|
|
|
|
|
|
url = provider.get("url")
|
|
|
|
|
|
headers = provider.get("headers", {})
|
|
|
|
|
|
|
|
|
|
|
|
if not url:
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
headers = headers.copy() if isinstance(headers, dict) else {}
|
|
|
|
|
|
# 将 device_id 添加到请求头
|
2025-12-08 14:25:11 +08:00
|
|
|
|
headers["device-id"] = device_id
|
2025-12-04 11:04:16 +08:00
|
|
|
|
|
|
|
|
|
|
# 发送请求
|
|
|
|
|
|
response = httpx.get(url, headers=headers, timeout=3)
|
|
|
|
|
|
|
|
|
|
|
|
if response.status_code == 200:
|
|
|
|
|
|
result = response.json()
|
|
|
|
|
|
if isinstance(result, dict):
|
|
|
|
|
|
if result.get("code") == 0:
|
|
|
|
|
|
data = result.get("data")
|
|
|
|
|
|
# 格式化数据
|
|
|
|
|
|
if isinstance(data, dict):
|
|
|
|
|
|
for k, v in data.items():
|
|
|
|
|
|
formatted_lines.append(f"- **{k}:** {v}")
|
|
|
|
|
|
elif isinstance(data, list):
|
|
|
|
|
|
for item in data:
|
|
|
|
|
|
formatted_lines.append(f"- {item}")
|
|
|
|
|
|
else:
|
|
|
|
|
|
formatted_lines.append(f"- {data}")
|
|
|
|
|
|
else:
|
|
|
|
|
|
self.logger.bind(tag=TAG).warning(f"API {url} 返回错误码: {result.get('msg')}")
|
|
|
|
|
|
else:
|
|
|
|
|
|
self.logger.bind(tag=TAG).warning(f"API {url} 返回的不是JSON字典")
|
|
|
|
|
|
else:
|
|
|
|
|
|
self.logger.bind(tag=TAG).warning(f"API {url} 请求失败: {response.status_code}")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
self.logger.bind(tag=TAG).error(f"获取上下文数据 {url} 失败: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
# 将所有格式化后的行拼接成一个字符串
|
|
|
|
|
|
self.context_data = "\n".join(formatted_lines)
|
2025-12-05 14:50:26 +08:00
|
|
|
|
if self.context_data:
|
|
|
|
|
|
self.logger.bind(tag=TAG).debug(f"已注入动态上下文数据:\n{self.context_data}")
|
2025-12-04 11:04:16 +08:00
|
|
|
|
return self.context_data
|