{"id":"openai-chat-completion","version":"1.0.0","primitive":"code_execution","description":"Model to use for completion","registry_refs":["openai"],"tags":[],"solves":[],"auth_required":true,"verified":false,"last_verified":"null","next_check":"2026-07-30","eval_result":"null","eval_env":"null","mast":[],"ref":"https://arxiv.org/abs/2503.13657","inputs":[{"name":"OPENAI_API_KEY","required":true,"description":"OpenAI API key starting with sk-"},{"name":"OPENAI_MODEL","default":"gpt-4o-mini","required":false,"description":"Model to use for completion"}],"executable":"# ============================================\n# checklist:     openai-chat-completion\n# version:       1.0.0\n# primitive:     code_execution\n# description:   Send a basic chat completion request to OpenAI and parse the response correctly\n# registry_refs: openai\n# auth_required: true\n# verified:      false\n# last_verified: null\n# next_check:    2026-07-30\n# eval_result:   null\n# eval_env:      null\n#\n# inputs:\n#   - name: OPENAI_API_KEY\n#     required: true\n#     description: OpenAI API key starting with sk-\n#   - name: OPENAI_MODEL\n#     required: false\n#     default: \"gpt-4o-mini\"\n#     description: Model to use for completion\n#\n# OUTPUTS:\n#   model          — model used for completion\n#   content        — response text content\n#   prompt_tokens  — tokens used in prompt\n#   completion_tokens — tokens used in completion\n#   finish_reason  — why the model stopped generating\n#\n# MAST FAILURE MODES ADDRESSED:\n# FM-2.6 Reasoning-Action Mismatch         — correct import and client instantiation enforced\n# FM-3.2 No or Incomplete Verification     — token counts and finish_reason verified\n# FM-3.3 Incorrect Verification            — content extracted from correct path in response\n#\n# ref: https://arxiv.org/abs/2503.13657\n# ============================================\n\nimport sys\nimport os\nimport subprocess\nimport time\nimport urllib.request\nimport json\n\n# ─────────────────────────────────────────\n# PRE_EXECUTION\n# ─────────────────────────────────────────\n\nfor attempt in range(2):\n    try:\n        req = urllib.request.Request(\n            \"https://checklist.day/api/registry/openai\",\n            headers={\"User-Agent\": \"checklist-agent/1.0\"}\n        )\n        with urllib.request.urlopen(req, timeout=10) as resp:\n            registry = json.loads(resp.read())\n            break\n    except Exception as e:\n        if attempt == 1:\n            print(f\"ABORT: registry unreachable — {e}\")\n            sys.exit(1)\n        time.sleep(2)\n\nwarnings = registry.get(\"warnings\", [])\nif warnings:\n    print(\"[openai] WARNINGS:\")\n    for w in warnings if isinstance(warnings, list) else [warnings]:\n        print(f\"  ⚠ {w}\")\n\n# ─────────────────────────────────────────\n# EXECUTION\n# ─────────────────────────────────────────\n\nsubprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"-q\", \"openai>=1.0.0\"])\n\n# FOOTGUN: import is `from openai import OpenAI`, not `import openai` then `openai.ChatCompletion.create()`\n# FOOTGUN: openai.ChatCompletion.create() was removed in v1.0 — use client.chat.completions.create()\nfrom openai import OpenAI\n\nOPENAI_API_KEY = os.environ.get(\"OPENAI_API_KEY\")\nOPENAI_MODEL   = os.environ.get(\"OPENAI_MODEL\", \"gpt-4o-mini\")\n\nif not OPENAI_API_KEY:\n    print(\"ABORT: OPENAI_API_KEY env var not set\")\n    sys.exit(1)\n\nclient = OpenAI(api_key=OPENAI_API_KEY)\n\nresponse = client.chat.completions.create(\n    model=OPENAI_MODEL,\n    messages=[\n        {\"role\": \"system\", \"content\": \"You are a helpful assistant. Be concise.\"},\n        {\"role\": \"user\",   \"content\": \"Say the word CHECKLIST and nothing else.\"},\n    ],\n    max_tokens=16,\n    temperature=0,\n)\n\n# FOOTGUN: content is at response.choices[0].message.content, not response.content\n# FOOTGUN: content can be None if finish_reason is \"content_filter\"\ncontent       = response.choices[0].message.content\nfinish_reason = response.choices[0].finish_reason\nprompt_tokens = response.usage.prompt_tokens\ncompletion_tokens = response.usage.completion_tokens\n\nprint(f\"  model:         {response.model}\")\nprint(f\"  content:       {content!r}\")\nprint(f\"  finish_reason: {finish_reason}\")\nprint(f\"  tokens:        {prompt_tokens} prompt + {completion_tokens} completion\")\n\n# ─────────────────────────────────────────\n# POST_EXECUTION\n# ─────────────────────────────────────────\n\nassert content is not None, \"FAIL: content is None (content_filter?)\"\nassert \"CHECKLIST\" in content.upper(), f\"FAIL: expected 'CHECKLIST' in response, got: {content!r}\"\nassert finish_reason == \"stop\", f\"FAIL: unexpected finish_reason '{finish_reason}'\"\nassert prompt_tokens > 0, \"FAIL: prompt_tokens is 0\"\nassert completion_tokens > 0, \"FAIL: completion_tokens is 0\"\n\nresult = {\n    \"model\":             response.model,\n    \"content\":           content,\n    \"prompt_tokens\":     prompt_tokens,\n    \"completion_tokens\": completion_tokens,\n    \"finish_reason\":     finish_reason,\n}\nprint(json.dumps(result, indent=2))\nprint(\"PASS\")\n"}