# -*- coding: utf-8 -*-
import base64,json,os,glob,time
import urllib.request
from concurrent.futures import ThreadPoolExecutor
API="https://api.deepseek.com/v1/chat/completions"; MODEL="deepseek-v4-flash-vision-exp"
KEY="sk-2af0093dfbac45359276d8aa85d83618"
SRC="/home/zyw/Downloads/dl-hub/26-合同审查/originals2"
OUT="/home/zyw/Downloads/dl-hub/26-合同审查/pages_v2"
PROMPT=open("/home/zyw/Downloads/dl-hub/26-合同审查/_工作文件/prompt.txt",encoding="utf-8").read() + """

补充要求：
- 请特别留意**手写填写的内容、签字、按手印、日期、金额**，逐字转录并标注 (手写: xxx)、<签字: xxx>、<手印>。
- 如果某处仍然是空白未填，标注【空白】。
- 注意区分"印刷体"与"手写体"。"""
def ocr(path):
    b64=base64.b64encode(open(path,"rb").read()).decode()
    p={"model":MODEL,"temperature":0,"max_tokens":8000,"messages":[{"role":"user","content":[
      {"type":"image_url","image_url":{"url":"data:image/jpeg;base64,"+b64}},{"type":"text","text":PROMPT}]}]}
    for a in range(1,5):
        try:
            r=urllib.request.Request(API,data=json.dumps(p).encode(),headers={"Authorization":"Bearer "+KEY,"Content-Type":"application/json"})
            d=json.loads(urllib.request.urlopen(r,timeout=600).read())
            t=d["choices"][0]["message"].get("content") or ""
            if len(t.strip())>30: return t
        except Exception as e: pass
        time.sleep(3*a)
    return "__FAIL__"
def work(f):
    n=os.path.splitext(os.path.basename(f))[0]
    t=ocr(f); open(os.path.join(OUT,n+".md"),"w",encoding="utf-8").write(t)
    return f"{n}: {len(t)}字"
fs=sorted(glob.glob(SRC+"/*.jpg"))
with ThreadPoolExecutor(max_workers=4) as ex:
    for r in ex.map(work,fs): print(r,flush=True)
