import requests
import json
import re
import time  # 导入 time 模块

# OLLAMA_BASE_URL = "http://127.0.0.1:11434/api/generate"
# OLLAMA_BASE_URL = "http://152.136.153.72:27009/api/generate"
def extract_tags_with_ollama_from_content(ollama_base_url,model, article_content, max_tags=10, min_length=2, max_length=6):
    """
    使用本地 Ollama 大语言模型分析文章内容并提取关键词。

    Args:
        article_content (str): 输入的文章内容字符串。
        max_tags (int): 希望返回的最大标签数量。
        min_length (int): 关键词最小长度。
        max_length (int): 关键词最大长度。

    Returns:
        list: 提取到的关键词/标签列表。
    """
    if not article_content or not article_content.strip():
        return {
            'code': 0,
            'message': 'success',
            'data': {
                'model': model,
                'think': '警告：输入的文章内容为空或仅包含空白字符。',
                'tags': [],
                'consume': 0.0
            }
        }

    # 2. 构建 Prompt
    # 使用中文提示，更符合 qwen 模型的特点
    prompt = f"""
请严格按照以下要求，从提供的文章内容中提取关键词。

文章内容:
{article_content}

要求:
- 提取最多 {max_tags} 个最能概括文章主旨和核心概念的关键词。
- 关键词必须来源于文章内容，准确反映文章主题。
- 每个关键词的长度必须在 {min_length} 到 {max_length} 个字符之间。
- 输出格式为：关键词1, 关键词2, 关键词3, ...
- 只输出关键词列表，不要有任何其他解释或前缀。

"""
    # 记录开始时间
    start_time = time.time()
    # 3. 准备发送给 Ollama API 的 payload
    payload = {
        "model": model,
        "prompt": prompt,
        "system": "你是一个专门生成文章标签的助手，请你根据我给你的文章的内容总结并生成一系列的标签，格式可以参考[关键词1, 关键词2, 关键词3].你只需要给我生成这种形式的标签即可，其他分析内容无需输出.",
        "stream": False,
        "options": {
            "top_p": 0.9,
            "temperature": 0.1,  # 较低的温度使输出更确定、更聚焦
            "num_predict": 64000,  # 控制预测的最大 token 数
        }
    }

    try:
        # 4. 发送 POST 请求到 Ollama API
        response = requests.post(ollama_base_url, json=payload)
        # 5. 检查响应状态
        if response.status_code != 200:
            # print(f"Error: Ollama API returned status code {response.status_code}")
            print(response.text)
            return {
                'code': 404,
                'message': f"{response['error']}",
            }
        # 6. 解析 JSON 响应
        result = response.json()
        if "response" not in result:
            print(result)
            return {
                'code': 500,
                'message': "Error: Unexpected response format from Ollama",
            }

        llm_output = result["response"].strip()
        # print(llm_output)
        think_match = re.search(r'<think>(.*?)</think>', llm_output, re.DOTALL)
        ai_think = think_match.group(1).strip() if think_match else ""
        # 移除 <think>...</think> 标签及其内容，得到纯净的关键词列表部分
        clean_output = re.sub(r'<think>.*?</think>', '', llm_output, count=1, flags=re.DOTALL).strip()
        # 7. 简单清洗和验证关键词
        # 假设 LLM 输出格式为 "关键词1, 关键词2, ..."
        raw_tags = [tag.strip() for tag in clean_output.split(',') if tag.strip()]
        # print(raw_tags)
        # 过滤掉不符合长度要求的词
        # filtered_tags = [
        #     tag for tag in raw_tags
        #     if min_length <= len(tag) <= max_length and tag  # 忽略空字符串
        # ]
        # 去重并保持顺序
        seen = set()
        unique_filtered_tags = []
        for tag in raw_tags:
            if tag not in seen:
                seen.add(tag)
                unique_filtered_tags.append(tag)

        # 记录结束时间
        end_time = time.time()
        # 计算耗时
        elapsed_time = end_time - start_time
        return {
            'code':0,
            'message': 'success',
            'data': {
                'model': model,
                'think': ai_think,
                'tags': unique_filtered_tags,
                'consume': elapsed_time
            }
        }

    except requests.exceptions.RequestException as e:
        # print(f"Error calling Ollama API: {e}")
        return {
            'code': 500,
            'message': f"Error calling Ollama API: {e}",
        }
    except json.JSONDecodeError as e:
        # print(f"Error decoding JSON response from Ollama: {e}")
        return {
            'code': 500,
            'message': f"Error decoding JSON response from Ollama: {e}"
        }
    except Exception as e:
        # print(f"An unexpected error occurred: {e}")
        return {
            'code': 500,
            'message': f"An unexpected error occurred: {e}"
        }
