refactor: 用 StreamHttpClient 替代 aiohttp — DSPY 预置全局变量
This commit is contained in:
parent
848644f229
commit
9b3cfb86c0
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user