Add web overview with worker progress and separate correction token charts

This commit is contained in:
Nico committed 2026-10-21 21:25:23 +02:00
1 parent 012a8d8e91
commit 58fc00601e
18 files changed
+804 -2

No files matched your search

+66
View File
@@ -0,0 +1,66 @@
"""Synthetic, disposable UI fixture; never uses model or database providers."""
import json
import os
import tempfile
from pathlib import Path
import uvicorn
from viano_bug_analysis.api import APIConfig, Client, Project
from viano_bug_analysis.api.app import create_app
from viano_bug_analysis.lifecycle import Workspace, CheckpointStore
from viano_bug_analysis.lifecycle.job import timestamp
from viano_bug_analysis.lifecycle.storage import atomic_json, json_bytes
from viano_bug_analysis.package.factory import PackageFactory
from viano_bug_analysis.case import CaseBuilder
import viano_bug_analysis.api.dashboard as dashboard
TOKEN = 'ui_fixture_' + 'x' * 40
def seed(root, case_id, title, completed=False):
workspace = Workspace(root)
store = CheckpointStore(workspace)
now = timestamp()
manifest = {'format':'viano-bug-case-package','format_version':1,'case_id':case_id,
'package_id':'preview-'+case_id,'package_generation':0,'analysis_revision':0,
'project':{'id':'viano-core','type':'wow','profile':'vcore'},'created_at':now,'updated_at':now,
'state':'NEW','routing':{'destination':'inbox','reason':None,'retry_count':0,'retry_not_before':None},
'artifacts':{'case':None,'diagnosis':None,'change_request':None,'case_inputs':'inputs.json'},
'history':{'analysis_revisions':0,'reproductions':0,'evidence':0,'handoffs':0,'feedback':0,'events_ref':None},'integrity':{}}
contents={'inputs.json':json_bytes({'format':'viano-case-inputs','format_version':1,'reports':['report.json']}),
'report.json':json_bytes({'format':'viano-bug-report','format_version':1,'title':title,
'observations':[{'text':'Synthetic UI fixture observation'}]})}
path=workspace.inbox/(case_id+'.zip');PackageFactory().create(path,manifest,contents)
store.intake(path);path.unlink()
identity=case_id,manifest['package_id'];CaseBuilder(store).build(*identity)
for state,pointer in [('INTERPRETING_CASE','case_interpretation'),('GENERATING_HYPOTHESES','hypotheses')]:
ref=pointer+'.json';store.advance(*identity,state,step_id=state,
artifacts={pointer:ref},additions={ref:json_bytes({'analysis_revision':1})})
store.advance(*identity,'INVESTIGATING_HYPOTHESES',step_id='investigate')
for i,(category,inp,out) in enumerate([('regular',12000,3000),('correction',3000,900)]):
ref=f'call{i}.json';request=f'request{i}.json'
call={'rounds':1,'phase':'INVESTIGATING_HYPOTHESES','request_ref':request,'outcome':{
'usage_classification':category,'metadata':{'input_tokens':inp,'output_tokens':out,
'reasoning_tokens':out//2,'cached_input_tokens':1000}}}
store.advance(*identity,'INVESTIGATING_HYPOTHESES',step_id=f'call{i}',
details={'operation':'llm-round','result_ref':ref},
additions={ref:json_bytes(call),request:json_bytes({'prompt_version':'investigation_lean_v21'})})
if completed:
store.advance(*identity,'BUILDING_DIAGNOSIS',step_id='diagnosis')
store.advance(*identity,'OUTPUT_READY',step_id='done')
return identity
if __name__ == '__main__':
with tempfile.TemporaryDirectory(prefix='vba-dashboard-', dir=os.environ.get('VBA_UI_TEST_WORKSPACE')) as temporary:
root=Path(temporary)
identity=seed(root,'BUG-000020','Wolpertinger fehlen in Dun Morogh')
seed(root,'BUG-000017','Leuchtbrille – Kontrolllauf',completed=True)
config=APIConfig(root,(Project('viano-core','wow','vcore'),),
(Client('preview','VBA_UI_TEST_TOKEN',('viano-core',)),))
os.environ['VBA_UI_TEST_TOKEN']=TOKEN
dashboard.read_status=lambda _: {'observer':'LIVE','service_id':'fixture-worker'}
folder=root/'runtime/worker';folder.mkdir(exist_ok=True)
atomic_json(folder/'status.json',{'status':'ANALYZING','service_id':'fixture-worker',
'case':{'case_id':identity[0],'package_id':identity[1]}})
uvicorn.run(create_app(config),host='127.0.0.1',port=int(os.environ.get('VBA_UI_TEST_PORT','8765')),access_log=False)