Consolidate versioned source evidence across investigation results

This commit is contained in:
Nico committed 2026-10-15 23:25:13 +02:00
1 parent 8fe286e6c5
commit 0246feda61
10 files changed
+412 -28

No files matched your search

+16 -16
View File
@@ -5,25 +5,18 @@ import json
from viano_bug_analysis.analysis.investigation_prompt import build_prompt
from viano_bug_analysis.analysis.investigation_view import working_view, thin_view
from viano_bug_analysis.analysis.investigation_consolidation import consolidated_view, restore_view
from viano_bug_analysis.case.contracts import read_json
from viano_bug_analysis.package import PackageReader
def restore_tables(view):
for entry in view['evidence'].values():
for capture in entry['content'].get('items', []):
result = capture.get('result', {})
table = result.get('items')
if not isinstance(table, dict):
continue
if table.get('encoding') == 'source_line_table_v1':
result['items'] = [{**table['common'], **dict(zip(table['columns'], row))} for row in table['rows']]
elif table.get('encoding') == 'database_row_table_v1':
result['items'] = [{**table['common'], 'row': dict(zip(table['columns'], row))} for row in table['rows']]
return view
return restore_view(view)
def measure(path):
def measure(path, target_version='investigation_project_v6'):
if target_version not in {'investigation_project_v5', 'investigation_project_v6'}:
raise ValueError('Unsupported model view version')
records = []
with PackageReader(path) as reader:
for ref in sorted(reader.files):
@@ -34,21 +27,27 @@ def measure(path):
continue
old = build_prompt(context)
projected = copy.deepcopy(context)
projected['prompt_version'] = 'investigation_project_v5'
projected['prompt_version'] = target_version
new = build_prompt(projected)
old_view = working_view(projected)
new_view = thin_view(projected)
new_view = consolidated_view(projected) if target_version == 'investigation_project_v6' else thin_view(projected)
if json.dumps(restore_tables(copy.deepcopy(new_view)), sort_keys=True) != json.dumps(old_view, sort_keys=True):
raise ValueError('Model view roundtrip failed')
records.append({'context_ref': ref,
'old_characters': len(old['messages'][1]['content']),
'new_characters': len(new['messages'][1]['content']),
'old_message_characters': sum(len(m['content']) for m in old['messages']),
'new_message_characters': sum(len(m['content']) for m in new['messages']),
'old_components': {k: len(json.dumps(v, ensure_ascii=False, separators=(',', ':'))) for k, v in old_view.items()},
'new_components': {k: len(json.dumps(v, ensure_ascii=False, separators=(',', ':'))) for k, v in new_view.items()}})
old = sum(r['old_characters'] for r in records)
new = sum(r['new_characters'] for r in records)
return {'stored_contexts': len(records), 'old_user_characters': old, 'new_user_characters': new,
old_messages = sum(r['old_message_characters'] for r in records)
new_messages = sum(r['new_message_characters'] for r in records)
return {'target_version': target_version, 'stored_contexts': len(records), 'old_user_characters': old, 'new_user_characters': new,
'reduction_percent': round(100 * (1 - new / old), 2) if old else None,
'old_message_characters': old_messages, 'new_message_characters': new_messages,
'message_reduction_percent': round(100 * (1 - new_messages / old_messages), 2) if old_messages else None,
'lossless_roundtrip': True, 'unit': 'characters_not_provider_tokens',
'scope': 'stored_contexts_not_billed_calls', 'contexts': records}
@@ -56,5 +55,6 @@ def measure(path):
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('package')
parser.add_argument('--target-version', choices=['investigation_project_v5', 'investigation_project_v6'], default='investigation_project_v6')
args = parser.parse_args()
print(json.dumps(measure(args.package), indent=2))
print(json.dumps(measure(args.package, args.target_version), indent=2))