Agent 與既有系統整合:把老舊 API 包成可用工具
真實企業的 API 不是為 Agent 設計的。這是包裝層的設計原則。
教學文章裡的工具都很乾淨;真實企業的內部 API 通常是:三十個參數、回傳兩百個欄位、錯誤碼用數字、文件過期三年。直接暴露給模型的結果一定很糟。
包裝層的任務是把這些 API 翻譯成模型能有效使用的形式。原則是:收斂參數、精簡回傳、翻譯錯誤。
一、收斂參數
# 原始 API:30 個參數,多數有預設值且與模型無關
# 包裝後:只暴露模型真的需要決定的 3 個
def search_orders(order_no=None, email=None, days=30):
return legacy.OrderQuery(
orderNo=order_no, custEmail=email,
dateFrom=(today - timedelta(days=days)).strftime('%Y%m%d'),
dateTo=today.strftime('%Y%m%d'),
pageSize=50, includeVoid='N', channel='ALL',
sortBy='ORDER_DATE', sortDir='DESC', # 其餘固定
)二、精簡回傳
回傳兩百個欄位會吃掉大量上下文,而且模型要在噪音中找資訊。只保留與任務相關的欄位,並把代碼翻譯成可讀文字。
STATUS_MAP = {'01': '待付款', '02': '已付款', '03': '已出貨',
'04': '已完成', '09': '已取消'}
def simplify(raw):
return {
'order_no': raw['ORDER_NO'],
'status': STATUS_MAP.get(raw['ORD_STS'], f"未知({raw['ORD_STS']})"),
'amount': float(raw['TOT_AMT']),
'ordered_at': fmt_date(raw['ORD_DT']),
'items': [{'name': i['ITM_NM'], 'qty': int(i['QTY'])}
for i in raw.get('ITEM_LIST', [])[:20]],
}三、翻譯錯誤
ERROR_MAP = {
'E0012': ('ORDER_NOT_FOUND', '查無此訂單編號', '請確認編號是否正確,或改用信箱查詢'),
'E0088': ('DATE_RANGE_TOO_WIDE', '查詢區間超過 90 天', '請把 days 參數縮小到 90 以內'),
'E9001': ('UPSTREAM_BUSY', '後端系統忙碌', '請於數秒後重試'),
}
def wrap_error(code):
ec, msg, hint = ERROR_MAP.get(code, ('UNKNOWN', f'未知錯誤 {code}', None))
return {'ok': False, 'error_code': ec, 'message': msg, 'hint': hint}包裝層也要處理效能
- 老舊 API 常常很慢,包裝層要設逾時並回傳可理解的訊息。
- 同一次執行內做結果快取。
- 把多次呼叫合併成一次批次查詢(若上游支援)。
把包裝層當成獨立元件維護
包裝層應該有自己的測試、版本與文件,而不是散落在 Agent 程式碼裡。上游 API 改版時,你只需要改一個地方,Agent 的提示與工具描述不受影響。
包裝層的欄位取捨要用真實任務驗證。憑感覺刪欄位,常常會刪掉某類任務唯一需要的那一個。先全留、觀察哪些從未被用到,再刪。
訂閱後繼續閱讀全文
本篇為訂閱者專屬內容。訂閱後可取得下列權限:
- 解鎖全部內容權限
- 閱讀不限篇數
- 全站移除廣告
月卡
NT$240
開通 30 天
一次付清,開通 30 天
季卡
NT$620
開通 90 天
一次付清,開通 90 天,每天約 NT$7
年卡
NT$2,160
開通 365 天
一次付清,開通 365 天,每天約 NT$6
一次性付款,付款成功後立即開通,到期自動結束,不會再次扣款,也不需要取消訂閱。
立即訂閱
金額均為新臺幣(TWD),即實際扣款金額,不另收手續費
支援信用卡 · Apple Pay · Google Pay · WebATM · ATM 轉帳
購買須知與退款政策