Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/alxeq_chat2.0.json
T

1 line
9.8 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "alxeq/chat2.0", "files": {".streamlit/secrets.toml": {"1fcdc025313f365e5add0f902aa93cc6fb33ac06": {"t": 1785745365.266936, "n": 157, "h": "faaeba11fe8855d6", "c": "[default]\nDEEPSEEK_API_KEY = \"sk-74a04f4828894b739c8629de9a11818c![image](https://github.com/user-attachments/assets/4900bf59-cc95-4cae-8610-de3da39790b3)\n\"\n"}}, "app.dy": {"1fcdc025313f365e5add0f902aa93cc6fb33ac06": {"t": 1785746382.9771457, "n": 3840, "h": "b5c5b0c2a04eb55e", "c": "import os\r\nimport pandas as pd\r\nimport docx2txt\r\nimport tempfile\r\nimport pdfplumber\r\nimport requests\r\nimport streamlit as st\r\n\r\n# 从环境变量读取 DeepSeek API Key\r\nDEEPSEEK_API_KEY = os.environ.get(\"DEEPSEEK_API_KEY\")\r\n\r\ndef call_deepseek_api(prompt):\r\n url = \"https://api.deepseek.com/v1/chat/completions\"\r\n headers = {\r\n \"Content-Type\": \"application/json\",\r\n \"Authorization\": f\"Bearer {DEEPSEEK_API_KEY}\"\r\n }\r\n data = {\r\n \"model\": \"deepseek-chat\",\r\n \"messages\": [{\"role\": \"user\", \"content\": prompt}],\r\n \"temperature\": 0.7\r\n }\r\n response = requests.post(url, headers=headers, json=data)\r\n if response.status_code == 200:\r\n return response.json()['choices'][0]['message']['content']\r\n else:\r\n return f\"调用 DeepSeek API 失败,状态码 {response.status_code}: {response.text}\"\r\n\r\ndef extract_text_from_pdf(uploaded_file):\r\n text = \"\"\r\n with pdfplumber.open(uploaded_file) as pdf:\r\n for page in pdf.pages:\r\n page_text = page.extract_text()\r\n if page_text:\r\n text += page_text + \"\\n\"\r\n return text\r\n\r\ndef extract_text_from_docx(uploaded_file):\r\n with tempfile.NamedTemporaryFile(delete=False, suffix=\".docx\") as tmp:\r\n tmp.write(uploaded_file.read())\r\n tmp.flush()\r\n text = docx2txt.process(tmp.name)\r\n return text\r\n\r\ndef extract_text(file):\r\n if file.name.endswith(\".pdf\"):\r\n return extract_text_from_pdf(file)\r\n elif file.name.endswith(\".docx\"):\r\n return extract_text_from_docx(file)\r\n elif file.name.endswith(\".txt\"):\r\n return file.read().decode(\"utf-8\")\r\n else:\r\n return \"不支持的文件类型\"\r\n\r\ndef analyze_interview(transcript, outline):\r\n prompt = f\"\"\"\r\n你是一个访谈内容分析助手。请根据以下访谈大纲,对访谈内容进行结构化整理。\r\n\r\n访谈大纲:\r\n{outline}\r\n\r\n访谈记录:\r\n{transcript}\r\n\r\n请生成一个表格,包含以下列:\r\n- 大纲问题\r\n- 匹配内容摘要\r\n- 覆盖情况(充分 / 部分 / 未覆盖)\r\n- 建议补问\r\n\r\n请以markdown表格格式返回结果。\r\n\"\"\"\r\n return call_deepseek_api(prompt)\r\n\r\n# 新增 Markdown 表格解析函数\r\ndef parse_markdown_table(md_text):\r\n lines = [line for line in md_text.split('\\n') if line.strip().startswith('|')]\r\n if len(lines) < 2:\r\n return None\r\n\r\n header = [col.strip() for col in lines[0].strip().strip('|').split('|')]\r\n rows = []\r\n for line in lines[2:]:\r\n cols = [col.strip() for col in line.strip().strip('|').split('|')]\r\n if len(cols) == len(header):\r\n rows.append(cols)\r\n\r\n return pd.DataFrame(rows, columns=header)\r\n\r\ndef main():\r\n st.set_page_config(page_title=\"访谈结构整理工具\", layout=\"wide\")\r\n st.title(\"📋 访谈结构整理 MVP 工具\")\r\n\r\n st.markdown(\"### 第一步:上传访谈文件(pdf、docx、txt)\")\r\n interview_file = st.file_uploader(\"上传访谈记录文件:\", type=[\"pdf\", \"docx\", \"txt\"])\r\n\r\n st.markdown(\"### 第二步:上传访谈大纲(docx、txt)\")\r\n outline_file = st.file_uploader(\"上传访谈大纲文件:\", type=[\"docx\", \"txt\"])\r\n\r\n if st.button(\"🚀 开始分析\") and interview_file and outline_file:\r\n with st.spinner(\"⏳ 正在提取与分析内容,请稍候...\"):\r\n transcript = extract_text(interview_file)\r\n outline = extract_text(outline_file)\r\n\r\n result_markdown = analyze_interview(transcript, outline)\r\n\r\n st.markdown(\"### ✅ 分析结果\")\r\n st.markdown(result_markdown, unsafe_allow_html=True)\r\n\r\n # 替换导出按钮逻辑\r\n try:\r\n df = parse_markdown_table(result_markdown)\r\n if df is not None:\r\n st.download_button(\r\n label=\"📥 下载结果为 Excel\",\r\n data=df.to_excel(index=False, engine='openpyxl'),\r\n file_name=\"interview_analysis.xlsx\",\r\n mime=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n )\r\n else:\r\n st.warning(\"⚠️ 未能识别 Markdown 表格,请检查输出格式是否正确。\")\r\n except Exception as e:\r\n st.error(f\"❌ 转换结果失败:{e}\")\r\n\r\nif __name__ == \"__main__\":\r\n main()\r\n"}, "cd7c39223c6e2c46d2238950debe46ce898db333": {"t": 1785750768.1576338, "n": 3840, "h": "b5c5b0c2a04eb55e", "c": "import os\r\nimport pandas as pd\r\nimport docx2txt\r\nimport tempfile\r\nimport pdfplumber\r\nimport requests\r\nimport streamlit as st\r\n\r\n# 从环境变量读取 DeepSeek API Key\r\nDEEPSEEK_API_KEY = os.environ.get(\"DEEPSEEK_API_KEY\")\r\n\r\ndef call_deepseek_api(prompt):\r\n url = \"https://api.deepseek.com/v1/chat/completions\"\r\n headers = {\r\n \"Content-Type\": \"application/json\",\r\n \"Authorization\": f\"Bearer {DEEPSEEK_API_KEY}\"\r\n }\r\n data = {\r\n \"model\": \"deepseek-chat\",\r\n \"messages\": [{\"role\": \"user\", \"content\": prompt}],\r\n \"temperature\": 0.7\r\n }\r\n response = requests.post(url, headers=headers, json=data)\r\n if response.status_code == 200:\r\n return response.json()['choices'][0]['message']['content']\r\n else:\r\n return f\"调用 DeepSeek API 失败,状态码 {response.status_code}: {response.text}\"\r\n\r\ndef extract_text_from_pdf(uploaded_file):\r\n text = \"\"\r\n with pdfplumber.open(uploaded_file) as pdf:\r\n for page in pdf.pages:\r\n page_text = page.extract_text()\r\n if page_text:\r\n text += page_text + \"\\n\"\r\n return text\r\n\r\ndef extract_text_from_docx(uploaded_file):\r\n with tempfile.NamedTemporaryFile(delete=False, suffix=\".docx\") as tmp:\r\n tmp.write(uploaded_file.read())\r\n tmp.flush()\r\n text = docx2txt.process(tmp.name)\r\n return text\r\n\r\ndef extract_text(file):\r\n if file.name.endswith(\".pdf\"):\r\n return extract_text_from_pdf(file)\r\n elif file.name.endswith(\".docx\"):\r\n return extract_text_from_docx(file)\r\n elif file.name.endswith(\".txt\"):\r\n return file.read().decode(\"utf-8\")\r\n else:\r\n return \"不支持的文件类型\"\r\n\r\ndef analyze_interview(transcript, outline):\r\n prompt = f\"\"\"\r\n你是一个访谈内容分析助手。请根据以下访谈大纲,对访谈内容进行结构化整理。\r\n\r\n访谈大纲:\r\n{outline}\r\n\r\n访谈记录:\r\n{transcript}\r\n\r\n请生成一个表格,包含以下列:\r\n- 大纲问题\r\n- 匹配内容摘要\r\n- 覆盖情况(充分 / 部分 / 未覆盖)\r\n- 建议补问\r\n\r\n请以markdown表格格式返回结果。\r\n\"\"\"\r\n return call_deepseek_api(prompt)\r\n\r\n# 新增 Markdown 表格解析函数\r\ndef parse_markdown_table(md_text):\r\n lines = [line for line in md_text.split('\\n') if line.strip().startswith('|')]\r\n if len(lines) < 2:\r\n return None\r\n\r\n header = [col.strip() for col in lines[0].strip().strip('|').split('|')]\r\n rows = []\r\n for line in lines[2:]:\r\n cols = [col.strip() for col in line.strip().strip('|').split('|')]\r\n if len(cols) == len(header):\r\n rows.append(cols)\r\n\r\n return pd.DataFrame(rows, columns=header)\r\n\r\ndef main():\r\n st.set_page_config(page_title=\"访谈结构整理工具\", layout=\"wide\")\r\n st.title(\"📋 访谈结构整理 MVP 工具\")\r\n\r\n st.markdown(\"### 第一步:上传访谈文件(pdf、docx、txt)\")\r\n interview_file = st.file_uploader(\"上传访谈记录文件:\", type=[\"pdf\", \"docx\", \"txt\"])\r\n\r\n st.markdown(\"### 第二步:上传访谈大纲(docx、txt)\")\r\n outline_file = st.file_uploader(\"上传访谈大纲文件:\", type=[\"docx\", \"txt\"])\r\n\r\n if st.button(\"🚀 开始分析\") and interview_file and outline_file:\r\n with st.spinner(\"⏳ 正在提取与分析内容,请稍候...\"):\r\n transcript = extract_text(interview_file)\r\n outline = extract_text(outline_file)\r\n\r\n result_markdown = analyze_interview(transcript, outline)\r\n\r\n st.markdown(\"### ✅ 分析结果\")\r\n st.markdown(result_markdown, unsafe_allow_html=True)\r\n\r\n # 替换导出按钮逻辑\r\n try:\r\n df = parse_markdown_table(result_markdown)\r\n if df is not None:\r\n st.download_button(\r\n label=\"📥 下载结果为 Excel\",\r\n data=df.to_excel(index=False, engine='openpyxl'),\r\n file_name=\"interview_analysis.xlsx\",\r\n mime=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n )\r\n else:\r\n st.warning(\"⚠️ 未能识别 Markdown 表格,请检查输出格式是否正确。\")\r\n except Exception as e:\r\n st.error(f\"❌ 转换结果失败:{e}\")\r\n\r\nif __name__ == \"__main__\":\r\n main()\r\n"}}}}