修改app.py字数逻辑依赖

This commit is contained in:
zhangkunxiang 2026-07-15 18:04:34 +08:00
parent ce6dd1af15
commit fdb6642b8b
2 changed files with 99 additions and 11 deletions

42
app.py
View File

@ -195,21 +195,47 @@ class OutlineRequest(BaseModel):
prompt: Optional[str] = None
def length_convert(length: Optional[str]) -> str:
def length_convert(length: Optional[str]):
"""将篇幅解析为 {target, max}target 为建议目标字数max 为硬上限。"""
if length == "":
return "1000字"
return {"target": 700, "max": 1000}
if length == "":
return "1000-2000字"
return {"target": 2500, "max": 3000}
if length == "":
return "2000-5000字"
return {"target": 4500, "max": 5000}
# 兜底:从自定义篇幅字符串里解析出最大字数
if length:
nums = re.findall(r"\d+", length)
if nums:
max_chars = int(nums[-1])
return {"target": int(max_chars * 0.8), "max": max_chars}
return None
def length_display(length: Optional[str]) -> str:
"""模板 {length} 占位符用的字符串。"""
info = length_convert(length)
if info:
return f"{info['target']}字左右(不超过{info['max']}字)"
return length or ""
def build_length_instruction(length: Optional[str]) -> str:
"""把 target/max 写进提示词:建议目标 + 硬上限 + 优先级。"""
info = length_convert(length)
if not info:
return ""
return (
f"全文建议写到{info['target']}字左右,绝对不得超过{info['max']}字;"
"字数为硬性要求,不得注水或重复凑字数。"
)
def build_write_prompt(request: WriteRequest) -> str:
prompt = request.prompt or ""
length = length_convert(request.length)
template = request.template or ""
content = f"请生成一篇字数在{length}{template},字数严格遵守该规则,并且不能超过给定字数范围。{prompt}"
length_instruction = build_length_instruction(request.length)
content = f"请撰写一篇{template}{length_instruction}{prompt}"
prompt_template = TEMPLATE_DICT.get(template)
if not prompt_template:
raise HTTPException(status_code=400, detail=f"不支持的写作模板: {template}")
@ -221,7 +247,7 @@ def build_write_prompt(request: WriteRequest) -> str:
return content+prompt_template.format(
role=request.role or "",
title=title,
length=length_convert(request.length),
length=length_display(request.length),
requirement=request.requirement or "",
references=request.references or "",
outline=request.outline or "",
@ -267,7 +293,7 @@ def build_outline_prompt(request: OutlineRequest) -> str:
role=request.role or "",
template=template,
title=title,
length=length_convert(request.length),
length=length_display(request.length),
requirement=request.requirement or "",
references=request.references or "",
)

View File

@ -4,41 +4,103 @@
langchain
langchain-core
langchain-openai
langchain-protocol
langgraph
langgraph-checkpoint
langgraph-checkpoint-postgres
langgraph-prebuilt
langgraph-sdk
langsmith
# HTTP客户端
httpx
httpcore
httptools
h11
requests
requests-toolbelt
urllib3
# 数据处理
pydantic
typing-extensions
pydantic_core
typing_extensions
typing-inspection
numpy
scipy
# 其他工具
python-dotenv
python-dateutil
pytz
PyYAML
types-PyYAML
tenacity
tqdm
click
json_repair
jsonpatch
jsonpointer
orjson
ormsgpack
xxhash
zstandard
uuid_utils
packaging
regex
six
anyio
sniffio
certifi
charset-normalizer
idna
distro
exceptiongroup
fsspec
runlike
pyahocorasick
# FastAPI 相关
fastapi
uvicorn[standard]
starlette
uvicorn
uvloop
watchfiles
websockets
python-multipart
# Neo4j 图数据库
neo4j
neo4j-graphrag
# PostgreSQL 支持
psycopg[binary]
psycopg
psycopg-binary
psycopg-pool
# OpenAI API
openai
tiktoken
jiter
# Word 文档生成
python-docx
lxml
# LaTeX 公式转 Word 原生公式(OMML),缺失时会回退成模糊图片
latex2mathml
# PDF 生成相关
matplotlib
Pillow
contourpy
cycler
fonttools
kiwisolver
pyparsing
pymupdf
pypdf
# 其他依赖
aiofiles
annotated-doc
annotated-types