import os,json,urllib.request,urllib.error
base=os.environ['BASE_URL'].rstrip('/'); model=os.environ['MODEL']; admin=os.environ['ADMIN_KEY']; node=os.environ['NODE_NAME']
def req(method,path,headers=None,obj=None,timeout=90):
    data=None
    h=headers or {}
    if obj is not None:
        data=json.dumps(obj,ensure_ascii=False).encode(); h={**h,'Content-Type':'application/json'}
    r=urllib.request.Request(base+path,data=data,headers=h,method=method)
    try:
        with urllib.request.urlopen(r,timeout=timeout) as resp:
            body=resp.read().decode('utf-8','replace')
            try: j=json.loads(body)
            except Exception: j={'raw':body[:500]}
            return {'http':resp.status,'json':j}
    except urllib.error.HTTPError as e:
        body=e.read().decode('utf-8','replace')
        return {'http':e.code,'error':body[:500]}
    except Exception as e:
        return {'http':0,'error':type(e).__name__+': '+str(e)[:300]}
ak=req('GET','/api/v1/admin/users/'+os.environ.get('USER_ID','629')+'/api-keys?page=1&page_size=20',{'x-api-key':admin},None,20)
items=ak.get('json',{}).get('data',{}).get('items',[]) if ak.get('http')==200 else []
user_key=items[0].get('key') if items else ''
auth={'Authorization':'Bearer '+user_key}
models=req('GET','/v1/models',auth,None,30) if user_key else {'http':0,'error':'no user key'}
resp=req('POST','/v1/responses',auth,{'model':model,'input':'release-smoke-20260430-132310-node-'+node+' 请只回复 OK','max_output_tokens':32,'prompt_cache_key':'release-cache-20260430-132310-'+node},90) if user_key else {'http':0,'error':'no user key'}
chat=req('POST','/v1/chat/completions',{**auth,'x-grok-conv-id':'release-cache-20260430-132310-'+node},{'model':model,'messages':[{'role':'user','content':'release-smoke-20260430-132310-node-'+node+' 请只回复 OK'}],'max_tokens':32},90) if user_key else {'http':0,'error':'no user key'}
def resp_text(j):
    if 'output_text' in j: return j.get('output_text')
    out=j.get('output') or []
    texts=[]
    for it in out:
      if isinstance(it,dict):
        for c in it.get('content',[]) or []:
          if isinstance(c,dict) and 'text' in c: texts.append(c['text'])
    return ''.join(texts)[:120]
def chat_text(j):
    try: return j['choices'][0]['message']['content'][:120]
    except Exception: return ''
summary={
 'node':node,'base_url':base,'model':model,
 'admin_keys_http':ak.get('http'),'user_key_prefix':(user_key[:10]+'***') if user_key else '',
 'models_http':models.get('http'),'models_count':len(models.get('json',{}).get('data',[]) or []),'has_model':model in json.dumps(models.get('json',{})),
 'responses_http':resp.get('http'),'responses_status':resp.get('json',{}).get('status'),'responses_text':resp_text(resp.get('json',{})),'responses_usage':resp.get('json',{}).get('usage'),
 'chat_http':chat.get('http'),'chat_choices':len(chat.get('json',{}).get('choices',[]) or []),'chat_text':chat_text(chat.get('json',{})),'chat_usage':chat.get('json',{}).get('usage'),
 'errors': {k:v.get('error') for k,v in {'models':models,'responses':resp,'chat':chat,'admin':ak}.items() if v.get('error')}
}
print(json.dumps(summary,ensure_ascii=False,indent=2))
