当工具已经执行成功,但返回给 LLM 的内容还需要补充、删减或重新组织时,可以使用 resultHandler。它有两种用法:在默认结果上调整字段,或在特定 GPA 工具中接管原始返回值并重新构建结果。
方式一:在默认结果上调整字段
适用于任意业务类型(gpa、datacatalog、db_query、job_management、layer_templates)。在产品包目录 /cfg/gpa_mcp/v2_handlers/ 下新建 reshape_hooks.py:
async def handle_result(ctx):
"""resultHandler:在默认结果之上改写。这里给结果加一个固定的说明字段。"""
if ctx.result is not None:
ctx.result["note"] = "该结果由 XX 系统临时生成,仅供预览"
对应工具 JSON:"resultHandler": "reshape_hooks"(省略函数名,使用默认的 handle_result)。resultHandler 抛异常会阻断执行并返回错误——它产出的是最终交付给 LLM 的结果,跟 preHandler 一样,写错了不能让不完整的结果糊弄过去。
方式二:接管 GPA 原始返回值
普通 gpa 工具默认会经过内置的结果处理器,把 iServer 原始响应加工成标准结构。如果您想完全自己处理 iServer 返回的原始数据、跳过默认加工逻辑,只需给工具配置 resultHandler:配置了 resultHandler 的 gpa 工具会自动跳过默认处理,把原始执行结果存入 ctx.state["gpa_raw_result"],交给您的 resultHandler 从零构建结果。
在产品包目录 /cfg/gpa_mcp/v2_handlers/ 下新建 raw_result_hooks.py:
async def handle_result(ctx):
raw = ctx.state["gpa_raw_result"] # services.gpa.models.ExecutionResult
# raw.data: iServer 返回的原始数据 dict
# raw.raw_response: 未解析的原始响应字符串(如果有)
# raw.tool_id / raw.execution_time / raw.timestamp
ctx.result = {
"success": True,
"dataset_name": raw.data.get("result") if raw.data else None,
"cost_seconds": raw.execution_time,
}
这种情况下 ctx.result 必须由 resultHandler 自己完整构建,因为默认处理已被跳过,什么都不写就相当于返回空结果。这个能力只对内部路由到 gpa 业务类型的工具生效(即普通调用 iServer GPA 算子的工具);datacatalog、db_query 等其他业务类型没有"原始值/加工值"的区分,resultHandler 对它们来说仍是用法一那种"在默认产出之上覆盖字段"的语义。
接入方式请参见开发准备中的“把扩展挂到工具上”,在工具 JSON 中配置 "resultHandler": "raw_result_hooks" 即可。