@oh-my-pi/pi-agent-core/image-tokens에서 estimateImageContentTokens()를 제거했습니다. 대신 Tokenizer.imageTokens(size, detail)을 사용하세요. 이 함수는 읽기 모델의 카탈로그 이미지 규칙에 따라 가격을 산정합니다 (#15446 by @will-bogusz)applyShakeRegion()과 applyShakeRegions()는 교체 콘텐츠의 토큰 수(replacementTokens)를 받습니다. 어시스턴트 턴의 블록 재작성 시 제거된 토큰을 elidedOutputTokens에 더하므로, 재생된 Claude 턴의 토큰 수가 리로드 후에도 낮아진 상태로 유지됩니다 (#15446 by @will-bogusz)isOfficialCodexApiUrl을 @oh-my-pi/pi-ai에서 @oh-my-pi/pi-catalog/wire/codex로 옮겼습니다. CODEX_BASE_URL 옆에 위치하며, 카탈로그의 compat 리졸버가 동일한 검사로 Codex 엔드포인트를 분류합니다 (#15434 by @will-bogusz)withoutUnverifiedThinking 유틸리티를 추가했습니다reachesOfficialEndpoint(model)를 추가했습니다. 모델에 대한 요청이 해당 compat이 구성된 공식 엔드포인트에 도달하는지 여부를 반환하며, 최초 파티 Anthropic 모델에 대한 ANTHROPIC_BASE_URL 및 Foundry의 FOUNDRY_BASE_URL 리라우팅을 반영합니다 (#15434 by @will-bogusz)AssistantMessage.elidedOutputTokens를 추가했습니다. 기록 재작성(shake)으로 해당 턴에서 제거된 가시적 출력 토큰 수이며, usage.output에는 여전히 포함되어 있습니다 (#15446 by @will-bogusz)providers/transform-messages의 shouldDropTruncatedThinkingOnlyAssistant, providers/openai-shared의 isColdReplayableResponsesTurn, providers/openai-responses의 새 openAIResponsesReplaysNativeHistory를 내보내도록 했습니다. 이를 통해 로컬 토큰 추정이 재생 시 제외되는 턴과 세션의 네이티브 기록 재생 여부를 따를 수 있습니다 (#15447 by @will-bogusz)resolveInlineImageByteBudget(model, officialEndpoint)와 resolveImageCountBudget(model, officialEndpoint)는 compat.officialEndpoint를 읽는 대신 요청이 공식 엔드포인트에 도달하는지 여부를 인자로 받습니다. 기존 방식은 ANTHROPIC_BASE_URL 같은 요청 시점 리라우팅을 놓쳤습니다. pi-ai의 reachesOfficialEndpoint(model)를 전달하세요 (#15434 by @will-bogusz)muse-wonder-1.0)를 minimal–max 노력 단계 및 가격과 함께 추가했습니다thinking-unverified 규칙 축을 추가했습니다. 모델 목록에 기능 메타데이터가 없는 호스트(Meta, Muse Code)에서 인식되지 않은 모델은 이제 아무것도 제공하지 않는 대신 옵트인 thinking 단계(ThinkingConfig.unverified)를 제공합니다thinking-unverified 축을 추가했습니다Muse Wonder 1.0 모델 정의를 추가했습니다snapcompact-image-reads 축을 추가했습니다. 해당 규칙을 설정한 읽기 모델에 한해 새 read 결과를 snapcompact 이미지로 변환합니다. Claude Opus 5.5 이상이 옵트인합니다 (#14249 by @will-bogusz)image-count-budget 규칙을 추가했습니다(Anthropic 90, Codex 200, 기타 호스트는 변경 없음). 공식 엔드포인트에서만 적용되는 official-image-count-budget 재정의도 추가했습니다: Anthropic 600(200k 윈도우 Claude 모델은 100), Codex 2,000 (#15434 by @will-bogusz)/codex/responses 같은 하위 경로에서 공식 엔드포인트로 간주됩니다 (#15434 by @will-bogusz)isOfficialCodexApiUrl을 wire/codex에 추가했습니다 (#15434 by @will-bogusz)image-tokenization 규칙에 verified를 추가했습니다. Claude 4.7+ 고해상도 티어와 GPT-5.5~6.1, gpt-6-astra 규칙이 측정된 제공자 청구와 일치함을 표시합니다 (#15442 by @will-bogusz)image-max-edge 축과 resolveImageMaxEdge()를 추가했습니다. Cursor의 Claude 및 GPT 모델과 default(Auto) 경로는 1024×1024에 맞습니다 (#15448 by @will-bogusz)thinking-replay-tokens 축을 추가했습니다. Claude 계열은 모든 호스트에서 이를 output으로 설정합니다. 서명된 thinking 블록이 재생되면 서명 바이트가 아니라 해당 턴의 전체 추론량이 청구되기 때문입니다 (#15446 by @will-bogusz)max-image-dimension과 max-image-payload-bytes를 적용하고, Google Antigravity의 Claude에 이미지당 5 MiB 제한을 명시했습니다 (#15444 by @will-bogusz)task.agentSoftRequestBudget을 추가했습니다. 장시간 실행되는 에이전트는 더 많은 요청을 할 수 있고(0이면 가드 없음), scout, sonic 등 다른 에이전트는 기존 예산을 유지합니다 (#15419 by @will-bogusz)models.yml 재정의에서 사용할 수 있도록 o200k를 tokenizer 값으로 추가했습니다 (#15447 by @will-bogusz)ANTHROPIC_BASE_URL 또는 Foundry의 FOUNDRY_BASE_URL로 리라우팅된 Anthropic 요청을 포함한 사용자 지정 기본 URL은 이전 제한을 그대로 유지하며, Anthropic의 24 MB 인라인 이미지 바이트 제한도 더 이상 적용되지 않습니다 (#15434 by @will-bogusz)snapcompact.toolResults가 대용량 도구 결과를 텍스트로 전송한 다음 턴에 이미지로 다시 전송하던 문제를 수정했습니다. 이로 인해 매 턴 프롬프트 캐시와 Anthropic 서명된 thinking이 깨졌습니다. 이제 결과는 처음 전송할 때부터 이미지로 변환되며, 모델이 이미지에서 정확히 편집할 수 있다고 알려진 경우(Opus 5.5+)를 제외하고 read 결과는 텍스트로 유지됩니다 (#14249 by @will-bogusz)compaction.keepRecentTokens가 요구하는 최근 기록의 약 절반만 유지하던 문제를 수정했습니다. 유지되는 각 턴이 서명 크기로 계산되었기 때문입니다 (#15446 by @will-bogusz)omp --restore <session>을 추가했습니다. --resume처럼 세션을 재개한 뒤, 이전 프로세스가 충돌하거나 종료되며 완료하지 못한 작업을 이어서 진행합니다. 중단된 턴과 그 턴이 실행 중이던 서브에이전트가 모두 포함되며(결과는 평소처럼 상위로 전달됩니다), Tern의 세션 데몬은 충돌 후 이 옵션으로 omp를 재시작합니다providerImageBudget(provider)와 providerFrameBudget(provider)는 providerImageBudget(model)와 providerFrameBudget(model)로 바뀌었고, maxFramesForDataBudget(shape)는 필수 바이트 예산을 받는 maxFramesForDataBudget(shape, budget)로 바뀌었습니다 (#15434 by @will-bogusz)PROVIDER_IMAGE_BUDGETS와 FRAME_DATA_BYTES_BUDGET을 제거했습니다. 이미지 수는 카탈로그의 image-count-budget 규칙에서, 프레임 바이트 예산은 frameDataBytesBudget(model)에서 가져옵니다(호스트에 값이 없으면 DEFAULT_FRAME_DATA_BYTES_BUDGET 사용) (#15434 by @will-bogusz)plannedFrameTokens와 Shape.frameTokensVerified를 추가했습니다. 읽기 모델의 image-tokenization 규칙이 verified이면 아카이브 크기 산정이 프레임 자체 가격을 적용하고, 그렇지 않으면 최소 FRAME_TOKEN_ESTIMATE를 적용합니다 (#15442 by @will-bogusz)default(Auto) 경로를 포함해 Cursor에서 Claude와 GPT에 쓰이는 snapcompact 프레임이 1568–1932px로 그려져, 모델이 읽기 전에 Cursor가 1024px로 축소하던 문제를 수정했습니다. 이제 프레임은 호스트의 카탈로그 image-max-edge에 맞춰 렌더링됩니다 (#15448 by @will-bogusz)snapcompact.shape 설정 미리보기에서 프레임 가장자리가 변형 표와 다를 때 변형에 5x8-sent라고 표시되고 첫 번째 변형의 샘플을 반복하던 문제를 수정했습니다(Cursor의 Claude 및 GPT, 고해상도 Claude의 auto) (#15448 by @will-bogusz)Full Changelog: v18.10.2...v18.10.3