Files
kefu/deploy/knowledge-v3-field-fix/diagnose.sh
T
2026-09-21 10:34:06 +08:00

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