Initial commit: 胡汉三千年项目 - 北朝宇宙理论体系

This commit is contained in:
ben
2025-10-15 07:01:04 +00:00
commit 3b21c65457
2566 changed files with 1867622 additions and 0 deletions

View File

@@ -0,0 +1,87 @@
#!/usr/bin/env python3
"""
批量转换PDF文件为Markdown格式并提取图片
"""
import os
import subprocess
import sys
def convert_pdf_to_markdown(pdf_file, output_dir="converted", image_dir="images"):
"""转换单个PDF文件"""
# 获取文件名(不含扩展名和路径)
base_name = os.path.splitext(os.path.basename(pdf_file))[0]
# 创建输出文件名
output_file = os.path.join(output_dir, f"{base_name}.md")
# 创建图片目录
image_subdir = os.path.join(image_dir, base_name)
os.makedirs(image_subdir, exist_ok=True)
print(f"正在处理: {pdf_file}")
# 转换PDF为Markdown
try:
cmd = ["markitdown", pdf_file, "-o", output_file]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
print(f"转换失败: {pdf_file}")
print(f"错误: {result.stderr}")
return False
print(f"✓ Markdown转换完成: {output_file}")
except Exception as e:
print(f"转换异常: {pdf_file} - {e}")
return False
# 提取图片
try:
cmd = ["pdfimages", pdf_file, os.path.join(image_subdir, "image")]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
print(f"图片提取失败: {pdf_file}")
print(f"错误: {result.stderr}")
return False
# 转换PPM为PNG
ppm_files = [f for f in os.listdir(image_subdir) if f.endswith('.ppm')]
if ppm_files:
for ppm_file in ppm_files:
png_file = ppm_file.replace('.ppm', '.png')
cmd = ["convert", os.path.join(image_subdir, ppm_file),
os.path.join(image_subdir, png_file)]
subprocess.run(cmd, capture_output=True)
print(f"✓ 图片转换完成: {len(ppm_files)}张图片")
print(f"✓ 处理完成: {pdf_file}")
return True
except Exception as e:
print(f"图片处理异常: {pdf_file} - {e}")
return False
def main():
"""主函数"""
# 获取所有PDF文件
pdf_dir = "documents/pdfs"
pdf_files = [f for f in os.listdir(pdf_dir) if f.endswith('.pdf')]
pdf_files.sort() # 按文件名排序
print(f"找到 {len(pdf_files)} 个PDF文件")
# 创建输出目录
os.makedirs("converted", exist_ok=True)
os.makedirs("images", exist_ok=True)
success_count = 0
for pdf_file in pdf_files:
pdf_path = os.path.join(pdf_dir, pdf_file)
if convert_pdf_to_markdown(pdf_path):
success_count += 1
print("-" * 50)
print(f"\n处理完成!成功转换 {success_count}/{len(pdf_files)} 个文件")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,59 @@
#!/usr/bin/env python3
"""
使用月之暗面 Moonshot AI 进行代码生成
月之暗面提供强大的中文代码生成能力
"""
import os
from openai import OpenAI
def generate_code(client, description):
"""使用月之暗面 API 生成代码"""
try:
response = client.chat.completions.create(
model="moonshot-v1-8k", # 月之暗面模型
messages=[
{
"role": "system",
"content": "你是一个专业的程序员助手,专门帮助生成高质量的代码。"
},
{
"role": "user",
"content": f"请生成以下功能的 Python 代码:{description}"
}
],
max_tokens=500,
temperature=0.1
)
return response.choices[0].message.content
except Exception as e:
return f"错误: {e}"
def main():
# 使用月之暗面的配置
api_key = "sk-lEk0pAIZ1EDgUkflq2is5uT2VbhuoKGpO5sNOSnuuccsD68r"
base_url = "https://api.moonshot.cn/v1"
# 初始化客户端
client = OpenAI(
api_key=api_key,
base_url=base_url
)
# 示例:生成不同类型的代码
examples = [
"一个计算两个数字最大公约数的函数",
"一个简单的 HTTP 服务器类",
"一个数据验证装饰器"
]
for i, description in enumerate(examples, 1):
print(f"\n=== 示例 {i}: {description} ===")
code = generate_code(client, description)
print(code)
print("-" * 50)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,52 @@
#!/usr/bin/env python3
"""
月之暗面 Moonshot AI 使用示例
使用月之暗面的 API 进行代码生成
"""
import os
from openai import OpenAI
def main():
# 使用月之暗面的 API key 和 base URL
api_key = "sk-lEk0pAIZ1EDgUkflq2is5uT2VbhuoKGpO5sNOSnuuccsD68r"
base_url = "https://api.moonshot.cn/v1"
# 初始化客户端
client = OpenAI(
api_key=api_key,
base_url=base_url
)
# 代码生成示例
prompt = """
# 创建一个 Python 函数来计算斐波那契数列
def fibonacci(n):
"""
try:
# 月之暗面使用 chat completions API
response = client.chat.completions.create(
model="moonshot-v1-8k", # 月之暗面的模型
messages=[
{
"role": "system",
"content": "你是一个专业的程序员助手,专门帮助生成高质量的代码。"
},
{
"role": "user",
"content": f"请完成以下 Python 代码:\n{prompt}"
}
],
max_tokens=150,
temperature=0.1
)
print("生成的代码:")
print(response.choices[0].message.content)
except Exception as e:
print(f"错误: {e}")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,80 @@
#!/usr/bin/env python3
"""
图片分析工具 - 使用月之暗面 API 分析图片内容
"""
import base64
import os
from openai import OpenAI
def encode_image(image_path):
"""将图片编码为 base64"""
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
def analyze_image(image_path, prompt="请详细描述这张图片的内容"):
"""分析图片内容"""
# 月之暗面配置
client = OpenAI(
api_key="sk-lEk0pAIZ1EDgUkflq2is5uT2VbhuoKGpO5sNOSnuuccsD68r",
base_url="https://api.moonshot.cn/v1"
)
# 编码图片
base64_image = encode_image(image_path)
try:
response = client.chat.completions.create(
model="moonshot-v1-8k",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{base64_image}"
}
}
]
}
],
max_tokens=1000
)
return response.choices[0].message.content
except Exception as e:
return f"分析失败: {e}"
def batch_analyze_images(image_dir, output_file="image_analysis.md"):
"""批量分析图片"""
results = []
# 获取所有 PNG 图片
png_files = [f for f in os.listdir(image_dir) if f.endswith('.png')]
png_files.sort() # 按文件名排序
for filename in png_files:
image_path = os.path.join(image_dir, filename)
print(f"正在分析: {filename}")
analysis = analyze_image(
image_path,
"请详细描述这张图片的内容,包括文字、图表、人物、建筑等所有可见元素"
)
results.append(f"## {filename}\n\n{analysis}\n\n---\n")
# 保存结果
with open(output_file, 'w', encoding='utf-8') as f:
f.write("# 图片分析结果\n\n")
f.writelines(results)
print(f"分析完成,结果保存到: {output_file}")
if __name__ == "__main__":
# 示例:分析序章的图片
image_dir = "images/0 序令人又敬又畏的_忽里勒台_大会"
batch_analyze_images(image_dir, "序章图片分析.md")

View File

@@ -0,0 +1,226 @@
#!/usr/bin/env python3
"""
圐圙文化网络演示 - 使用现有 Neo4j 实例
运行前请确保 Neo4j 容器已启动docker start neo4j-gpu 或 neo4j-cpu
"""
from neo4j import GraphDatabase
import json
class KulueNetworkDemo:
def __init__(self, uri="bolt://localhost:7687", user="neo4j", password="password"):
"""连接到现有的 Neo4j 实例"""
try:
self.driver = GraphDatabase.driver(uri, auth=(user, password))
# 测试连接
with self.driver.session() as session:
session.run("RETURN 1")
print("✅ 成功连接到 Neo4j 数据库")
except Exception as e:
print(f"❌ 连接失败: {e}")
print("请确保 Neo4j 容器已启动docker start neo4j-gpu")
self.driver = None
def close(self):
if self.driver:
self.driver.close()
def demo_kulue_concepts(self):
"""演示圐圙核心概念"""
if not self.driver:
return
print("\n🎯 圐圙文化网络核心概念演示")
print("=" * 50)
# 核心概念数据
concepts = {
"圐圙": {
"含义": "天下、穹庐",
"来源": "蒙古语 küriye",
"文化意义": "天似穹庐,笼盖四下",
"相关词汇": ["库伦", "固伦", "克烈", "昆仑"]
},
"忽里勒台": {
"含义": "大会、议事",
"来源": "蒙古语 Hurul'tai",
"文化意义": "长生天见证的神圣会议",
"相关概念": ["独贵龙", "圐圙"]
},
"索永布": {
"含义": "蒙古文字符号",
"结构": "智慧之火 + 日月 + 圐圙地象",
"文化意义": "蒙古民族的宇宙观",
"相关概念": ["阿胡拉·马兹达", "长生天"]
}
}
for concept, details in concepts.items():
print(f"\n📚 {concept}")
for key, value in details.items():
if isinstance(value, list):
print(f" {key}: {', '.join(value)}")
else:
print(f" {key}: {value}")
def demo_word_network(self):
"""演示词汇网络关系"""
print("\n🔗 圐圙词根网络关系")
print("=" * 50)
# 词汇关系网络
word_network = {
"昆仑": {
"音转": ["库伦", "固伦", "克烈", "崆峒", "洪洞"],
"同义": ["祁连", "轩辕", "贺兰"],
"含义": "神山、天"
},
"轱辘": {
"音转": ["辘轳", "囫囵"],
"功能": "圆形、转动",
"含义": "车轮、井具"
},
"圐圙": {
"音转": ["忽里勒台"],
"政治": ["库伦", "固伦"],
"含义": "天下、穹庐"
}
}
for word, relations in word_network.items():
print(f"\n🔤 {word}")
for relation_type, related_words in relations.items():
if isinstance(related_words, list):
print(f" {relation_type}: {''.join(related_words)}")
else:
print(f" {relation_type}: {related_words}")
def demo_three_empires(self):
"""演示三个帝国框架"""
print("\n🏛️ 三个帝国框架")
print("=" * 50)
empires = {
"第一帝国:长城": {
"时期": "夏商周秦 → 汉三国南北朝",
"象征": "秦始皇横接三国长城",
"意义": "400毫米等降雨量线华夏大防",
"核心": "从黄河到长城,中华文明重心"
},
"第二帝国:运河": {
"时期": "隋唐五代 → 辽金夏宋",
"象征": "隋炀帝纵贯五河",
"意义": "南北统一,国家认同",
"核心": "黄河与长江都是一个国家认同"
},
"第三帝国:圐圙": {
"时期": "蒙元 → 明清民国",
"象征": "忽必烈经略东亚",
"意义": "汉字文化圈认同",
"核心": "认同只与内心相连,无关血脉"
}
}
for empire, details in empires.items():
print(f"\n👑 {empire}")
for key, value in details.items():
print(f" {key}: {value}")
def demo_cultural_analysis(self):
"""演示文化分析框架"""
print("\n🎨 文化分析框架")
print("=" * 50)
analysis = {
"北朝宇宙理论": {
"地理逻辑": "东西阻隔,南北通透",
"政治模式": "游牧民族南下逐鹿中原",
"文化特征": "胡汉交融,多元一体"
},
"晋语活化石": {
"语言特征": "胡汉交融的语言遗存",
"词汇特点": "大量连绵词、借词",
"文化价值": "保存古代语音和词汇"
},
"符号系统": {
"索永布": "蒙古民族宇宙观",
"姑姑帽": "昆仑帽的音转",
"圐圙地象": "太极图 + 南下箭头"
}
}
for framework, details in analysis.items():
print(f"\n🔍 {framework}")
for key, value in details.items():
print(f" {key}: {value}")
def generate_cypher_examples(self):
"""生成 Cypher 查询示例"""
print("\n💻 Neo4j Cypher 查询示例")
print("=" * 50)
queries = [
{
"描述": "创建圐圙核心节点",
"查询": """
CREATE (kulue:Concept {
name: '圐圙',
meaning: '天下、穹庐',
origin: '蒙古语 küriye',
category: '核心概念'
})
"""
},
{
"描述": "创建词汇音转关系",
"查询": """
MATCH (source:Word {name: '昆仑'})
MATCH (target:Word {name: '库伦'})
CREATE (source)-[:SOUND_SHIFT {type: '音转', confidence: 0.9}]->(target)
"""
},
{
"描述": "查找圐圙相关词汇",
"查询": """
MATCH (kulue:Concept {name: '圐圙'})-[r*1..2]-(related)
RETURN kulue.name, type(r), related.name, related.meaning
"""
},
{
"描述": "分析词汇演化路径",
"查询": """
MATCH path = (start:Word {name: '昆仑'})-[:SOUND_SHIFT*1..3]-(end:Word)
RETURN [node in nodes(path) | node.name] as evolution_path
"""
}
]
for i, query in enumerate(queries, 1):
print(f"\n{i}. {query['描述']}")
print(f"```cypher{query['查询']}```")
def main():
"""主演示函数"""
print("🎯 忽汗3000文化项目 - 圐圙网络演示")
print("=" * 60)
demo = KulueNetworkDemo()
try:
demo.demo_kulue_concepts()
demo.demo_word_network()
demo.demo_three_empires()
demo.demo_cultural_analysis()
demo.generate_cypher_examples()
print("\n🚀 下一步建议:")
print("1. 启动 Neo4j 容器docker start neo4j-gpu")
print("2. 访问 Neo4j Browserhttp://localhost:7474")
print("3. 运行 Cypher 查询构建完整网络")
print("4. 使用可视化工具展示词汇关系")
finally:
demo.close()
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,120 @@
#!/usr/bin/env python3
"""
月之暗面代码生成示例
展示如何使用 Kimi 进行各种代码生成任务
"""
from moonshot_config import get_moonshot_client
def generate_function(description, language="Python"):
"""生成函数代码"""
client = get_moonshot_client()
prompt = f"""
请用 {language} 编写一个函数:{description}
要求:
1. 包含完整的函数定义
2. 添加适当的注释和文档字符串
3. 包含错误处理(如果需要)
4. 提供使用示例
请只返回代码,不要额外的解释。
"""
try:
response = client.chat.completions.create(
model="moonshot-v1-8k",
messages=[
{
"role": "system",
"content": "你是一个专业的程序员,擅长编写高质量、可维护的代码。"
},
{
"role": "user",
"content": prompt
}
],
max_tokens=800,
temperature=0.1
)
return response.choices[0].message.content
except Exception as e:
return f"生成失败: {e}"
def explain_code(code):
"""解释代码功能"""
client = get_moonshot_client()
prompt = f"""
请详细解释以下代码的功能、逻辑和关键点:
```
{code}
```
请用中文回答,包括:
1. 代码的主要功能
2. 关键算法或逻辑
3. 可能的改进建议
"""
try:
response = client.chat.completions.create(
model="moonshot-v1-8k",
messages=[
{
"role": "system",
"content": "你是一个代码审查专家,擅长分析和解释代码。"
},
{
"role": "user",
"content": prompt
}
],
max_tokens=600,
temperature=0.2
)
return response.choices[0].message.content
except Exception as e:
return f"解释失败: {e}"
def main():
print("=== 月之暗面代码生成示例 ===\n")
# 示例1生成排序函数
print("1. 生成快速排序函数:")
print("-" * 40)
code1 = generate_function("实现快速排序算法,对整数列表进行排序")
print(code1)
print("\n" + "=" * 60 + "\n")
# 示例2生成数据处理函数
print("2. 生成数据处理函数:")
print("-" * 40)
code2 = generate_function("读取CSV文件并计算数值列的统计信息均值、中位数、标准差")
print(code2)
print("\n" + "=" * 60 + "\n")
# 示例3解释代码
sample_code = """
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
"""
print("3. 代码解释示例:")
print("-" * 40)
print("原代码:")
print(sample_code)
print("\n解释:")
explanation = explain_code(sample_code)
print(explanation)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,48 @@
#!/usr/bin/env python3
"""
月之暗面 Moonshot AI 配置文件
"""
from openai import OpenAI
# 月之暗面配置
MOONSHOT_API_KEY = "sk-lEk0pAIZ1EDgUkflq2is5uT2VbhuoKGpO5sNOSnuuccsD68r"
MOONSHOT_BASE_URL = "https://api.moonshot.cn/v1"
# 可用的模型
MOONSHOT_MODELS = [
"moonshot-v1-8k", # 8K 上下文
"moonshot-v1-32k", # 32K 上下文
"moonshot-v1-128k" # 128K 上下文
]
def get_moonshot_client():
"""获取月之暗面客户端"""
return OpenAI(
api_key=MOONSHOT_API_KEY,
base_url=MOONSHOT_BASE_URL
)
def test_connection():
"""测试连接"""
client = get_moonshot_client()
try:
response = client.chat.completions.create(
model="moonshot-v1-8k",
messages=[
{"role": "user", "content": "你好,请简单介绍一下你自己"}
],
max_tokens=100
)
print("连接成功!")
print("回复:", response.choices[0].message.content)
return True
except Exception as e:
print(f"连接失败: {e}")
return False
if __name__ == "__main__":
test_connection()

View File

@@ -0,0 +1,143 @@
// 圐圙文化网络 - Neo4j Cypher 查询集合
// ===== 基础查询 =====
// 1. 查看所有词汇节点
MATCH (w:Word)
RETURN w.name, w.category, w.meaning, w.region, w.dynasty
ORDER BY w.category, w.name;
// 2. 查看所有关系类型
MATCH ()-[r]-()
RETURN DISTINCT type(r) as relationship_types;
// ===== 圐圙词根网络分析 =====
// 3. 以"昆仑"为中心的词汇网络
MATCH (center:Word {name: '昆仑'})-[r]-(connected:Word)
RETURN center, r, connected;
// 4. 查找所有音转关系
MATCH (source:Word)-[r:SOUND_SHIFT]->(target:Word)
RETURN source.name as 源词, target.name as 目标词, r.type as 关系类型;
// 5. 查找音转路径最多3步
MATCH path = (start:Word {name: '昆仑'})-[:SOUND_SHIFT*1..3]-(end:Word)
RETURN
start.name as 起点,
[node in nodes(path) | node.name] as 路径,
end.name as 终点,
length(path) as 步数
ORDER BY 步数;
// ===== 语义分析 =====
// 6. 按类别分组的词汇分布
MATCH (w:Word)
RETURN w.category as 类别, collect(w.name) as 词汇列表, count(w) as 数量
ORDER BY 数量 DESC;
// 7. 按朝代分组的词汇演化
MATCH (w:Word)
RETURN w.dynasty as 朝代, collect(w.name) as 词汇, count(w) as 数量
ORDER BY
CASE w.dynasty
WHEN '先秦' THEN 1
WHEN '汉' THEN 2
WHEN '唐' THEN 3
WHEN '宋' THEN 4
WHEN '元' THEN 5
WHEN '明' THEN 6
WHEN '清' THEN 7
ELSE 8
END;
// 8. 按地区分布的词汇地理分析
MATCH (w:Word)
WHERE w.region IS NOT NULL
RETURN w.region as 地区, collect(w.name) as 词汇, count(w) as 数量
ORDER BY 数量 DESC;
// ===== 高级分析查询 =====
// 9. 查找"圐圙"的完整关联网络
MATCH (kulue:Word {name: '圐圙'})-[r*1..2]-(related:Word)
RETURN kulue, r, related;
// 10. 查找同时具有音转和语义关系的词汇对
MATCH (w1:Word)-[:SOUND_SHIFT]-(w2:Word)
MATCH (w1)-[:SEMANTIC]-(w2)
RETURN w1.name, w2.name, '既有音转又有语义关系' as 关系特征;
// 11. 查找每个类别中的核心词汇(关联最多的)
MATCH (w:Word)-[r]-(connected:Word)
WITH w, count(r) as connections
WHERE connections > 1
RETURN w.category as 类别, w.name as 核心词汇, w.meaning as 含义, connections as 关联数
ORDER BY 类别, connections DESC;
// 12. 查找跨类别的关联模式
MATCH (w1:Word)-[r]-(w2:Word)
WHERE w1.category <> w2.category
RETURN w1.category as 类别1, w2.category as 类别2, count(r) as 关联数
ORDER BY 关联数 DESC;
// ===== 历史演化分析 =====
// 13. 三个帝国的词汇分布
MATCH (w:Word)
WITH w,
CASE
WHEN w.dynasty IN ['先秦', '秦汉', '汉', '三国', '南北朝'] THEN '长城帝国'
WHEN w.dynasty IN ['隋唐', '隋', '唐', '五代', '辽', '金', '夏', '宋'] THEN '运河帝国'
WHEN w.dynasty IN ['元', '明', '清', '民国'] THEN '圐圙帝国'
ELSE '其他'
END as empire
RETURN empire as 帝国, collect(w.name) as 词汇, count(w) as 数量;
// 14. 查找词汇的时空分布模式
MATCH (w:Word)
RETURN w.dynasty as 朝代, w.region as 地区, collect(w.name) as 词汇
ORDER BY w.dynasty, w.region;
// ===== 可视化查询 =====
// 15. 生成完整的圐圙网络图(用于可视化)
MATCH (w:Word)-[r]-(connected:Word)
RETURN w, r, connected;
// 16. 生成核心概念的星形图
MATCH (core:Word {category: '核心'})-[r]-(related:Word)
RETURN core, r, related;
// 17. 生成音转关系的有向图
MATCH (source:Word)-[r:SOUND_SHIFT]->(target:Word)
RETURN source, r, target;
// ===== 数据统计 =====
// 18. 网络统计信息
MATCH (w:Word)
WITH count(w) as total_words
MATCH ()-[r]-()
WITH total_words, count(r)/2 as total_relationships
MATCH (w:Word)-[r]-(connected:Word)
WITH total_words, total_relationships, w, count(r) as degree
RETURN
total_words as 总词汇数,
total_relationships as 总关系数,
avg(degree) as 平均度数,
max(degree) as 最大度数,
min(degree) as 最小度数;
// 19. 查找孤立节点(没有关系的词汇)
MATCH (w:Word)
WHERE NOT (w)-[]-()
RETURN w.name as 孤立词汇, w.category as 类别;
// 20. 查找关联度最高的词汇(网络中心)
MATCH (w:Word)-[r]-(connected:Word)
WITH w, count(r) as degree
ORDER BY degree DESC
LIMIT 5
RETURN w.name as 中心词汇, w.meaning as 含义, degree as 关联度;

View File

@@ -0,0 +1,196 @@
#!/usr/bin/env python3
"""
Neo4j 数据库设置和"圐圙"词根网络构建
"""
from neo4j import GraphDatabase
import json
class KulueNetworkBuilder:
def __init__(self, uri="bolt://localhost:7687", user="neo4j", password="password"):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def close(self):
self.driver.close()
def clear_database(self):
"""清空数据库"""
with self.driver.session() as session:
session.run("MATCH (n) DETACH DELETE n")
def create_kulue_network(self):
"""创建圐圙词根网络"""
# 核心词汇数据
kulue_words = [
# 地理概念
{"name": "昆仑", "category": "地理", "meaning": "神山", "region": "西域", "dynasty": "先秦"},
{"name": "祁连", "category": "地理", "meaning": "天山", "region": "河西", "dynasty": ""},
{"name": "轩辕", "category": "地理", "meaning": "黄帝丘", "region": "中原", "dynasty": "上古"},
{"name": "贺兰", "category": "地理", "meaning": "天山", "region": "河套", "dynasty": ""},
# 器物概念
{"name": "轱辘", "category": "器物", "meaning": "车轮", "region": "中原", "dynasty": "春秋"},
{"name": "辘轳", "category": "器物", "meaning": "井具", "region": "西域", "dynasty": ""},
{"name": "囫囵", "category": "器物", "meaning": "完整", "region": "中原", "dynasty": ""},
# 政治概念
{"name": "库伦", "category": "政治", "meaning": "都城", "region": "蒙古", "dynasty": ""},
{"name": "固伦", "category": "政治", "meaning": "公主", "region": "满洲", "dynasty": ""},
{"name": "克烈", "category": "政治", "meaning": "部落", "region": "蒙古", "dynasty": ""},
# 文化概念
{"name": "崆峒", "category": "文化", "meaning": "仙山", "region": "陇右", "dynasty": ""},
{"name": "洪洞", "category": "文化", "meaning": "移民", "region": "晋南", "dynasty": ""},
{"name": "窟窿", "category": "文化", "meaning": "石窟", "region": "西域", "dynasty": "北魏"},
# 核心概念
{"name": "圐圙", "category": "核心", "meaning": "天下", "region": "蒙古", "dynasty": ""},
{"name": "忽里勒台", "category": "核心", "meaning": "大会", "region": "蒙古", "dynasty": ""},
]
# 创建词汇节点
with self.driver.session() as session:
for word in kulue_words:
session.run("""
CREATE (w:Word {
name: $name,
category: $category,
meaning: $meaning,
region: $region,
dynasty: $dynasty
})
""", **word)
# 创建音转关系
sound_relations = [
("昆仑", "库伦", "音转"),
("昆仑", "固伦", "音转"),
("昆仑", "克烈", "音转"),
("昆仑", "崆峒", "音转"),
("昆仑", "洪洞", "音转"),
("昆仑", "圐圙", "音转"),
("轱辘", "辘轳", "音转"),
("轱辘", "囫囵", "音转"),
("圐圙", "忽里勒台", "音转"),
]
with self.driver.session() as session:
for source, target, relation in sound_relations:
session.run("""
MATCH (s:Word {name: $source})
MATCH (t:Word {name: $target})
CREATE (s)-[:SOUND_SHIFT {type: $relation}]->(t)
""", source=source, target=target, relation=relation)
# 创建语义关系
semantic_relations = [
("昆仑", "祁连", "同义"),
("昆仑", "轩辕", "同义"),
("昆仑", "贺兰", "同义"),
("轱辘", "辘轳", "功能相关"),
("库伦", "固伦", "政治相关"),
]
with self.driver.session() as session:
for source, target, relation in semantic_relations:
session.run("""
MATCH (s:Word {name: $source})
MATCH (t:Word {name: $target})
CREATE (s)-[:SEMANTIC {type: $relation}]->(t)
""", source=source, target=target, relation=relation)
def create_historical_context(self):
"""创建历史背景节点"""
dynasties = [
{"name": "先秦", "period": "公元前2070-前221", "empire": "长城"},
{"name": "秦汉", "period": "公元前221-220", "empire": "长城"},
{"name": "隋唐", "period": "581-907", "empire": "运河"},
{"name": "宋元", "period": "960-1368", "empire": "圐圙"},
{"name": "明清", "period": "1368-1912", "empire": "圐圙"},
]
with self.driver.session() as session:
for dynasty in dynasties:
session.run("""
CREATE (d:Dynasty {
name: $name,
period: $period,
empire: $empire
})
""", **dynasty)
# 创建三个帝国节点
empires = [
{"name": "长城帝国", "symbol": "长城", "meaning": "华夏大防"},
{"name": "运河帝国", "symbol": "运河", "meaning": "南北统一"},
{"name": "圐圙帝国", "symbol": "圐圙", "meaning": "天下一家"},
]
with self.driver.session() as session:
for empire in empires:
session.run("""
CREATE (e:Empire {
name: $name,
symbol: $symbol,
meaning: $meaning
})
""", **empire)
def query_kulue_network(self):
"""查询圐圙网络的示例"""
queries = {
"找到所有与'昆仑'相关的词汇": """
MATCH (k:Word {name: '昆仑'})-[r]-(related:Word)
RETURN k.name, type(r), related.name, related.meaning
""",
"查找音转路径": """
MATCH path = (start:Word)-[:SOUND_SHIFT*1..3]-(end:Word)
WHERE start.name = '昆仑'
RETURN path
""",
"按类别统计词汇": """
MATCH (w:Word)
RETURN w.category, count(w) as count
ORDER BY count DESC
""",
"查找核心概念的关联": """
MATCH (core:Word {category: '核心'})-[r]-(related:Word)
RETURN core.name, type(r), related.name, related.category
"""
}
with self.driver.session() as session:
for description, query in queries.items():
print(f"\n=== {description} ===")
result = session.run(query)
for record in result:
print(record)
def main():
# 创建数据库连接
builder = KulueNetworkBuilder()
try:
print("清空数据库...")
builder.clear_database()
print("创建圐圙词根网络...")
builder.create_kulue_network()
print("创建历史背景...")
builder.create_historical_context()
print("查询示例...")
builder.query_kulue_network()
finally:
builder.close()
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,420 @@
#!/usr/bin/env python3
"""
圐圙文化网络 - Web 可视化应用
使用 Flask + Neo4j + D3.js
"""
from flask import Flask, render_template, jsonify, request
from neo4j import GraphDatabase
import json
app = Flask(__name__)
class KulueNetworkAPI:
def __init__(self, uri="bolt://localhost:7687", user="neo4j", password="password"):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def close(self):
self.driver.close()
def get_network_data(self):
"""获取完整网络数据用于可视化"""
with self.driver.session() as session:
# 获取所有节点
nodes_result = session.run("""
MATCH (w:Word)
RETURN w.name as name, w.category as category,
w.meaning as meaning, w.region as region, w.dynasty as dynasty
""")
nodes = []
for record in nodes_result:
nodes.append({
'id': record['name'],
'name': record['name'],
'category': record['category'],
'meaning': record['meaning'],
'region': record['region'],
'dynasty': record['dynasty']
})
# 获取所有关系
links_result = session.run("""
MATCH (source:Word)-[r]-(target:Word)
RETURN source.name as source, target.name as target,
type(r) as type, r.type as subtype
""")
links = []
processed_pairs = set()
for record in links_result:
source = record['source']
target = record['target']
# 避免重复的无向边
pair = tuple(sorted([source, target]))
if pair not in processed_pairs:
processed_pairs.add(pair)
links.append({
'source': source,
'target': target,
'type': record['type'],
'subtype': record['subtype']
})
return {'nodes': nodes, 'links': links}
def search_word(self, word_name):
"""搜索特定词汇的关联"""
with self.driver.session() as session:
result = session.run("""
MATCH (center:Word {name: $word})-[r]-(connected:Word)
RETURN center, r, connected
""", word=word_name)
data = []
for record in result:
center = record['center']
relation = record['r']
connected = record['connected']
data.append({
'center': dict(center),
'relation': {
'type': relation.type,
'properties': dict(relation)
},
'connected': dict(connected)
})
return data
def get_categories_stats(self):
"""获取类别统计"""
with self.driver.session() as session:
result = session.run("""
MATCH (w:Word)
RETURN w.category as category, count(w) as count
ORDER BY count DESC
""")
return [{'category': record['category'], 'count': record['count']}
for record in result]
def get_sound_shift_paths(self, start_word):
"""获取音转路径"""
with self.driver.session() as session:
result = session.run("""
MATCH path = (start:Word {name: $start})-[:SOUND_SHIFT*1..3]-(end:Word)
RETURN [node in nodes(path) | node.name] as path_nodes,
length(path) as path_length
ORDER BY path_length
""", start=start_word)
return [{'path': record['path_nodes'], 'length': record['path_length']}
for record in result]
# 创建API实例
kulue_api = KulueNetworkAPI()
@app.route('/')
def index():
"""主页"""
return render_template('index.html')
@app.route('/api/network')
def get_network():
"""获取网络数据API"""
try:
data = kulue_api.get_network_data()
return jsonify(data)
except Exception as e:
return jsonify({'error': str(e)}), 500
@app.route('/api/search/<word>')
def search_word(word):
"""搜索词汇API"""
try:
data = kulue_api.search_word(word)
return jsonify(data)
except Exception as e:
return jsonify({'error': str(e)}), 500
@app.route('/api/stats/categories')
def get_categories():
"""获取类别统计API"""
try:
data = kulue_api.get_categories_stats()
return jsonify(data)
except Exception as e:
return jsonify({'error': str(e)}), 500
@app.route('/api/sound-shift/<word>')
def get_sound_shift(word):
"""获取音转路径API"""
try:
data = kulue_api.get_sound_shift_paths(word)
return jsonify(data)
except Exception as e:
return jsonify({'error': str(e)}), 500
# HTML 模板
html_template = '''
<!DOCTYPE html>
<html>
<head>
<title>圐圙文化网络</title>
<script src="https://d3js.org/d3.v7.min.js"></script>
<style>
body { font-family: Arial, sans-serif; margin: 0; padding: 20px; }
.container { max-width: 1200px; margin: 0 auto; }
.controls { margin-bottom: 20px; }
.network-container { border: 1px solid #ccc; }
.node { cursor: pointer; }
.link { stroke: #999; stroke-opacity: 0.6; }
.tooltip { position: absolute; background: rgba(0,0,0,0.8); color: white;
padding: 10px; border-radius: 5px; pointer-events: none; }
.legend { margin-top: 20px; }
.legend-item { display: inline-block; margin-right: 20px; }
.legend-color { width: 20px; height: 20px; display: inline-block; margin-right: 5px; }
</style>
</head>
<body>
<div class="container">
<h1>圐圙文化网络可视化</h1>
<div class="controls">
<input type="text" id="searchInput" placeholder="搜索词汇...">
<button onclick="searchWord()">搜索</button>
<button onclick="resetView()">重置</button>
</div>
<div id="network" class="network-container"></div>
<div class="legend" id="legend"></div>
<div id="info" style="margin-top: 20px;"></div>
</div>
<div id="tooltip" class="tooltip" style="display: none;"></div>
<script>
// 网络可视化代码
const width = 1160;
const height = 600;
const svg = d3.select("#network")
.append("svg")
.attr("width", width)
.attr("height", height);
const g = svg.append("g");
// 缩放功能
const zoom = d3.zoom()
.scaleExtent([0.1, 3])
.on("zoom", (event) => {
g.attr("transform", event.transform);
});
svg.call(zoom);
// 颜色映射
const colorScale = d3.scaleOrdinal()
.domain(['地理', '器物', '政治', '文化', '核心'])
.range(['#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#1f77b4']);
let simulation, nodes, links;
// 加载网络数据
async function loadNetwork() {
try {
const response = await fetch('/api/network');
const data = await response.json();
nodes = data.nodes;
links = data.links;
createVisualization();
createLegend();
} catch (error) {
console.error('加载数据失败:', error);
}
}
function createVisualization() {
// 创建力导向图
simulation = d3.forceSimulation(nodes)
.force("link", d3.forceLink(links).id(d => d.id).distance(100))
.force("charge", d3.forceManyBody().strength(-300))
.force("center", d3.forceCenter(width / 2, height / 2));
// 绘制连线
const link = g.append("g")
.selectAll("line")
.data(links)
.enter().append("line")
.attr("class", "link")
.attr("stroke-width", d => d.type === 'SOUND_SHIFT' ? 3 : 1)
.attr("stroke", d => d.type === 'SOUND_SHIFT' ? '#ff0000' : '#999');
// 绘制节点
const node = g.append("g")
.selectAll("circle")
.data(nodes)
.enter().append("circle")
.attr("class", "node")
.attr("r", d => d.category === '核心' ? 15 : 10)
.attr("fill", d => colorScale(d.category))
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
// 添加标签
const label = g.append("g")
.selectAll("text")
.data(nodes)
.enter().append("text")
.text(d => d.name)
.attr("font-size", "12px")
.attr("dx", 15)
.attr("dy", 4);
// 鼠标事件
node.on("mouseover", function(event, d) {
d3.select("#tooltip")
.style("display", "block")
.style("left", (event.pageX + 10) + "px")
.style("top", (event.pageY - 10) + "px")
.html(`<strong>${d.name}</strong><br/>
类别: ${d.category}<br/>
含义: ${d.meaning}<br/>
地区: ${d.region}<br/>
朝代: ${d.dynasty}`);
})
.on("mouseout", function() {
d3.select("#tooltip").style("display", "none");
})
.on("click", function(event, d) {
searchWord(d.name);
});
// 更新位置
simulation.on("tick", () => {
link
.attr("x1", d => d.source.x)
.attr("y1", d => d.source.y)
.attr("x2", d => d.target.x)
.attr("y2", d => d.target.y);
node
.attr("cx", d => d.x)
.attr("cy", d => d.y);
label
.attr("x", d => d.x)
.attr("y", d => d.y);
});
}
function createLegend() {
const legend = d3.select("#legend");
const categories = ['地理', '器物', '政治', '文化', '核心'];
categories.forEach(category => {
const item = legend.append("div").attr("class", "legend-item");
item.append("div")
.attr("class", "legend-color")
.style("background-color", colorScale(category));
item.append("span").text(category);
});
}
// 拖拽功能
function dragstarted(event, d) {
if (!event.active) simulation.alphaTarget(0.3).restart();
d.fx = d.x;
d.fy = d.y;
}
function dragged(event, d) {
d.fx = event.x;
d.fy = event.y;
}
function dragended(event, d) {
if (!event.active) simulation.alphaTarget(0);
d.fx = null;
d.fy = null;
}
// 搜索功能
async function searchWord(word) {
if (!word) word = document.getElementById('searchInput').value;
if (!word) return;
try {
const response = await fetch(`/api/search/${word}`);
const data = await response.json();
// 高亮相关节点
d3.selectAll(".node")
.attr("stroke", d => {
const isRelated = data.some(item =>
item.center.name === d.name || item.connected.name === d.name
);
return isRelated ? "#000" : "none";
})
.attr("stroke-width", d => {
const isRelated = data.some(item =>
item.center.name === d.name || item.connected.name === d.name
);
return isRelated ? 3 : 0;
});
// 显示搜索结果
const info = d3.select("#info");
info.html(`<h3>搜索结果: ${word}</h3>`);
if (data.length > 0) {
const list = info.append("ul");
data.forEach(item => {
list.append("li")
.html(`${item.connected.name} (${item.relation.type}) - ${item.connected.meaning}`);
});
} else {
info.append("p").text("未找到相关词汇");
}
} catch (error) {
console.error('搜索失败:', error);
}
}
function resetView() {
d3.selectAll(".node")
.attr("stroke", "none")
.attr("stroke-width", 0);
d3.select("#info").html("");
document.getElementById('searchInput').value = "";
}
// 页面加载时初始化
loadNetwork();
</script>
</body>
</html>
'''
# 创建模板目录和文件
import os
os.makedirs('templates', exist_ok=True)
with open('templates/index.html', 'w', encoding='utf-8') as f:
f.write(html_template)
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)

View File

@@ -0,0 +1,55 @@
#!/usr/bin/env python3
"""
OCR 文字提取工具
需要安装: pip install pytesseract pillow
"""
try:
import pytesseract
from PIL import Image
import os
def extract_text_from_image(image_path):
"""从图片中提取文字"""
try:
# 打开图片
image = Image.open(image_path)
# 使用 OCR 提取文字
text = pytesseract.image_to_string(image, lang='chi_sim+eng')
return text.strip()
except Exception as e:
return f"OCR 失败: {e}"
def batch_ocr_images(image_dir, output_file="ocr_results.md"):
"""批量 OCR 图片"""
results = []
# 获取所有 PNG 图片
png_files = [f for f in os.listdir(image_dir) if f.endswith('.png')]
png_files.sort()
for filename in png_files:
image_path = os.path.join(image_dir, filename)
print(f"正在 OCR: {filename}")
text = extract_text_from_image(image_path)
if text:
results.append(f"## {filename}\n\n```\n{text}\n```\n\n---\n")
else:
results.append(f"## {filename}\n\n*无文字内容*\n\n---\n")
# 保存结果
with open(output_file, 'w', encoding='utf-8') as f:
f.write("# OCR 文字提取结果\n\n")
f.writelines(results)
print(f"OCR 完成,结果保存到: {output_file}")
except ImportError:
print("需要安装 OCR 依赖:")
print("pip install pytesseract pillow")
print("还需要安装 tesseract 引擎")

View File

@@ -0,0 +1,82 @@
#!/usr/bin/env python3
"""
使用 OpenAI GPT-4V 分析图片
需要设置 OPENAI_API_KEY 环境变量
"""
import base64
import os
from openai import OpenAI
def encode_image(image_path):
"""将图片编码为 base64"""
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
def analyze_image_with_gpt4v(image_path, prompt="请详细描述这张图片的内容"):
"""使用 GPT-4V 分析图片"""
# 检查 API key
api_key = os.getenv('OPENAI_API_KEY')
if not api_key:
return "请设置 OPENAI_API_KEY 环境变量"
client = OpenAI(api_key=api_key)
# 编码图片
base64_image = encode_image(image_path)
try:
response = client.chat.completions.create(
model="gpt-4o", # 或 "gpt-4-vision-preview"
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{base64_image}"
}
}
]
}
],
max_tokens=1000
)
return response.choices[0].message.content
except Exception as e:
return f"分析失败: {e}"
# 简单的本地图片描述工具
def describe_image_locally(image_path):
"""基于文件名和位置推测图片内容"""
filename = os.path.basename(image_path)
# 根据文件名模式推测内容
descriptions = {
"image-000": "可能是标题页或封面",
"image-001": "可能是目录或章节导航",
"image-002": "可能是地图或示意图",
# 可以根据实际情况添加更多
}
base_name = filename.replace('.png', '')
if base_name in descriptions:
return descriptions[base_name]
else:
return f"图片 {filename},需要进一步分析"
if __name__ == "__main__":
# 测试单张图片
test_image = "images/0 序令人又敬又畏的_忽里勒台_大会/image-000.png"
if os.path.exists(test_image):
print("本地描述:", describe_image_locally(test_image))
# 如果有 OpenAI API key尝试 GPT-4V
if os.getenv('OPENAI_API_KEY'):
print("GPT-4V 分析:", analyze_image_with_gpt4v(test_image))
else:
print("提示:设置 OPENAI_API_KEY 可使用 GPT-4V 分析")

View File

@@ -0,0 +1,26 @@
#!/bin/bash
echo "OpenAI Codex 安装和配置脚本"
echo "================================"
# 激活虚拟环境
echo "激活虚拟环境..."
source codex_env/bin/activate
# 检查安装
echo "检查 OpenAI 库安装..."
python -c "import openai; print(f'OpenAI 版本: {openai.__version__}')"
# 提示设置 API key
echo ""
echo "请设置你的 OpenAI API Key:"
echo "1. 访问 https://platform.openai.com/api-keys"
echo "2. 创建一个新的 API key"
echo "3. 运行以下命令设置环境变量:"
echo " export OPENAI_API_KEY='your-api-key-here'"
echo ""
echo "或者将其添加到你的 ~/.bashrc 或 ~/.zshrc 文件中"
echo ""
echo "测试安装:"
echo "python codex_example.py"
echo "python codex_chat_example.py"

View File

@@ -0,0 +1,62 @@
#!/usr/bin/env python3
"""
更新Markdown文件中的图片引用
"下图""上图""图中"等文字引用替换为实际的图片链接
"""
import re
import os
def update_image_references(markdown_file, image_dir):
"""更新Markdown文件中的图片引用"""
# 读取Markdown文件
with open(markdown_file, 'r', encoding='utf-8') as f:
content = f.read()
# 获取图片文件列表
image_files = [f for f in os.listdir(image_dir) if f.endswith('.png')]
image_files.sort() # 按文件名排序
print(f"找到 {len(image_files)} 张图片")
# 先清理已有的图片引用(避免重复)
content = re.sub(r'!\[.*?\]\([^)]+\)', '', content)
# 图片引用模式 - 更精确的匹配
patterns = [
(r'(?<!!)\b下图\b', '![下图]'),
(r'(?<!!)\b上图\b', '![上图]'),
(r'(?<!!)\b图中\b', '![图中]'),
(r'(?<!!)\b此图\b', '![此图]'),
(r'(?<!!)\b该图\b', '![该图]'),
(r'(?<!!)\b图片\b', '![图片]'),
(r'(?<!!)\b图像\b', '![图像]'),
]
# 替换图片引用
image_index = 0
for pattern, replacement in patterns:
# 找到所有匹配的位置
matches = list(re.finditer(pattern, content))
for i, match in enumerate(matches):
if image_index < len(image_files):
# 替换为实际的图片链接
image_path = f"{image_dir}/{image_files[image_index]}"
new_reference = f"{replacement}({image_path})"
content = content.replace(match.group(), new_reference, 1)
image_index += 1
print(f"替换 '{match.group()}' -> '{new_reference}'")
# 保存更新后的文件
with open(markdown_file, 'w', encoding='utf-8') as f:
f.write(content)
print(f"更新完成,共替换了 {image_index} 个图片引用")
if __name__ == "__main__":
markdown_file = "/home/ben/code/huhan3000/converted/0_序_令人又敬又畏的_忽里勒台_大会.md"
image_dir = "/home/ben/code/huhan3000/images/0_序"
update_image_references(markdown_file, image_dir)

View File

@@ -0,0 +1,757 @@
# 图片分析结果
## image-000.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-001.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-002.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-003.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-004.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-005.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-006.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-007.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-008.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-009.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-010.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-011.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-012.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-013.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-014.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-015.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-016.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-017.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-018.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-019.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-020.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-021.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-022.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-023.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-024.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-025.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-026.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-027.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-028.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-029.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-030.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-031.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-032.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-033.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-034.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-035.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-036.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-037.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-038.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-039.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-040.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-041.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-042.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-043.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-044.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-045.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-046.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-047.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-048.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-049.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-050.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-051.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-052.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-053.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-054.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-055.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-056.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-057.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-058.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-059.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-060.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-061.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-062.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-063.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-064.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-065.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-066.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-067.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-068.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-069.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-070.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-071.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-072.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-073.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-074.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-075.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-076.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-077.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-078.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-079.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-080.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-081.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-082.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-083.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-084.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-085.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-086.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-087.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-088.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-089.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-090.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-091.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-092.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-093.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-094.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-095.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-096.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-097.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-098.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-099.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-100.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-101.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-102.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-103.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-104.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-105.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-106.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-107.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-108.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-109.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-110.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-111.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-112.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-113.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-114.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-115.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-116.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-117.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-118.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-119.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-120.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-121.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-122.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-123.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-124.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-125.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-126.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-127.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-128.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-129.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-130.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-131.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-132.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-133.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-134.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-135.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-136.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-137.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-138.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-139.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-140.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-141.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-142.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-143.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-144.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-145.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-146.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-147.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-148.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-149.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---
## image-150.png
分析失败: Error code: 400 - {'error': {'message': 'Invalid request: Image input not supported for model moonshot-v1-8k', 'type': 'invalid_request_error'}}
---