가이드
Provider Web UI 작업을 명시적 prompt와 recoverable session으로 실행합니다.
Web-AI 명령은 보이는 browser UI를 통해 동작합니다. Provider API client도 아니고 API key를 사용하지도 않습니다.
보내기 전 렌더링
agbrowse web-ai render --vendor chatgpt --prompt "Explain the plan" --jsonSend + poll
SID=$(agbrowse web-ai send --vendor chatgpt --inline-only --prompt "Analyze this" --json | jq -r .sessionId)
agbrowse web-ai poll --vendor chatgpt --session "$SID"One-shot query
agbrowse web-ai query --vendor grok --inline-only --prompt "Find risks in this text"Capability registry
선언적 capability registry는 vendor별 capability 조회와 fail-closed gating을 제공합니다. 각 capability entry는 status, owner PRD, browser gate, fail-closed stage, family, frontend observation preset을 선언합니다. 지원하지 않는 capability를 대상으로 명령을 실행하면 browser mutation 전에 capability.unsupported를 발생시킵니다.
| 필드 | 용도 |
|---|---|
status | ready / beta / experimental / deferred |
browserGate | capability가 실행되기 전에 필요한 browser 조건 |
failClosedStage | capability를 사용할 수 없을 때 발생하는 stage 이름 |
frontendObservation | observation preset에 연결 (model selector, attachment, image generation, web search 등) |
agbrowse web-ai status --vendor chatgpt --json으로 현재 vendor에서 사용 가능한 capability를 확인합니다.
Annotated screenshot
Annotated (set-of-mark) screenshot은 페이지를 캡처하고 선택한 ref 요소에 bounding-box highlight를 overlay합니다. 결과는 image hash, dimensions, highlight count, timestamp를 포함하는 typed AnnotatedScreenshotResult입니다. Doctor diagnostics pipeline과 visual grounding workflow에서 사용됩니다.
# Annotated screenshot은 doctor와 diagnostics에서 내부적으로 사용됩니다.
agbrowse web-ai doctor --vendor chatgpt --jsonInterstitial detector
통합 interstitial detector는 send나 poll이 진행되기 전에 blocking 페이지를 분류합니다. 다섯 가지 종류를 인식합니다:
| 종류 | Retry hint |
|---|---|
cloudflare-challenge | wait-and-retry |
login-required | login |
empty-shell | navigate |
loading | wait-and-retry |
none | none |
classifier는 pure(모든 page signal이 인자로 전달됨)이므로 완전한 unit test가 가능합니다. Interstitial이 감지되면 typed result에 kind, evidence text, URL, retry hint가 포함됩니다.
Diagnostics stage
실패 diagnostics는 이제 더 풍부한 stage taxonomy를 사용합니다. 각 error envelope에 typed stage 필드가 포함되어 pipeline의 어느 지점에서 실패가 발생했는지 분류합니다 (예: visual-fallback, composer-resolve, model-select, poll-timeout). Stage-typed envelope 덕분에 error message를 string matching하지 않고도 올바른 recovery path로 라우팅할 수 있습니다.
Live status report
Typed standalone LiveStatusReport struct는 vendor에 관계없이 사용할 수 있는 health check를 제공합니다. 활성 탭이 올바른 provider URL에 있는지, 사용자가 로그인했는지, composer가 보이는지를 평가한 후 { vendor, status, runtimeEnabled, notes, sources } 형태의 structured 객체를 반환합니다.
agbrowse web-ai status --vendor chatgpt --jsonFreshness gate
Docs-first freshness gate는 공식 문서 retrieval evidence가 기록될 때까지 capability를 신뢰할 수 없도록 강제합니다. 유효한 freshness record에는 retrieval date, 검색한 vendor 문서, 사용한 공식 소스, visible updated dates, 이전 PRD 이후 feature 변경 사항, 모순이나 불안정한 제한, UI-authoritative plan-limit 확인, implementation impact, docs 때문에 업데이트한 테스트가 포함되어야 합니다. 필수 필드가 누락되거나 UI authority가 확인되지 않으면 gate가 거부합니다.
Copy-markdown fallback
인라인 텍스트 추출이 실패하면 --allow-copy-markdown-fallback이 runtime에 provider Copy/Markdown 버튼을 찾아 클릭하도록 요청합니다. 203.9 업데이트에서 lenient button-matching heuristic과 real click 경로가 추가되어 provider UI 변경으로 버튼 라벨이나 위치가 바뀌어도 fallback이 동작합니다.
agbrowse web-ai query \
--vendor chatgpt \
--inline-only \
--allow-copy-markdown-fallback \
--prompt "Summarize this document."Polling timeout
timeout 적용 순서는 직접 지정한 timeout → 저장된 deadline의 남은 시간 → tier 기본값 → vendor fallback입니다.
| 장기 tier | 기본 timeout |
|---|---|
chatgpt-pro | 5400초(90분) |
grok-heavy | 3600초 |
deep-research | 3600초 |
tier를 알 수 없으면 ChatGPT 1200초, Gemini 1200초, Grok 600초를 씁니다. 사용자가 알려 준 ChatGPT Pro 약 40분은 이번 DOM에서 확인되지 않은 UI 쪽 예산입니다. agbrowse timeout과는 별개입니다.
ChatGPT Work
agbrowse web-ai work send --prompt "Analyze this repository" --power 4같은 Work 전용 작업을 MCP에서 실행할 때는 web_ai_work_send를 씁니다. Chat 명령과 web_ai_submit_prompt는 Work에서 중단하며 surface=work를 받지 않습니다.
ChatGPT 모델 계약
| 입력 | 현재 UI |
|---|---|
instant | GPT-5.5의 Instant |
thinking --effort medium|high|xhigh | 선택한 family의 Medium|High|Extra High |
pro | 선택한 family의 단일 Pro 행 |
--family <gpt-5.6-sol|gpt-5.5|o3> | family submenu를 선택합니다. 생략하면 submenu를 건드리지 않고 현재 UI 선택을 유지합니다. |
예전 effort는 현재 값으로 바뀝니다. light|standard → medium, extended → high(스크립트를 쓰는 경우 stderr 경고 1줄), heavy → xhigh입니다. 예전 Pro effort도 단일 Pro로 처리하고 선택 없음 경고 1줄을 냅니다. Extended 계열 라벨은 2026-07-10 이전 UI 설명에만 남깁니다.
Generated image
ChatGPT 생성 이미지 출력은 beta이며 --output-image로 opt-in합니다:
agbrowse web-ai query \
--vendor chatgpt \
--inline-only \
--output-image ./out.png \
--prompt "Create an image of a small robot holding a banana."ChatGPT가 여러 이미지를 반환하면 agbrowse는 out.png, out-2.png, out-3.png처럼 sibling 파일로 저장합니다. 이미지 출력은 fail-closed입니다: 생성된 이미지를 감지하거나 저장할 수 없으면 조용히 성공하는 대신 provider.image-output을 반환합니다.
Batch follow-up
ChatGPT batch follow-up은 하나의 명령에서 여러 prompt를 순차적으로 보냅니다:
agbrowse web-ai query \
--vendor chatgpt \
--inline-only \
--prompt "Analyze this design." \
--follow-up "Summarize the risks." \
--follow-up "List the next three actions."같은 저장된 conversation에서 나중에 follow-up하려면 query --session <id> --prompt <text>를 사용합니다. --follow-up은 ChatGPT 전용이며 --research deep과 함께 사용할 수 없습니다.
Deep Research (experimental)
--research deep는 ChatGPT Deep Research 모드를 experimental beta로 활성화합니다:
agbrowse web-ai query \
--vendor chatgpt \
--inline-only \
--research deep \
--timeout 1800 \
--prompt "Research the current official status and cite sources."Deep Research는 가능하면 report artifact를 저장하고, session에 researchMode: "deep"을 기록하며, auto archive를 건너뛰고, 제출 후 Deep Research plan card를 자동 확인합니다. 계정 차단이나 누락된 provider UI surface는 명시적으로 보고됩니다. 이것을 ready cross-provider capability로 취급하지 마세요.
ChatGPT Project Sources
Project Sources는 append-only이며 명시적 ChatGPT project URL이 필요합니다:
agbrowse web-ai project-sources list \
--chatgpt-url https://chatgpt.com/g/project_123 --json
agbrowse web-ai project-sources add \
--chatgpt-url https://chatgpt.com/g/project_123 \
--file ./docs/context.md \
--dry-run summary--dry-run은 browser mutation 없이 project URL과 로컬 파일을 검증합니다. 실제 add는 upload evidence를 확인한 후 uploaded: true를 보고합니다. Delete, replace, clear 작업은 의도적으로 지원하지 않습니다.
ChatGPT, Gemini, Grok는 model alias와 UI 계약이 다릅니다. 스크립트 작성 전 agbrowse web-ai --help를 확인합니다.