clawdie-iso/doc/GLM-4.7-SMOKE.md

3 KiB

Pi + GLM-4.7 (Z.ai) Smoke Lane

Status: Transport already proven — this Opencode session runs on GLM-4.7 via z.ai. Remaining step: formal JSONL capture with pi --mode json. Owner: Opencode / Z.ai Integrator

Purpose

Capture a formal JSONL-mode proof that pi can talk to GLM-4.7 through the Z.ai provider lane. The transport itself is already validated — you are reading output from it right now. This doc exists to produce a capture artifact other agents can reference.

Key Situation

Sam does not need to provide a separate key. The z.ai API key that powers this Opencode session is already configured in the host's opencode setup. The question is whether pi can reach the same endpoint using its own --provider zai path with the same key.

If Sam's key is exposed as ZAI_API_KEY in the environment, pi picks it up automatically. If not, the key lives in opencode's own config and pi needs it exported explicitly for this smoke.

Expected Environment

  • pi: 0.75.5
  • node: 24.x (>=24 per the runtime engine policy)

Smoke Commands

1. Check if the key is already available to pi

echo "ZAI_API_KEY is set: ${ZAI_API_KEY:+yes}"

If not set, Sam can export it for this terminal:

read -rsp "ZAI API key: " ZAI_API_KEY; echo
export ZAI_API_KEY
export ZAI_API_BASE="https://api.z.ai/api/coding/paas/v4"

2. Prepare the repo-local capture directory

mkdir -p tmp

3. Discover available models

pi --provider zai --list-models 2>&1 | tee tmp/zai-models.txt

4. Filter for GLM models

grep -i glm tmp/zai-models.txt

5. Run smoke in JSON mode

Use the exact model ID from step 4:

pi --provider zai --model '<EXACT_GLM_MODEL_ID>' -p --mode json "reply with the single word: ok" 2>&1 | tee tmp/glm47-smoke.jsonl

6. Validate the JSONL event stream

python3 -c "
import json

provider = 'MISSING'
model = 'MISSING'
content_parts = []
events = []

with open('tmp/glm47-smoke.jsonl', 'r', encoding='utf-8') as f:
    for raw in f:
        line = raw.strip()
        if not line:
            continue
        obj = json.loads(line)
        events.append(obj.get('type', 'MISSING'))
        provider = obj.get('provider') or provider
        model = obj.get('model') or model
        delta = obj.get('delta')
        if isinstance(delta, str):
            content_parts.append(delta)
        text = obj.get('text')
        if isinstance(text, str):
            content_parts.append(text)

content = ''.join(content_parts)
print('events:', ','.join(events))
print('provider:', provider)
print('model:', model)
print('content:', content[:120] or 'MISSING')
print('PASS' if 'ok' in content.lower() else 'FAIL')
"

7. Clean up

unset ZAI_API_KEY ZAI_API_BASE

What to Report Back

  1. Exact model ID from --list-models
  2. Provider and model fields recovered from the JSONL stream
  3. Event types seen in the stream
  4. PASS/FAIL
  5. Wall-clock latency

Deletion Criteria

  • JSONL capture artifact is committed
  • Lane confirmed in agent capability table