#!/usr/bin/env python3

import asyncio
import os
import sys
import yaml
import json

current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.dirname(os.path.dirname(current_dir)))

from runnable_workers.llmWorker.worker import Worker as LlmWorker
from runnable_workers.llmWorker.request.llmRequest import LlmRequest
from runnable_hub import RunnableHub
from runnable_hub.store import RunnableLocalFileStore

QWEN_SK = os.getenv("QWEN_SK")

requestYaml = f"""
    setting:
      endpoint: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
      model: qwen-plus
      secretKey: {QWEN_SK}
"""
requestYaml += """
    systemPrompt: You are a helpful assistant.
    userPrompt: 能否再精简一些?
    history:
    - role: user
      content: 请帮我使用python的正则匹配json
    - role: assistant
      content: |

        在 Python 中使用正则表达式（regex）来匹配 JSON 数据并不是一个常见的做法，因为 JSON 是一种结构化的数据格式，通常更适合使用专门的解析库（如 `json` 模块）来处理。然而，如果你确实需要使用正则表达式来匹配 JSON 的某些部分（例如提取特定的键值对），你可以结合 `re` 模块和 `json` 模块来实现。

        以下是一些示例，展示了如何使用正则表达式匹配 JSON 数据的不同部分：

        ### 示例 1：从 JSON 字符串中提取特定键的值

        假设你有一个 JSON 字符串，并且你想提取其中某个键的值。可以使用正则表达式来匹配该键及其对应的值。

        ```python
        import re
        import json

        # 示例 JSON 字符串
        json_str = '{"name": "Alice", "age": 30, "city": "New York"}'

        # 使用正则表达式匹配 "name" 键的值
        pattern = r'"name"\s*:\s*"([^"]*)"'
        match = re.search(pattern, json_str)

        if match:
            print("Name:", match.group(1))
        else:
            print("Key 'name' not found")
        ```

        ### 示例 2：从 JSON 数组中提取所有键值对

        如果你有一个包含多个对象的 JSON 数组，并且想提取每个对象中的某个键的值，可以使用正则表达式来匹配这些键值对。

        ```python
        import re
        import json

        # 示例 JSON 数组字符串
        json_str = '[{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]'

        # 使用正则表达式匹配所有的 "name" 键的值
        pattern = r'"name"\s*:\s*"([^"]*)"'
        matches = re.findall(pattern, json_str)

        if matches:
            print("Names found:", matches)
        else:
            print("No names found")
        ```

        ### 示例 3：结合 `json` 模块进行更复杂的操作

        如果你需要更复杂的操作，建议先将 JSON 字符串解析为 Python 对象，然后再进行处理。这样可以避免正则表达式的复杂性和潜在的错误。

        ```python
        import json

        # 示例 JSON 字符串
        json_str = '{"name": "Alice", "age": 30, "city": "New York"}'

        # 解析 JSON 字符串为 Python 字典
        data = json.loads(json_str)

        # 提取 "name" 键的值
        name = data.get('name')
        print("Name:", name)
        ```

        ### 示例 4：匹配 JSON 中的嵌套结构

        如果你有嵌套的 JSON 结构，并且想提取其中的某个键的值，可以使用递归或正则表达式结合解析库。

        ```python
        import re
        import json

        # 示例嵌套 JSON 字符串
        json_str = '{"user": {"name": "Alice", "details": {"age": 30, "city": "New York"}}}'

        # 使用正则表达式匹配嵌套结构中的 "age" 键的值
        pattern = r'"age"\s*:\s*(\d+)'
        match = re.search(pattern, json_str)

        if match:
            print("Age:", match.group(1))
        else:
            print("Key 'age' not found")

        # 或者使用 json 模块解析并提取
        data = json.loads(json_str)
        age = data['user']['details'].get('age')
        print("Age:", age)
        ```

        ### 总结

        虽然正则表达式可以用于匹配 JSON 数据中的某些部分，但在大多数情况下，使用 Python 的 `json` 模块来解析 JSON 数据会更加安全、可靠和高效。正则表达式适用于简单的模式匹配任务，但对于复杂的 JSON 结构，建议使用专业的解析库。

"""

async def main():

    runnableHub = RunnableHub(store=RunnableLocalFileStore("/tmp/"))
    runnableHub.registerWorker(LlmWorker())
    print(runnableHub.workers)

    runnableContext = await runnableHub.executeStart(LlmRequest.model_validate_json(json.dumps(yaml.safe_load(requestYaml))))
    runnableContext = await runnableHub.executeWait(runnableContext)

    print(json.dumps(json.loads(runnableContext.model_dump_json()), indent=4))


if __name__ == "__main__":
    asyncio.run(main())