"""Direct Claude Messages API example; local dry-run and mock tests only. Set ANTHROPIC_API_KEY in your environment to run a charged live request. No automatic retry. No external packages. Keeps API credentials out of output. """ import argparse import json import os import sys import urllib.error import urllib.request def payload(prompt, effort='medium', max_tokens=16000): if effort not in ['low','medium','high','xhigh','max']: raise ValueError('Unsupported effort') if not 1 <= max_tokens <= 128000: raise ValueError('max_tokens must be between 1 and 128000') return {'model':'claude-haiku-5-5', 'max_tokens':max_tokens, 'thinking':{'type':'adaptive'}, 'output_config':{'effort':effort}, 'messages':[{'role':'user','content':prompt}]} def visible_text(response): return '\n'.join(block['text'] for block in response.get('content', []) if block.get('type') == 'text' and isinstance(block.get('text'), str)) def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--prompt', default='Explain why token price differs from cost per accepted result.') parser.add_argument('--effort', choices=['low','medium','high','xhigh','max'], default='medium') parser.add_argument('--max-tokens', type=int, default=16000) parser.add_argument('--dry-run', action='store_true') args = parser.parse_args() try: body = payload(args.prompt,args.effort,args.max_tokens) except ValueError as error: parser.error(str(error)) if args.dry_run: print(json.dumps(body,indent=2)) return 0 key = os.environ.get('ANTHROPIC_API_KEY') if not key: print('Set ANTHROPIC_API_KEY in your environment, or use --dry-run.',file=sys.stderr) return 2 request = urllib.request.Request('https://api.anthropic.com/v1/messages', data=json.dumps(body).encode('utf-8'),method='POST',headers={ 'x-api-key':key, 'anthropic-version':'2023-06-01', 'content-type':'application/json'}) try: with urllib.request.urlopen(request,timeout=180) as result: response = json.load(result) except urllib.error.HTTPError as error: print(f'HTTP {error.code}; request failed. Consult provider logs before retrying.',file=sys.stderr) return 3 except (urllib.error.URLError,TimeoutError,json.JSONDecodeError): print('Request or response failed; no automatic retry. Check account usage before retrying.',file=sys.stderr) return 3 stop = response.get('stop_reason') text = visible_text(response) print(json.dumps({'stop_reason':stop,'usage':response.get('usage',{})},indent=2)) if text: print(text) if stop != 'end_turn' or not text.strip(): print('Reply is refused, incomplete, non-text, or awaiting tools; do not accept automatically.',file=sys.stderr) return 4 return 0 if __name__ == '__main__': sys.exit(main())