import re
import traceback
from openai import OpenAI


#     "model": "glm-4.5",
#     "base_url": "https://open.bigmodel.cn/api/paas/v4/",
#     "api_key": "ce39bdd4fcf34ec0aec75072bc9ff988.hAp7HZTVUwy7vImn"



EXTRACT_OUNTLINE_SYSTEM_PROMPT = """
## 角色
你是一位专业的内容结构分析专家。你的核心任务是精确解析用户提供的文章内容，并将其转换为标准的Markdown格式。

## 任务
根据用户提供的文章内容，执行以下分析步骤：
1.  **提取主标题：** 精确识别并提取文章最顶层的**主标题**（通常为文章题目或书名）。
2.  **构建标题大纲：**
    *   从文章中**第一个具体的内容标题**（即忽略文章主标题之后出现的第一个具有层级意义的标题）开始提取。
    *   提取所有层级的**内容标题**（Level 1 至 Level 4，Level 1 为最高级）。
    *   **精确保留**原文中的标题文字，不得进行任何修改、概括或润色。
    *   判断标题层级的依据：
        *   **视觉与结构特征：** 是否独立成行/段、位置（如行首）、格式（如加粗、字体大小、编号 `1.`, `1.1`, `(1)`, `-` 等）。
        *   **语义逻辑：** 标题之间的包含、并列关系。
3.  **分析每个标题对应的正文内容区块：** 对于大纲中的每个标题项，分析其**直接管辖**的正文内容区块（即从该标题后开始，直到下一个**同级或更高级别**标题出现之前的所有文本内容）。
    *   保留原文的核心内容
    *   可以适当概括和整理，但保持原意
    *   对于列表项，使用Markdown列表格式

## 输出格式
*   结果**必须**以**纯无序列表格式**输出。
*   使用标准的Markdown无序列表语法：
    *   所有内容都使用 `- 内容` 格式
    *   不同层级通过缩进表示（2个空格一个层级）
    *   第一层：主标题/主题
    *   第二层：主要章节/分类
    *   第三层：子章节/子分类
    *   第四层：具体内容/要点
    *   第五层：详细说明/子要点
*   特殊内容处理：
    *   对于数字、代码、公式等特殊内容，保持原格式
    *   对于引用内容，使用简洁的描述
    *   对于表格数据，转换为要点列表形式
*   SSE流式输出优化：
    *   确保每个列表项都是完整的语义单元
    *   避免在列表项中间断句
    *   保持层级结构的逻辑性
*   错误处理指导：
    *   如果原文结构不清晰，优先保证逻辑性
    *   如果遇到无法分类的内容，归类到最相关的上级节点
    *   保持输出格式的一致性
*   示例格式：
```markdown
- 人工智能的发展历程
  - 早期发展
    - 人工智能的概念最早可以追溯到1950年代
    - 图灵测试的提出标志着AI研究的开始
    - 图灵测试
      - 图灵测试是判断机器是否具有智能的重要标准
      - 通过对话测试来评估机器智能
  - 现代发展
    - 近年来深度学习技术的突破推动了AI的快速发展
    - 深度学习
      - 深度学习通过神经网络模拟人脑的工作方式
      - 在图像识别、自然语言处理等领域取得重大突破
      - 主要技术
        - 卷积神经网络（CNN）
        - 循环神经网络（RNN）
        -  Transformer架构

- 技术文档示例
  - 安装指南
    - 系统要求
      - Windows 10或更高版本
      - 至少4GB内存
      - 支持OpenGL 3.3的显卡
    - 安装步骤
      - 下载安装包
      - 运行安装程序
      - 配置环境变量
  - 使用说明
    - 基本操作
      - 启动应用程序
      - 创建新项目
      - 保存文件
    - 高级功能
      - 自定义设置
      - 插件管理
      - 数据导出
```
"""



def llm_format_text(model, base_url, api_key, messages, max_tokens):
    all_content = ""
    all_reasoning_content = ""
    client = OpenAI(api_key=api_key, base_url=base_url)
    try:
        try:
            response = client.chat.completions.create(
                model=model,
                messages=messages,
                temperature=0.99,
                top_p=0.5,
                max_tokens=max_tokens,
                stream=True,
                extra_body={
                    "thinking": {
                        # "type": "enabled",
                        "type": "disabled"
                    },
                }
            )
        except Exception as e:
            print(f"--llm_format_text------异常报错：e={e}-----启用新的llm方式-----")
            response = client.chat.completions.create(
                model=model,
                messages=messages,
                temperature=0.99,
                top_p=0.5,
                max_tokens=max_tokens,
                stream=True
            )
        # 获取内容
        for chunk in response:
            content = ""
            reasoning_content = ""
            try:
                # 判断是 思维链 还是 最终回答
                if (hasattr(chunk.choices[0].delta, "reasoning_content") and chunk.choices[0].delta.reasoning_content and (0 < len(chunk.choices[0].delta.reasoning_content))):
                    reasoning_content = (chunk.choices[0].delta.reasoning_content if chunk.choices[0].delta.reasoning_content else "")
                    print(reasoning_content)
                    all_reasoning_content = all_reasoning_content + reasoning_content
                else:
                    content = (chunk.choices[0].delta.content if chunk.choices[0].delta.content else "")
                    print(content)
                    all_content = all_content + content
            except Exception as e:
                print(f"--llm_format_text---1---异常报错：e={e}----------")
                traceback.print_exc()
                print(f'------------------------------------------------')
                print(chunk)
                print(f'------------------------------------------------')
    except Exception as e:
        print(f"--llm_format_text--2----异常报错：e={e}----------")
        traceback.print_exc()
        print(f'------------------------------------------------')
    # 整个 stream 调用就结束了
    # 尝试提取 Markdown 内容
    markdown_match = re.search(r"```(?:[^\n]*)\n(.*?)```", all_content, re.DOTALL)
    if markdown_match:
        all_content = markdown_match.group(1)
    # 返回
    return all_content