Files
NotesAgentic/backend/scripts/phase2-context.py
T

51 lines
3.5 KiB
Python

"""执行两次有界真实调用完成上下文摘要与回答,不修改已保存配置。"""
import argparse, asyncio, json, sys
from pathlib import Path
sys.path.insert(0,str(Path(__file__).resolve().parents[1]))
async def main(args):
from app.container import container
from app.contracts import ModelRequest, ModelContextPolicy
from app.providers.factory import ProviderFactory
from app.providers.context_budget import prepare_context, estimate
from app.providers.base import ProviderError
from app.services.usage_service import connection
provider=container.providers.get(args.provider)
model=provider.config.default_model
request=ModelRequest(provider_id=args.provider,model=model,max_tokens=1024,messages=[
{'role':'user','content':'项目事实:笔记保存在 Vault,导出使用点击时的快照。'*50},
{'role':'assistant','content':'已记录。'}, {'role':'user','content':'请保持中文。'},
{'role':'assistant','content':'好的。'}, {'role':'user','content':'笔记保存在什么地方?一句话回答。'}])
original=request.model_dump()
config=provider.config.model_copy(deep=True)
config.context_policies=[ModelContextPolicy(model=model,context_window=8192,output_reserve=512,threshold=.1,mode='detect')]
calls=0
async def complete(value):
nonlocal calls
calls+=1
return await provider.adapter.complete(value)
results={'model':model,'configured_test_window':8192,'vendor_max_context_tested':False}
try:
try: await prepare_context(request,config,complete)
except ProviderError as exc: results['detect']={'error_code':exc.code,'network_calls':calls}
config.context_policies[0].mode='compress'
config.context_policies[0].prompt='把以下历史资料压缩成一句中文,只保留笔记存储位置和导出快照规则。'
prepared=await asyncio.wait_for(prepare_context(request,config,complete),60)
turn=await asyncio.wait_for(complete(prepared),60)
results['compression']={'passed':'vault' in (turn.text or '').lower(),'before_estimate':estimate(request),
'after_estimate':estimate(prepared),'archive_unchanged':request.model_dump()==original,'network_calls':calls,
'answer_input_tokens':turn.input_tokens,'answer_output_tokens':turn.output_tokens}
with connection() as conn:
rows=[json.loads(row[0]) for row in conn.execute('SELECT counters_json FROM model_usage WHERE provider_id=?',(args.provider,))]
results['observed_provider_cache']={'requests':len(rows),'reporting_requests':sum(x.get('cache_hit_tokens') is not None for x in rows),
'positive_hit_requests':sum((x.get('cache_hit_tokens') or 0)>0 for x in rows),
'positive_miss_requests':sum((x.get('cache_miss_tokens') or 0)>0 for x in rows),
'scope':'provider reported usage across this isolated acceptance session; not deterministic cache control'}
finally:
args.output.write_text(json.dumps(results,ensure_ascii=False,indent=2),encoding='utf-8')
print(json.dumps(results,ensure_ascii=False))
await container.agent.shutdown();container.mcp_servers.shutdown();container.plugins.shutdown()
if __name__=='__main__':
p=argparse.ArgumentParser();p.add_argument('--provider',required=True);p.add_argument('--output',type=Path,required=True);p.add_argument('--execute',action='store_true');args=p.parse_args()
if not args.execute:p.error('--execute required; two requests use existing quota')
asyncio.run(main(args))