refactor: 用 StreamHttpClient 替代 aiohttp — DSPY 预置全局变量

This commit is contained in:
yumoqing 2026-07-31 13:45:42 +08:00
parent 848644f229
commit 9b3cfb86c0

View File

@ -1,4 +1,4 @@
import aiohttp, base64, os, subprocess import base64, os, subprocess
ns = params_kw.copy() ns = params_kw.copy()
kb_id = ns.get('kb_id', '') kb_id = ns.get('kb_id', '')
folder_id = ns.get('folder', '') folder_id = ns.get('folder', '')
@ -67,29 +67,26 @@ if ext_l in text_exts:
# --- IMAGE: face detection --- # --- IMAGE: face detection ---
if ext_l in image_exts: if ext_l in image_exts:
img_b64 = base64.b64encode(file_data).decode() img_b64 = base64.b64encode(file_data).decode()
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=15)) as s: try:
try: client = StreamHttpClient()
r = await s.post('https://media.opencomputing.net/face/api/detect', json={"images": [img_b64]}) resp = await client.request('POST', 'https://media.opencomputing.net/face/api/detect', json={"images": [img_b64]})
if r.status == 200: fd = json.loads(resp)
fd = await r.json() results = fd.get("results", [])
results = fd.get("results", []) if results and isinstance(results[0], dict):
if results and isinstance(results[0], dict): face_count = len(results[0].get("faces", results[0].get("detections", [])))
face_count = len(results[0].get("faces", results[0].get("detections", []))) meta_parts['face'] = face_count
meta_parts['face'] = face_count except: pass
except: pass
# --- AUDIO: voiceprint --- # --- AUDIO: voiceprint ---
if ext_l in audio_exts: if ext_l in audio_exts:
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=60)) as s: try:
try: client = StreamHttpClient()
form = aiohttp.FormData() resp = await client.request('POST', 'https://media.opencomputing.net/voiceprint/extract/submit',
form.add_field('file', file_data, filename=file_name) files={'file': (file_name, file_data)})
r = await s.post('https://media.opencomputing.net/voiceprint/extract/submit', data=form) vd = json.loads(resp)
if r.status == 200: voice_speakers = vd.get('speakers', 1) if vd.get('status') == 'SUCCEEDED' else (1 if vd.get('embedding') else 0)
vd = await r.json() meta_parts['voiceprint'] = voice_speakers
voice_speakers = vd.get('speakers', 1) if vd.get('status') == 'SUCCEEDED' else (1 if vd.get('embedding') else 0) except: pass
meta_parts['voiceprint'] = voice_speakers
except: pass
# --- VIDEO: frame extraction --- # --- VIDEO: frame extraction ---
if ext_l in video_exts: if ext_l in video_exts:
@ -102,39 +99,38 @@ if ext_l in video_exts:
with open(tmp_img, 'rb') as fi: with open(tmp_img, 'rb') as fi:
frame_data = fi.read() frame_data = fi.read()
img_b64 = base64.b64encode(frame_data).decode() img_b64 = base64.b64encode(frame_data).decode()
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=15)) as s: try:
client = StreamHttpClient()
resp = await client.request('POST', 'https://media.opencomputing.net/face/api/detect', json={"images": [img_b64]})
fd = json.loads(resp)
results = fd.get("results", [])
if results and isinstance(results[0], dict):
face_count = len(results[0].get("faces", results[0].get("detections", [])))
except: pass
# --- CLIP image embedding for video frame ---
try:
client2 = StreamHttpClient()
resp2 = await client2.request('POST', 'https://embedding.opencomputing.net/api/embed',
json={"images": [img_b64], "model": "CLIP-ViT-H-14"})
emb_data = json.loads(resp2)
img_embeddings = emb_data.get("image_embeddings", emb_data.get("embeddings", []))
except:
img_embeddings = []
if img_embeddings:
try: try:
r = await s.post('https://media.opencomputing.net/face/api/detect', json={"images": [img_b64]}) client3 = StreamHttpClient()
if r.status == 200: vdb_data = {"colname": kb_id, "data": [
fd = await r.json() {"id": doc_id + "_frame0", "vector": img_embeddings[0], "text": file_name}
results = fd.get("results", []) ]}
if results and isinstance(results[0], dict): await client3.request('POST', 'https://vectordb.opencomputing.net/v1/upsert', json=vdb_data)
face_count = len(results[0].get("faces", results[0].get("detections", []))) async with get_sor_context(env, 'rag') as sor:
except: pass await sor.sqlExe(
# --- CLIP image embedding for video frame --- "INSERT INTO document_chunks (id, doc_id, kb_id, chunk_index, content, vector_id, created_at) "
if os.path.exists(tmp_img): "VALUES (${id}$, ${doc_id}$, ${kb_id}$, 0, ${content}$, ${vid}$, NOW())",
img_b64_frame = base64.b64encode(frame_data).decode() {"id": doc_id + "_c0", "doc_id": doc_id, "kb_id": kb_id,
try: "content": file_name, "vid": doc_id + "_frame0"})
r2 = await s.post('https://embedding.opencomputing.net/api/embed', except:
json={"images": [img_b64_frame], "model": "CLIP-ViT-H-14"}) pass
emb_data = await r2.json() if r2.status == 200 else {}
img_embeddings = emb_data.get("image_embeddings", emb_data.get("embeddings", []))
except:
img_embeddings = []
if img_embeddings:
try:
vdb_data = {"colname": kb_id, "data": [
{"id": doc_id + "_frame0", "vector": img_embeddings[0], "text": file_name}
]}
await s.post('https://vectordb.opencomputing.net/v1/upsert', json=vdb_data)
async with get_sor_context(env, 'rag') as sor:
await sor.sqlExe(
"INSERT INTO document_chunks (id, doc_id, kb_id, chunk_index, content, vector_id, created_at) "
"VALUES (${id}$, ${doc_id}$, ${kb_id}$, 0, ${content}$, ${vid}$, NOW())",
{"id": doc_id + "_c0", "doc_id": doc_id, "kb_id": kb_id,
"content": file_name, "vid": doc_id + "_frame0"})
except:
pass
os.remove(tmp_img) os.remove(tmp_img)
except: pass except: pass
@ -156,35 +152,36 @@ if text and len(text.strip()) > 10:
if cur: chunks.append(cur) if cur: chunks.append(cur)
if chunks: if chunks:
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=15)) as s: try:
client = StreamHttpClient()
resp = await client.request('POST', 'https://embedding.opencomputing.net/api/embed',
json={"texts": chunks, "model": "CLIP-ViT-H-14"})
emb_data = json.loads(resp)
embeddings = emb_data.get("text_embeddings", emb_data.get("embeddings", []))
except:
embeddings = []
vector_ids = []
if embeddings:
try: try:
r = await s.post('https://embedding.opencomputing.net/api/embed', client2 = StreamHttpClient()
json={"texts": chunks, "model": "CLIP-ViT-H-14"}) vdb_data = {"colname": kb_id, "data": [
emb_data = await r.json() if r.status == 200 else {} {"id": doc_id + "_" + str(i), "vector": emb, "text": chunks[i]}
embeddings = emb_data.get("text_embeddings", emb_data.get("embeddings", [])) for i, emb in enumerate(embeddings)]}
await client2.request('POST', 'https://vectordb.opencomputing.net/v1/upsert', json=vdb_data)
vector_ids = [doc_id + "_" + str(i) for i in range(len(embeddings))]
except: except:
embeddings = [] pass
vector_ids = [] async with get_sor_context(env, 'rag') as sor:
if embeddings: for i, chunk_text in enumerate(chunks):
try: vid = vector_ids[i] if i < len(vector_ids) else ''
vdb_data = {"colname": kb_id, "data": [ await sor.sqlExe(
{"id": doc_id + "_" + str(i), "vector": emb, "text": chunks[i]} "INSERT INTO document_chunks (id, doc_id, kb_id, chunk_index, content, vector_id, created_at) "
for i, emb in enumerate(embeddings)]} "VALUES (${id}$, ${doc_id}$, ${kb_id}$, ${idx}$, ${content}$, ${vid}$, NOW())",
await s.post('https://vectordb.opencomputing.net/v1/upsert', json=vdb_data) {"id": doc_id + "_c" + str(i), "doc_id": doc_id, "kb_id": kb_id,
vector_ids = [doc_id + "_" + str(i) for i in range(len(embeddings))] "idx": i, "content": chunk_text[:2000], "vid": vid})
except: chunks_n = len(chunks)
pass
async with get_sor_context(env, 'rag') as sor:
for i, chunk_text in enumerate(chunks):
vid = vector_ids[i] if i < len(vector_ids) else ''
await sor.sqlExe(
"INSERT INTO document_chunks (id, doc_id, kb_id, chunk_index, content, vector_id, created_at) "
"VALUES (${id}$, ${doc_id}$, ${kb_id}$, ${idx}$, ${content}$, ${vid}$, NOW())",
{"id": doc_id + "_c" + str(i), "doc_id": doc_id, "kb_id": kb_id,
"idx": i, "content": chunk_text[:2000], "vid": vid})
chunks_n = len(chunks)
# --- SAVE TO DB --- # --- SAVE TO DB ---
meta_json = json.dumps(meta_parts, ensure_ascii=False) meta_json = json.dumps(meta_parts, ensure_ascii=False)