#!/usr/bin/env python3
import argparse, json, os, subprocess, tempfile, threading
p=argparse.ArgumentParser(description='Real clients against localhost fixture; no live inference or real credentials.')
p.add_argument('--claude',required=True)
p.add_argument('--opencode',required=True)
args=p.parse_args()
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path
M='deepseek/deepseek-v4.1-flash-1017'
seen=[]
class H(BaseHTTPRequestHandler):
 def log_message(self,*a): pass
 def do_POST(self):
  b=json.loads(self.rfile.read(int(self.headers.get('Content-Length',0))))
  seen.append(dict(path=self.path,model=b.get('model'),stream=b.get('stream'),bearer_fixture_key=self.headers.get('Authorization')=='Bearer fixture-key',anthropic_version=self.headers.get('anthropic-version')))
  self.send_response(200); self.send_header('Content-Type','text/event-stream'); self.end_headers()
  if self.path.startswith('/v1/messages'):
   ev=[dict(type='message_start',message=dict(id='msg_fixture',type='message',role='assistant',model=M,content=[],stop_reason=None,stop_sequence=None,usage=dict(input_tokens=100,output_tokens=0))),dict(type='content_block_start',index=0,content_block=dict(type='text',text='')),dict(type='content_block_delta',index=0,delta=dict(type='text_delta',text='LOCAL_FIXTURE_OK')),dict(type='content_block_stop',index=0),dict(type='message_delta',delta=dict(stop_reason='end_turn',stop_sequence=None),usage=dict(output_tokens=4)),dict(type='message_stop')]
   for e in ev: self.wfile.write(('event: '+e['type']+'\ndata: '+json.dumps(e)+'\n\n').encode())
  else:
   for delta,reason in [(dict(role='assistant',content=''),None),(dict(content='LOCAL_FIXTURE_OK'),None),({},'stop')]:
    e=dict(id='chatcmpl_fixture',object='chat.completion.chunk',created=1,model=M,choices=[dict(index=0,delta=delta,finish_reason=reason)])
    if reason:e['usage']=dict(prompt_tokens=100,completion_tokens=4,total_tokens=104)
    self.wfile.write(('data: '+json.dumps(e)+'\n\n').encode())
   self.wfile.write(b'data: [DONE]\n\n')
s=ThreadingHTTPServer(('127.0.0.1',0),H)
threading.Thread(target=s.serve_forever,daemon=True).start()
base='http://127.0.0.1:'+str(s.server_port)
out=[]
with tempfile.TemporaryDirectory() as d:
 env={k:os.environ[k] for k in ('PATH','TMPDIR','LANG') if k in os.environ}
 env.update(CLAUDE_CONFIG_DIR=d+'/claude',XDG_CONFIG_HOME=d+'/config',XDG_DATA_HOME=d+'/data',XDG_CACHE_HOME=d+'/cache',XDG_STATE_HOME=d+'/state',CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC='1',DISABLE_TELEMETRY='1',DISABLE_ERROR_REPORTING='1')
 config=dict(model='excession/'+M,small_model='excession/'+M,enabled_providers=['excession'],permission={'*':'deny'},provider={'excession':dict(npm='@ai-sdk/openai-compatible',name='Excession',options=dict(baseURL=base+'/v1',apiKey='{env:EXCESSION_API_KEY}'),models={M:dict(name='DeepSeek V4.1 Flash')})})
 Path(d+'/opencode.json').write_text(json.dumps(config))
 cases=[('claude-code',args.claude,['--safe-mode','--setting-sources','','--strict-mcp-config','--tools','','--no-session-persistence','--model',M,'--output-format','json','-p','Reply with LOCAL_FIXTURE_OK.'],dict(ANTHROPIC_BASE_URL=base,ANTHROPIC_AUTH_TOKEN='fixture-key')),
 ('opencode',args.opencode,['run','--pure','--format','json','--model','excession/'+M,'--title','Local fixture','Reply with LOCAL_FIXTURE_OK.'],dict(OPENCODE_CONFIG=d+'/opencode.json',EXCESSION_API_KEY='fixture-key',OPENCODE_DISABLE_DEFAULT_PLUGINS='true',OPENCODE_DISABLE_MODELS_FETCH='true'))]
 for name,bin,flags,extra in cases:
  start=len(seen)
  version=subprocess.run([bin,'--version'],env=env,capture_output=True,text=True,timeout=10).stdout.strip()
  try:
   r=subprocess.run([bin]+flags,cwd=d,env={**env,**extra},capture_output=True,text=True,timeout=50)
   out.append(dict(client=name,version=version,exit_code=r.returncode,rendered_fixture_marker='LOCAL_FIXTURE_OK' in r.stdout,requests=seen[start:],passed=r.returncode==0 and 'LOCAL_FIXTURE_OK' in r.stdout and any(q['path'].split('?')[0] == ('/v1/messages' if name == 'claude-code' else '/v1/chat/completions') and q['model']==M and q['stream'] and q['bearer_fixture_key'] for q in seen[start:])))
   if not out[-1]['passed']: print(r.stderr[-2000:])
  except subprocess.TimeoutExpired:out.append(dict(client=name,version=version,passed=False,error='timeout',requests=seen[start:]))
s.shutdown()
Path('deepseek-clients-results.json').write_text(json.dumps(dict(date='2026-11-04',test_type='Real clients, localhost mock SSE, fake credentials',live_inference=False,outcomes=out),indent=2))
print(json.dumps(out,indent=2))

raise SystemExit(0 if all(item["passed"] for item in out) else 1)
