refactor(McpToolCallbackAdapter): 提取文本内容逻辑并增强错误处理#34
Conversation
将原有的 JSON 结果解析逻辑抽取为独立方法 `extractTextFromMcpResult()`,支持多种返回格式(JSON 数组、JSON 对象、纯文本),并对解析异常进行了更好的处理。 Co-developed-by: Aone Copilot <noreply@alibaba-inc.com>
There was a problem hiding this comment.
Pull request overview
该 PR 重构 McpToolCallbackAdapter 的 MCP 返回结果解析逻辑:将“从 MCP 结果中提取 text”抽取为独立方法,并扩展为支持 JSON 数组、JSON 对象及纯文本三类返回格式,同时在解析异常时进行更友好的降级处理。
Changes:
- 提取
extractTextFromMcpResult(),统一处理 MCP 返回结果的文本提取逻辑 - 扩展解析能力:支持
[{ "text": "..." }]、{ "text": "..." }与纯文本 - 解析失败时以 debug 日志记录并回退到原始文本返回
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| JSONObject data = array.getJSONObject(0); | ||
| if (data.containsKey("text") && data.getString("text") != null | ||
| && !data.getString("text").isEmpty()) { | ||
| return data.getString("text"); |
There was a problem hiding this comment.
这里假设 JSONArray 的第 0 个元素一定是 JSONObject:当返回为如 ["ok"]、[1] 或混合数组时,array.getJSONObject(0) 会返回 null,随后 data.containsKey(...) 会触发 NullPointerException,导致 doCall 失败。建议先判断元素类型/非空(例如先取 Object first = array.get(0) 并仅在 first instanceof JSONObject 时读取 text)。
| JSONObject data = array.getJSONObject(0); | |
| if (data.containsKey("text") && data.getString("text") != null | |
| && !data.getString("text").isEmpty()) { | |
| return data.getString("text"); | |
| Object first = array.get(0); | |
| if (first instanceof JSONObject) { | |
| JSONObject data = (JSONObject) first; | |
| if (data.containsKey("text") && data.getString("text") != null | |
| && !data.getString("text").isEmpty()) { | |
| return data.getString("text"); | |
| } |
| catch (Exception e) { | ||
| logger.debug("McpToolCallbackAdapter#extractTextFromMcpResult - reason=返回结果以'['开头但非合法JSON数组,按普通文本处理, rawToolName={}", rawToolName); | ||
| } |
There was a problem hiding this comment.
两个 catch 分支都捕获了解析异常但日志里没有打印异常信息(未把 e 作为参数传给 logger),联调/线上排查会缺少关键上下文。建议在 debug 日志中包含异常(例如作为最后一个参数传入),或至少记录 e.getMessage()。
| } | ||
| } | ||
| catch (Exception e) { | ||
| logger.debug("McpToolCallbackAdapter#extractTextFromMcpResult - reason=返回结果以'{{'开头但非合法JSON对象,按普通文本处理, rawToolName={}", rawToolName); |
There was a problem hiding this comment.
日志文案里写的是“以'{{'开头”,但这里实际判断的是 trimmed.startsWith("{")。建议把日志中的 {{ 更正为 {,避免误导排查。
| logger.debug("McpToolCallbackAdapter#extractTextFromMcpResult - reason=返回结果以'{{'开头但非合法JSON对象,按普通文本处理, rawToolName={}", rawToolName); | |
| logger.debug("McpToolCallbackAdapter#extractTextFromMcpResult - reason=返回结果以'{'开头但非合法JSON对象,按普通文本处理, rawToolName={}", rawToolName); |
将原有的 JSON 结果解析逻辑抽取为独立方法
extractTextFromMcpResult(),支持多种返回格式(JSON 数组、JSON 对象、纯文本),并对解析异常进行了更好的处理。