설명
Google의 Gemini API가 promptFeedback.blockReason를 사용하여 요청을 거부하면, Discourse AI는 해당 응답을 성공적이지만 빈 응답으로 처리합니다. AI 번역에서는 이것이 두 가지 결과를 낳습니다. 주제나 게시물이 감지된 언어를 부여받지 못해 번역이 이루어지지 않으며, 백필(backfill)이 이후 실행 시 동일한 차단된 요청을 다시 전송합니다. 관리자에게 차단이 발생했다는 것을 알리는 어떠한 표시도 없습니다.
이 문제는 release/2026.7 (2026.7.3, 커밋 f1caa6321287f918644fba9ff8943579fdcf027a)을 실행 중인 자체 호스팅 사이트에서 번들된 discourse-ai 플러그인과 함께 관찰되었습니다. 해당 요청은 내장된 로케일 감지 에이전트를 사용하여 gemini-3.5-flash-lite로 주제 제목의 언어를 감지하는 것이었습니다. 제목은 스웨덴어로 된 짧고 무해한 문장이었습니다. 동일한 제목은 gemini-3.8-flash로 번역할 때 차단되지 않았습니다.
Google은 HTTP 200과 후보(candidates)가 없는 단일 스트림 이벤트로 응답했습니다:
data: {"promptFeedback": {"blockReason": "PROHIBITED_CONTENT"},"usageMetadata": {"promptTokenCount": 417,"totalTokenCount": 417,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 417}],"serviceTier": "standard"},"modelVersion": "gemini-3.5-flash-lite","responseId": "..."}
요청에는 이미 Discourse AI가 설정하는 4가지 안전 범주에 대해 BLOCK_NONE이 포함되어 있으므로, 이 차단은 해당 설정이 영향을 미치지 않는 유형입니다. 감사 로그에는 response_status 200이 기록됩니다.
근본 원인
DiscourseAi::Completions::Endpoints::Gemini#decode_chunk는 각 스트림 이벤트에서candidates만 읽습니다.promptFeedback는 절대 검사되지 않으므로, 차단된 요청은 오류 없이 빈 결과를 생성합니다.DiscourseAi::Translation::LanguageDetector#detect는 응답이 언어 태그 패턴과 일치하지 않을 때nil을 반환합니다. 이는 빈 응답의 경우 해당됩니다. 주제나 게시물은locale이 NULL 상태를 유지합니다.Jobs::TopicsLocaleDetectionBackfill은 모든 실행 시locale이 NULL인 주제를 선택하며 시도 횟수 제한이 없습니다. 따라서 코드를 읽어보면, 주제가 백필 윈도우에 있는 동안 차단된 요청이 5분마다 반복됩니다. 게시물은 재로케일화(relocalize) 할당량에 의해 하루 2회의 감지 시도로 제한되며, 매일 재시도됩니다.- 번역 후보는 감지된 로케일을 필요로 하므로, 해당 항목은 영원히 번역되지 않습니다.
2026-10-03 기준 main 브랜치에도 동일한 코드가 존재합니다.
권장 수정 사항
- Gemini 엔드포인트에서
promptFeedback.blockReason를 감지하고, 원인을 명시하는 고유하고 눈에 띄는 오류를 발생시키거나 기록하십시오. - 주거나 게시물에 실패를 기록하여 다시 차단될 요청이 백필에 의해 반복되지 않도록 하거나, 게시물의 경우 이미 존재하는 것처럼 주제 감지에 시도 횟수 제한을 적용하십시오.
- 번역 관리자 페이지에서 차단된 항목을 표시하여 관리자가 수동으로 언어를 설정할 수 있도록 하십시오.
재현 방법
차단은 Google의 필터에 따라 달라지며, 알려진 입력으로 강제할 수 없습니다. 영향을 받은 호출은 감사 로그에서 찾을 수 있습니다:
SELECT id, created_at, language_model, post_id, topic_id, response_status
FROM ai_api_audit_logs
WHERE feature_name = 'translation'
AND raw_response_payload LIKE '%blockReason%'
ORDER BY created_at
우회 방법
주제의 언어를 수동으로 설정하면 번역이 진행됩니다. 이 사이트에서는 번역 모델이 동일한 텍스트를 차단하지 않았습니다.