verify-agent-read-repair.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. """Local regression and independent read-only public checks; no Agent deployment."""
  2. import contextlib
  3. import importlib.util
  4. import io
  5. import json
  6. from pathlib import Path
  7. import sys
  8. from unittest.mock import patch
  9. import urllib.request
  10. sys.dont_write_bytecode = True
  11. ROOT = Path(__file__).resolve().parents[1]
  12. sys.path.insert(0, str(ROOT / 'server/voc-library'))
  13. import library_channel as current
  14. def main():
  15. spec = importlib.util.spec_from_file_location('old_skill_channel', ROOT / 'skills/ksf-voc-library/scripts/library_channel.py')
  16. old = importlib.util.module_from_spec(spec); spec.loader.exec_module(old)
  17. query = {'entities': ['reviews'], 'text': {'any': ['份量']}}
  18. comparisons = []
  19. for module, label in ((old, 'installed-skill-source-before'), (current, 'local-candidate-after')):
  20. output, error = io.StringIO(), io.StringIO()
  21. with patch('sys.stdin', io.StringIO('\ufeff' + json.dumps(query))), \
  22. patch.object(module, 'send', return_value={'ok': True, 'readOnly': True, 'databaseWrites': 0}) as send, \
  23. contextlib.redirect_stdout(output), contextlib.redirect_stderr(error):
  24. status = module.read_main(['search', '--channel', 'unused', '--input', '-'])
  25. comparisons.append(dict(version=label, exitCode=status, sendCalled=send.called,
  26. result=json.loads(output.getvalue() or error.getvalue())))
  27. assert comparisons[0]['result']['error']['code'] == 'CHANNEL_READ_FAILED'
  28. assert not comparisons[0]['sendCalled']
  29. assert comparisons[1]['result']['ok'] and comparisons[1]['sendCalled']
  30. def public(request):
  31. req = urllib.request.Request('https://kangshifu.fmode.cn/api/library',
  32. data=json.dumps(request).encode(), headers={'Content-Type': 'application/json'}, method='POST')
  33. with urllib.request.urlopen(req, timeout=40) as response: data = json.load(response)
  34. assert data['ok'] and data['readOnly'] and data['databaseWrites'] == 0
  35. return data
  36. summary = public({'op': 'summary'}); generation = summary['generation']
  37. detail = public({'op': 'detail', 'entity': 'reviews',
  38. 'id': 'jd:100297147639:106531290235443828', 'generation': generation})
  39. record = detail['record']
  40. assert record['review_date_raw'] == '2026-11-06 10:49:00' and record['rating_raw'] == '5'
  41. assert record['rating_scale'] is None and record['is_default'] is None
  42. browse = public({'op': 'browse', 'entity': 'reviews', 'filters': {
  43. 'platform': 'jd', 'brand': 'ksf', 'category': 'banmian'},
  44. 'keyword': '味道', 'limit': 5, 'generation': generation})
  45. assert browse['generation'] == detail['generation'] == generation
  46. result = dict(ok=True, bomRegression=comparisons, historicalFailureRootCauseConfirmed=False,
  47. publicRead=dict(generation=generation, detail={k: record[k] for k in (
  48. 'id', 'platform_family', 'review_date_raw', 'review_calendar_date', 'rating_raw',
  49. 'rating_scale', 'is_default', 'source_record_id')},
  50. browseTotal=browse['totalMatched'], effectiveQuery=browse['effectiveQuery']),
  51. databaseWrites=0, paidCalls=0, deployedToAgent=False, originalQueryVerified=False)
  52. output = ROOT / 'docs/agent-library-read-repair-20261108/local-verification.json'
  53. output.write_text(json.dumps(result, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
  54. print(json.dumps(result, ensure_ascii=False))
  55. if __name__ == '__main__': main()