39 lines
2.2 KiB
Bash
39 lines
2.2 KiB
Bash
set -euo pipefail
|
|
docker exec -i im-admin-knowledge-worker-1 python - <<'PY'
|
|
import copy,json,time
|
|
from pathlib import Path
|
|
import admin_backend,model_gateway
|
|
from knowledge_worker import enhance
|
|
database=admin_backend.Database(Path('/data/backend.db'))
|
|
with database.connect() as db:
|
|
row=db.execute("SELECT * FROM knowledge_job WHERE id=?",('2a5c16ea559b4d5c890943fc0a541dba',)).fetchone()
|
|
if row is None: raise SystemExit('Target job not found')
|
|
job=dict(row); options=json.loads(job['options_json']); pending=json.loads(job['state_json']).get('_pending',[])
|
|
print(json.dumps({'id':job['id'],'status':job['status'],'processed':job['processed'],'created_items':job['created_items'],
|
|
'model_calls':job['model_calls'],'max_model_calls':options.get('max_model_calls'),'error':job['error'],
|
|
'provider':options.get('model_provider_id'),'pending_count':len(pending),
|
|
'pending_lengths':[{k:len(c.get(k,'')) for k in ('question','answer')} for c in pending]},ensure_ascii=False),flush=True)
|
|
if job['status']!='failed' or not pending or job['model_calls']>=options['max_model_calls']:
|
|
raise SystemExit(0)
|
|
original=model_gateway.call_outlet
|
|
async def inspect(*args,**kwargs):
|
|
result=await original(*args,**kwargs)
|
|
raw=result.get('text','').strip()
|
|
if raw.startswith('```'): raw=raw.split('\n',1)[-1].rsplit('```',1)[0]
|
|
try: data=json.loads(raw)
|
|
except ValueError: data=None
|
|
summary={'output_chars':len(raw),'provider_error':bool(result.get('error')),'json_object':isinstance(data,dict)}
|
|
if isinstance(data,dict):
|
|
summary['fields']={k:{'type':type(data.get(k)).__name__,'length':len(data[k].strip()) if isinstance(data.get(k),str) else None,'present':k in data} for k in ('title','question','answer','conditions','category','kind')}
|
|
summary['valid_kind']=data.get('kind') in ('qa','procedure','case')
|
|
print(json.dumps(summary,ensure_ascii=False),flush=True)
|
|
return result
|
|
model_gateway.call_outlet=inspect
|
|
started=time.monotonic()
|
|
try:
|
|
enhance(copy.deepcopy(pending[0]),database,options)
|
|
print(json.dumps({'reproduction':'passed','seconds':round(time.monotonic()-started,2)}),flush=True)
|
|
except ValueError as error:
|
|
print(json.dumps({'reproduction':'failed','safe_validation_error':str(error),'seconds':round(time.monotonic()-started,2)},ensure_ascii=False),flush=True)
|
|
PY
|