소스 검색

Update json_in_md_parser.py (#8983)

Co-authored-by: crazywoola <427733928@qq.com>
zhaoyi233 6 달 전
부모
커밋
4373777871
2개의 변경된 파일39개의 추가작업 그리고 36개의 파일을 삭제
  1. 19 19
      api/core/tools/provider/builtin/discord/tools/discord_webhook.py
  2. 20 17
      api/libs/json_in_md_parser.py

+ 19 - 19
api/core/tools/provider/builtin/discord/tools/discord_webhook.py

@@ -7,27 +7,29 @@ from core.tools.tool.builtin_tool import BuiltinTool
 
 
 class DiscordWebhookTool(BuiltinTool):
-    def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
-                ) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
+    def _invoke(
+        self, user_id: str, tool_parameters: dict[str, Any]
+    ) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
         """
-            Incoming Webhooks
-            API Document:
-                https://discord.com/developers/docs/resources/webhook#execute-webhook
+        Incoming Webhooks
+        API Document:
+            https://discord.com/developers/docs/resources/webhook#execute-webhook
         """
 
-        content = tool_parameters.get('content', '')
+        content = tool_parameters.get("content", "")
         if not content:
-            return self.create_text_message('Invalid parameter content')
+            return self.create_text_message("Invalid parameter content")
 
-        webhook_url = tool_parameters.get('webhook_url', '')
+        webhook_url = tool_parameters.get("webhook_url", "")
 
-        if not webhook_url.startswith('https://discord.com/api/webhooks/'):
+        if not webhook_url.startswith("https://discord.com/api/webhooks/"):
             return self.create_text_message(
-                f'Invalid parameter webhook_url ${webhook_url}, \
-                    not a valid Discord webhook URL')
+                f"Invalid parameter webhook_url ${webhook_url}, \
+                    not a valid Discord webhook URL"
+            )
 
         headers = {
-            'Content-Type': 'application/json',
+            "Content-Type": "application/json",
         }
         params = {}
         payload = {
@@ -35,15 +37,13 @@ class DiscordWebhookTool(BuiltinTool):
         }
 
         try:
-            res = httpx.post(webhook_url, headers=headers,
-                             params=params, json=payload)
+            res = httpx.post(webhook_url, headers=headers, params=params, json=payload)
             if res.is_success:
-                return self.create_text_message(
-                    "Text message was sent successfully")
+                return self.create_text_message("Text message was sent successfully")
             else:
                 return self.create_text_message(
                     f"Failed to send the text message, \
-                        status code: {res.status_code}, response: {res.text}")
+                        status code: {res.status_code}, response: {res.text}"
+                )
         except Exception as e:
-            return self.create_text_message(
-                "Failed to send message through webhook. {}".format(e))
+            return self.create_text_message("Failed to send message through webhook. {}".format(e))

+ 20 - 17
api/libs/json_in_md_parser.py

@@ -4,25 +4,28 @@ from core.llm_generator.output_parser.errors import OutputParserError
 
 
 def parse_json_markdown(json_string: str) -> dict:
-    # Remove the triple backticks if present
+    # Get json from the backticks/braces
     json_string = json_string.strip()
-    start_index = json_string.find("```json")
-    end_index = json_string.find("```", start_index + len("```json"))
-
-    if start_index != -1 and end_index != -1:
-        extracted_content = json_string[start_index + len("```json") : end_index].strip()
-
-        # Parse the JSON string into a Python dictionary
-        parsed = json.loads(extracted_content)
-    elif start_index != -1 and end_index == -1 and json_string.endswith("``"):
-        end_index = json_string.find("``", start_index + len("```json"))
-        extracted_content = json_string[start_index + len("```json") : end_index].strip()
-
-        # Parse the JSON string into a Python dictionary
+    starts = ["```json", "```", "``", "`", "{"]
+    ends = ["```", "``", "`", "}"]
+    end_index = -1
+    for s in starts:
+        start_index = json_string.find(s)
+        if start_index != -1:
+            if json_string[start_index] != "{":
+                start_index += len(s)
+            break
+    if start_index != -1:
+        for e in ends:
+            end_index = json_string.rfind(e, start_index)
+            if end_index != -1:
+                if json_string[end_index] == "}":
+                    end_index += 1
+                break
+    if start_index != -1 and end_index != -1 and start_index < end_index:
+        extracted_content = json_string[start_index:end_index].strip()
+        print("content:", extracted_content, start_index, end_index)
         parsed = json.loads(extracted_content)
-    elif json_string.startswith("{"):
-        # Parse the JSON string into a Python dictionary
-        parsed = json.loads(json_string)
     else:
         raise Exception("Could not find JSON block in the output.")