Files
life-echo/api/app/adapters/storage/tencent_cos.py
Kevin a3f61fcc0f feat(api+app): 对话阶段化、回忆录流水线与客户端会话体验
- DB: segments 用户输入文本(Alembic 0002)
- Chat: 阶段检测/阶段提示/回复限制,编排与访谈/画像 prompts 调整
- Memoir: 忠实度检查 agent,叙事与分类等链路更新
- Core: agent 日志、Alembic 启动、LangChain/日志/配置等
- Story: time_hints;Memory 检索与相关测试
- Expo: 助手头像、会话页与消息拆分、实时会话与文案/i18n
- Docs/scripts/tests: 迁移脚本、LLM JSON/记忆检索文档、新增单测
2026-03-26 12:13:36 +08:00

55 lines
1.5 KiB
Python

"""Tencent COS adapter — implements ObjectStorage port."""
from app.core.logging import get_logger
from qcloud_cos import CosConfig, CosS3Client
from qcloud_cos.cos_exception import CosClientError, CosServiceError
logger = get_logger(__name__)
class TencentCosStorage:
def __init__(
self,
secret_id: str,
secret_key: str,
region: str,
bucket: str,
base_url: str = "",
token: str = "",
):
self._bucket = bucket
self._base_url = (
base_url or f"https://{bucket}.cos.{region}.myqcloud.com"
).rstrip("/")
config = CosConfig(
Region=region,
SecretId=secret_id,
SecretKey=secret_key,
Token=token,
Scheme="https",
)
self._client = CosS3Client(config)
def upload(self, key: str, data: bytes, content_type: str) -> str:
self._client.put_object(
Bucket=self._bucket,
Body=data,
Key=key,
ContentType=content_type,
)
return f"{self._base_url}/{key}"
def get_url(self, key: str, expires: int = 3600) -> str:
return self._client.get_presigned_download_url(
Bucket=self._bucket,
Key=key,
Expired=expires,
)
def delete(self, key: str) -> None:
try:
self._client.delete_object(Bucket=self._bucket, Key=key)
except (CosClientError, CosServiceError) as e:
logger.warning("COS delete failed: key={}, error={}", key, e)