Files
inquiry_robot/inquiry-agent/agent/ledger/api_shell.py
T

125 lines
3.7 KiB
Python

"""
主账 API 方法签名壳。
本文件职责:列出智能体将调用的主账端点形状;默认返回 not_implemented,不假装成功。
禁止:直连 TMS / MySQL;Graph 成功不能冒充本文件成功。
"""
from __future__ import annotations
import logging
from typing import Any, Optional
from agent.ledger import LedgerClient, LedgerResponse
logger = logging.getLogger(__name__)
class LedgerApiShell:
"""
主账业务 API 空壳(签名齐、实现空)。
正式:各方法改走 request_json 打真实路径;路径以主账 OpenAPI 为准。
"""
def __init__(self, client: Optional[LedgerClient] = None) -> None:
self.client = client or LedgerClient.from_settings()
def _nyi(self, name: str) -> LedgerResponse:
logger.info("ledger.api_shell.%s not_implemented", name)
return LedgerResponse(
ok=False,
status_code=501,
error=f"not_implemented:{name}",
data={"method": name},
)
def create_ticket(
self,
*,
payload: dict[str, Any],
idempotency_key: str,
) -> LedgerResponse:
"""建单壳。"""
_ = (payload, idempotency_key)
return self._nyi("create_ticket")
def transition_ticket(
self,
*,
inquiry_no: str,
to_status: str,
idempotency_key: str,
reason: str = "",
) -> LedgerResponse:
"""六态迁移壳。"""
_ = (inquiry_no, to_status, idempotency_key, reason)
return self._nyi("transition_ticket")
def get_ticket(self, *, inquiry_no: str) -> LedgerResponse:
"""查工单壳。"""
_ = inquiry_no
return self._nyi("get_ticket")
def upsert_quote_version(
self,
*,
inquiry_no: str,
quote_version: int,
payload: dict[str, Any],
idempotency_key: str,
) -> LedgerResponse:
"""报价版本壳。"""
_ = (inquiry_no, quote_version, payload, idempotency_key)
return self._nyi("upsert_quote_version")
def register_attachment(
self,
*,
inquiry_no: str,
object_key: str,
meta: dict[str, Any],
idempotency_key: str,
) -> LedgerResponse:
"""附件元数据登记壳。"""
_ = (inquiry_no, object_key, meta, idempotency_key)
return self._nyi("register_attachment")
def get_staff_by_wecom_id(self, *, wecom_id: str) -> LedgerResponse:
"""人员角色壳(按已有 wecom_id)。"""
_ = wecom_id
return self._nyi("get_staff_by_wecom_id")
def list_quote_templates(self, *, enabled_only: bool = True) -> LedgerResponse:
"""
报价模板列表。
真相:后台上传/启用;智能体只读已启用项,再经对象存储/本地路径取字节。
"""
path = "/inquiry/quoteTemplate/agent/listEnabled"
return self.client.request_json(
"GET",
path,
params={"enabledOnly": str(bool(enabled_only)).lower()},
)
def list_bot_replies(self) -> LedgerResponse:
"""
已启用机器人回复语。
正式路径:GET /inquiry/agent/botReply/listEnabled
只读;停用项不在列表里。
"""
return self.client.request_json("GET", "/inquiry/agent/botReply/listEnabled")
def wake_agent_ack(
self,
*,
inquiry_no: str,
quote_version: int,
wait_version: int,
) -> LedgerResponse:
"""主账侧唤醒回执壳(智能体被唤醒后可选回写)。"""
_ = (inquiry_no, quote_version, wait_version)
return self._nyi("wake_agent_ack")