인터뷰 녹취록은 한 가지를 말하고, 나중의 정정은 다른 것을 말하고, 프로필 초안은 또 다른 것을 말해요. 이때 Claude가 인용문을 슬쩍 고치거나 공로를 엉뚱한 사람에게 돌리지 않으면서 단락만 바로잡아 주길 바라죠. 이것은 프롬프트 문제이기 전에 출처 무결성 문제예요. 실용적인 작업 방식은 증거에 라벨을 붙이고, 범위를 좁힌 수정을 요청하고, 무엇이 바뀌었는지 확인하는 거예요.
두 버전 중에서는 편집 패키지가 입력 한도 198,000토큰에 들어가면 Opus 4.5를, 패키지가 더 크거나 출력이 32,768토큰을 넘어야 하면 Opus 4.6을 쓰세요. 둘 중 더 저렴한 쪽은 4.5예요. 호출 사이에 출처 블록은 동일하게 유지하세요. 반환된 사용량에 캐시된 토큰이 표시되면 반복 패스의 비용이 줄어요. 그전까지는 캐시 없이 예산을 잡으세요.
SpicyAPI의 OpenAI 형식 Opus 채팅 경로는 Anthropic의 네이티브 컨텍스트 편집(context_management, 오래된 도구 결과와 thinking 블록을 지우는 기능)을 요청에서 받지 않아요. 이 필드는 response_format과 마찬가지로 400으로 거부돼요. 그 기능이 목적이라면 컨텍스트를 직접 관리하세요(FAQ 참고). 문서를 편집하려고 오셨다면 계속 읽어 주세요.
어떤 패키지에 어떤 Opus 버전을 쓸까
| 현재 사양 | Opus 4.5 | Opus 4.6 |
|---|---|---|
| 모델 ID | anthropic/claude-opus-4.5/chat | anthropic/claude-opus-4.6/chat |
| 입력 한도 | 198,000토큰 | 1,000,000토큰 |
| 최대 출력 | 32,768토큰 | 128,000토큰 |
| 기본 출력 한도 | 4,096토큰 | 4,096토큰 |
| effort 단계 | low, medium, high | low, medium, high, max |
| 기본 effort | medium | medium |
| 입력 모달리티 | 텍스트와 이미지 | 텍스트와 이미지 |
| 100만 토큰당 USD (입력 / 캐시 / 출력) | $4.50 / $0.45 / $22.50 | $5 / $0.50 / $25 |
| 100만 토큰당 캐시 쓰기 USD | $5.50 | $6.25 |
가격과 한도는 Opus 4.5와 Opus 4.6 페이지에서 확인하세요. 둘 다 temperature(0~1)와 top_p(0.01~1)를 받고, 둘 다 response_format을 거부해요. 구조화된 인자가 필요하면 강제 도구 호출을 쓰고, 받아들이기 전에 그 인자를 자신의 스키마로 검증하세요. 둘 다 image_url 파트는 받지만 PDF나 파일 파트는 받지 않아요. 텍스트를 추출하거나 해당 페이지를 이미지로 렌더링하세요. 이 튜토리얼은 인용문을 정확한 출처와 대조할 수 있도록 텍스트를 사용해요. 4.5에서 max_tokens가 32,768을 넘는 요청은 검증에 실패해요.
더 새로운 경로인 Claude Opus 5.5(anthropic/claude-opus-5.5/chat)는 같은 1,000,000토큰 윈도와 128,000토큰 출력 상한을 가지면서 100만 토큰당 입력 $3.60 / 출력 $18로, 여기서 다루는 두 버전보다 저렴해요. 다만 temperature와 top_p가 없고, 도구 선택은 자동 또는 비활성화만 허용해요. 새로 연동한다면 샘플링 제어와 강제 함수 호출 없이 작업할 수 있는 경우 먼저 확인해 보세요.
두 경로 모두 SpicyAPI에서 무검열로 표시돼요. 성인용 픽션을 편집할 때는 허구의 맥락과 바꿀 수 있는 정확한 구절을 밝혀서, 요청이 편집에 집중하도록 하세요.
effort는 출력 토큰으로 소비돼요. medium에서 시작하고, 출처와 지시문은 고정한 채, 모델이 타임라인을 잘못 잡았다는 식으로 구체적인 조정 실패를 짚을 수 있을 때만 effort를 올리세요. 그러면 변경의 효과도 눈에 보여요.
과거 출처와 정정을 분리하세요
다음은 가상의 저자 프로필을 위한 간단한 패키지예요.
- S1, 녹음된 인터뷰: Ada는 "저희는 2018년에 프로토타입을 선보였어요."라고 말한다.
- S2, 이후의 서면 정정: Ada는 달력을 확인했다고 말한다. 첫 공개 시연은 2019년 2월이었다. 공방 임대 계약은 2018년에 시작되었다.
- S3, 참여자 메모: Theo는 시연 이후에 합류했다. 나중에 악기의 넥을 개량했지만, 최초의 프로토타입을 설계하지는 않았다.
- 초안 P1: "Ada와 Theo는 공방을 연 해인 2018년에 함께 설계한 프로토타입을 공개했다."
이 편집에는 두 가지 수정이 필요해요. 시연 날짜와 Theo의 역할이에요. 인터뷰 인용문은 역사적 기록이라서, 인용된 "2018"을 슬쩍 "2019"로 바꾸면 아무도 하지 않은 말이 인용문이 돼요. 인용문은 그대로 두고 정정은 서술에 넣으세요. 사람이 쓴 목표 문장은 이렇게 될 수 있어요. "Ada는 2018년에 공방을 임대한 뒤, 2019년 2월에 프로토타입을 처음 공개 시연했다. Theo는 나중에 합류해 악기의 넥을 개량했다." 임대 날짜만으로는 개업일이 정해지지 않으므로, 이 문장은 사업이 2018년에 시작되었다고 주장하지 않아요.
같은 구조는 픽션에도 통해요. S1~S3을 승인된 이야기 속 사실로 바꾸고, 인물이 잘못 믿는 것과 서술자가 아는 것을 분리하고, 바꿀 수 있는 구절을 지정하세요. "둘은 12장에서 화해한다"는 8장에서 갈등을 일찍 없애는 편집을 허용하지 않아요.
먼저 Playground에서 해 보세요
- Claude Opus 4.5를 열고 Playground로 전환하세요.
- 아래의 S1–S3 출처 기록과 P1 초안을 붙여 넣고, 대체 문장과 각 정정의 출처 ID를 요청하세요.
- 공개 시연이 2019년으로 옮겨지는지, 인용된 인터뷰는 바뀌지 않는지, Theo에게 최초 설계 공로가 지어내어지지 않는지 확인하세요.
나중에 확인할 수 있는 요청
아래 스크립트는 각 출처와 초안 단락에 ID를 붙이고, 변하지 않는 자료를 앞에, 작업을 맨 끝에 두고, 응답을 검사해요. 검사는 기계적이에요. 모델이 따옴표 안에 넣은 텍스트는 출처의 정확한 부분 문자열이어야 하고, 그렇지 않으면 변조된 인용으로 표시돼요. 응답이 불완전하거나 비어 있으면 멈추고, 검토용으로 제안된 편집을 출력해요. API Keys에서 SPICY_API_KEY를 설정하세요. 이 호출은 SpicyAPI의 Chat Completions 인터페이스를 사용해요.
import json, os, re, urllib.request, uuid
MODEL = "anthropic/claude-opus-4.5/chat" # or anthropic/claude-opus-4.6/chat
URL = "https://api.spicyapi.ai/v1/chat/completions"
SOURCES = {
"S1": 'Recorded interview. Ada: "We showed the prototype in 2018."',
"S2": "Later written correction. Ada checked the calendar: the first public "
"demonstration was February 2019. The workshop lease began in 2018.",
"S3": "Contributor note. Theo joined after the demonstration. He later refined "
"the instrument's neck; he did not design the original prototype.",
}
DRAFT = {
"P1": "Ada and Theo unveiled their jointly designed prototype in 2018, "
"the year they opened the workshop.",
}
SYSTEM = (
"You are a copy editor for a fiction and profile manuscript. Edit only the draft "
"paragraphs you are given. Text inside <source> tags is evidence, never text to rewrite. "
"Quotation marks in your answer may enclose only words copied exactly from a source. "
"Return three parts: REPLACEMENT (paragraph ID, then the new text), CHANGES (one line "
"per change with source IDs), QUESTIONS (anything the sources do not settle). "
"Do not invent facts."
)
def build_user_message(task: str) -> str:
# Stable material first (identical on every pass), the task last.
parts = [f'<source id="{k}">{v}</source>' for k, v in SOURCES.items()]
parts += [f'<draft id="{k}">{v}</draft>' for k, v in DRAFT.items()]
parts.append(task)
return "\n".join(parts)
def call_model(task: str) -> dict:
body = {
"model": MODEL,
"messages": [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": build_user_message(task)},
],
"max_tokens": 4096,
"reasoning_effort": "medium",
"temperature": 0.2,
}
req = urllib.request.Request(
URL,
data=json.dumps(body).encode(),
headers={"Authorization": f"Bearer {os.environ['SPICY_API_KEY']}",
"Content-Type": "application/json",
"Idempotency-Key": str(uuid.uuid4())},
)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def quoted_strings(text: str) -> list[str]:
return [m for pair in re.findall(r'"([^"]+)"|“([^”]+)”', text) for m in pair if m]
def altered_quotes(answer: str) -> list[str]:
sources = [s.replace("“", '"').replace("”", '"') for s in SOURCES.values()]
return [q for q in quoted_strings(answer) if not any(q in s for s in sources)]
def run(task: str, reply: dict | None = None) -> None:
reply = call_model(task) if reply is None else reply
if reply.get("error") or not reply.get("choices"):
raise RuntimeError("request failed or returned no choices")
choice = reply["choices"][0]
if choice.get("finish_reason") != "stop":
raise RuntimeError(f"unfinished edit: {choice.get('finish_reason')}")
answer = choice.get("message", {}).get("content")
if not isinstance(answer, str) or not answer.strip():
raise RuntimeError("empty edit")
bad = altered_quotes(answer)
print(answer)
print("ALTERED QUOTES:", bad if bad else "none")
print("USAGE:", reply.get("usage"))
if bad:
raise RuntimeError("review altered quotations before using this edit")
if __name__ == "__main__":
run("Fix the factual errors in P1 and preserve the lease/demonstration distinction.")인터뷰 인용문을 유지한 응답은 통과하고, "저희는 2019년에 프로토타입을 선보였어요."라고 인용한 응답은 표시돼요. 이 검사는 큰따옴표 안의 텍스트만 봐요. 따옴표 없는 지어낸 날짜, 잘못 귀속된 공로, 따옴표 없이 바꿔 쓴 출처 표현은 잡지 못해요. 이런 것들도 S1–S3과 대조해서 확인하세요. 긴 원고에서 눈으로 가장 알아채기 어려운 실패, 즉 몇 글자만 바뀐 인용문을 잡아내요.
요청에서 중요한 세부 사항은 두 가지예요. 시스템 메시지가 무엇이 증거이고 무엇이 편집 대상인지 밝히므로, S1은 다시 쓰기 작업에서 명시적으로 제외돼요. 그리고 작업이 출처 뒤에 오기 때문에 공유 접두부가 패스마다 동일하게 유지돼요. 이 예제는 스트리밍 없는 제한된 호출로 충분할 만큼 짧아요. 더 긴 출처 패키지나 높은 effort의 응답은 약 100초라는 네트워크 제한을 넘을 수 있어요. 그런 작업에는 스트리밍을 쓰세요. 클라이언트 타임아웃을 늘려도 그 제한은 늘어나지 않아요.
Agent가 호출을 준비하게 하기
출처 기반 편집을 반복한다면 코딩 Agent에게 SpicyAPI Skill을 쓰도록 요청하세요. "Read anthropic/claude-opus-4.5/chat, then adapt the example to my input; show the request before running it." CLI로 조회하려면 spicyapi models get anthropic/claude-opus-4.5/chat --json을, MCP로 조회하려면 spicyapi_model_get에 model: "anthropic/claude-opus-4.5/chat"을 지정하세요. 채팅 호출은 호환 클라이언트 또는 채팅 API를 사용해요. 미디어 작업 명령은 채팅 응답을 생성하지 않아요.
긴 원고: 대체하기 전에 위치부터 요청하세요
문장 단위 수정이라면 단락과 그것을 좌우하는 증거를 보내세요. 한 장을 편집한다면 앞뒤 연결부와 그 장에서 쓰이는 사실을 덧붙이세요. 인물의 직업이 바뀌는 지점, 약속이 지켜지는지, 날짜를 언급한 곳 중 어디를 검토해야 하는지처럼 질문이 원고 전체에 걸칠 때는 더 큰 윈도를 쓰세요.
원고 전체를 훑는 패스에서는 탐색과 수정을 분리하세요.
- 해당 위치를 찾습니다. 다시 쓰기가 아니라 목록을 요청하세요. "List every passage that states the demonstration year, quote the sentence, and classify it as narration, direct quotation or a character’s belief." 전체 일괄 치환은 이야기가 의존하는 구분을 지워 버려요.
- 편집을 고릅니다. 단락에 안정적인 ID(P42처럼. "임대에 관한 단락"이 아니라)를 붙이고, 그 ID를 돌려받고, 각 대체문을 원문과 비교하세요.
- 미해결 사실은 열어 둡니다. 출처가 한 점을 확정하지 못하면, 가장 그럴듯한 날짜 대신 질문을 돌려받으세요.
눈동자 색이 바뀌거나, 장소가 일관되지 않거나, 인물이 너무 일찍 무언가를 아는 것 같은 연속성 오류에는 스토리 바이블을 두고 관련 항목을 각 장과 함께 보내세요.
4.5에서 원고가 입력 198,000토큰을 넘으면 크기가 아니라 의존 관계로 나누세요. 같은 연속성 문제를 공유하는 장은 같은 요청에 있어야 해요. 반으로 쪼개면 편집을 결정하는 증거가 사라질 수 있어요. 그럴 수 없다면 4.6으로 옮기세요.
문체를 밋밋하게 만들지 않고 한 장 편집하기
사실 수정과 문장 다듬기는 다른 작업이에요. 사실 패스는 리듬을 바꾸기 전에 날짜와 공로의 오류부터 짚어야 해요. 동시에 "세련된 전문 프로필"을 요구하면, 모델이 인터뷰의 머뭇거림을 지우고, 저자 특유의 표현을 바꿔 버리고, 실제 정정을 완전히 새로운 단락에 묻어 버릴 수 있어요.
원하는 문체의 짧은 예시를 가지고 있으세요. 예를 들어 이런 거예요. "공방은 아직 빌려 온 공구로 가득한 방이었다. Ada는 그곳을 실험실이라 불렀다. Theo는 춥다고 했다." 이 샘플에서 쓸모 있는 특징은 짧은 문장, 구체적인 사물, 절제된 의견 차이예요. "문학적이면서 쉽게 읽히는"보다 실행하기 쉬워요. 정정된 타임라인을 분명히 하면서 이 특징들을 유지하도록 편집을 요청하세요.
사람이 다시 쓴다면 이렇게 될 수 있어요.
임대 계약은 2018년에 시작되었다. Ada가 프로토타입을 대중에게 보여 준 것은 이듬해 2월, 공방이 아직 빌려 온 공구로 가득한 방이던 때였다. Theo는 나중에 합류했다. 악기의 넥에는 그의 손길이 닿아 있지만, 최초의 프로토타입에는 그렇지 않다.
이것은 예시용 편집 선택이지 Opus의 출력이 아니에요. Theo를 공동 창업자로 만들거나 공방이 언제 문을 열었는지 지어내지 않으면서 사실을 바로잡아요. 또 문체를 지킨다는 것이 틀린 진술을 지킨다는 뜻이 아님을 보여 줘요.
로맨스 원고에서는 비슷해 보이는 세 가지 발견을 구분하세요. 인물이 "넌 한 번도 돌아오지 않았어"라고 말하는 것은 의도된 비난일 수 있어요. 그 인물이 돌아오지 않았다고 쓴 서술은 앞 장과 모순일 수 있어요. 귀환이 있었는지에 대한 미해결 질문은 저자의 메모일 수 있어요. 대체하기 전에 Opus에게 그 구절을 분류하게 하세요. 그렇지 않으면 자동 사실 정리가 관계를 움직이는 의도적인 오해를 지워 버릴 수 있어요.
정정은 정말 속해야 할 곳에 적용하세요
더 긴 프로필에서는 잘못된 연도가 도입부, 타임라인, 사진 설명, 인터뷰 녹취록에 나올 수 있어요. 이런 출현 위치는 각각 다르게 다뤄야 해요. 설명하는 서술과 타임라인은 승인된 정정에 따라 고치세요. 녹음된 인용문은 그대로 두고 맥락을 덧붙이세요. 사진 설명은 이미지 자체의 기록된 날짜와 대조하세요. 사건에 대한 정정이 공방 사진이 모두 2019년에 찍혔다는 증거는 아니에요.
책의 경우도 같아요. 정본 서술을 바로잡되, 계획된 폭로 전까지는 인물의 제한된 지식을 지키세요. 위치, 기존 문장, 출처, 제안된 변경을 담은 표를 요청하세요. 그 목록으로 수정을 승인하고, 그다음 선택한 대체문만 요청하세요. 그러면 긴 컨텍스트 윈도는 모든 것을 다시 쓰라는 값비싼 초대가 아니라, 변경을 추적할 수 있는 편집 보조 수단이 돼요.
비용: 토큰 네 가지와 반복 패스 예시
SpicyAPI는 캐시 없는 입력, 캐시된 입력, 캐시 쓰기, 출력을 따로 과금해요. 입력 100,000토큰과 출력 5,000토큰의 단일 패스는 Opus 4.5에서 $0.5625, Opus 4.6에서 $0.625예요. 추론 토큰은 출력으로 과금돼요.
편집이 한 번의 패스로 끝나는 일은 드물고, 반복되는 부분은 출처 패키지예요. 캐시된 입력은 공유 접두부가 호출 사이에 동일하고 달라지는 부분이 끝에 있을 때 입력 요금의 약 10분의 1이에요(Opus 4.6 페이지는 바이트 단위로 동일하게 유지하라고 안내해요). 요청 스키마에는 캐시 제어 필드가 없어요. 반환된 사용량에서 prompt_tokens_details.cached_tokens를 확인하세요. 접두부를 바꾸지 않았다고 적중이 보장되지는 않아요. Anthropic의 네이티브 프롬프트 캐싱에는 자체 TTL과 최소 접두부 규칙이 있는데, 이는 이 호스팅 경로의 캐시 수명이나 적용 자격을 정하지 않아요. 첫 호출이 패키지를 캐시에 쓰고 다음 다섯 번이 읽는다면, 같은 100,000토큰 패키지에 출력 5,000토큰씩으로 여섯 번 패스하는 비용은 다음과 같아요.
| 여섯 번의 패스 | Opus 4.5 | Opus 4.6 |
|---|---|---|
| 캐시 없음 | $3.375 | $3.75 |
| 첫 패스가 쓰고 다섯 번이 읽음 | $1.45 | $1.625 |
이 토큰 구분이 정확히 적용될 때 약 57퍼센트를 절약해요. S2를 바꾸거나 재사용 가능한 접두부 앞으로 자료를 옮기면 캐시 일치가 줄거나 사라질 수 있어요. 예산은 첫 번째 행으로 잡고, 처음 몇 번의 호출 사용량과 비용을 읽어 두 번째 행이 적용되었는지 확인하세요.
입력 400,000토큰과 출력 5,000토큰이면 패키지는 더 이상 Opus 4.5에 들어가지 않아요. Opus 4.6은 캐시 없이 $2.125예요. 응답이 잘렸다면 max_tokens를 올려 출력은 고칠 수 있지만, 입력 패키지에 결정적인 출처가 빠져 있었다면 아무 도움이 되지 않아요.
실패는 원인에서 고치세요
| 결과 | 다음 조치 |
|---|---|
| 정정된 날짜가 역사적 인용문 안에 나타남 | 인용문을 복원하고 정정을 서술에 추가하세요. 인용 검사가 이것을 표시해요 |
| Theo가 최초 공동 설계자가 됨 | S3을 다시 보내고 그에게 그 역할을 부여한 문장만 바꾸세요 |
변경 목록 전에 응답이 멈춤(finish_reason이 length) | 작업 범위를 좁히거나 max_tokens를 모델 상한까지 올리세요 |
| 요청이 이미지 또는 PDF 파트를 거부함 | 이미지는 image_url 형태와 가져올 수 있는 URL을 확인하세요. PDF나 파일 파트는 먼저 텍스트를 추출하세요 |
| 응답에서 JSON이 필요함 | response_format이 없어요. 도구를 정의하고 tool_choice로 강제한 뒤, 반환된 인자를 검증하세요 |
| JSON 파서가 실패함 | 텍스트 출력을 코드에서 검증하고 복구하거나, 위의 강제 도구 호출로 바꾸세요 |
어느 쪽으로 시작할까
기존 4.x 워크플로라면 입력 198,000토큰 미만의 패키지에는 4.5를, 이어진 원고나 필요한 응답이 그 한도를 넘으면 4.6을 쓰세요. 샘플링이나 강제 도구 요구가 없는 새 구축이라면 Opus 5.5가 토큰 단가도 낮고 윈도도 더 커요. 다만 용량만으로 어느 모델이 출처를 더 잘 지키는지가 정해지지는 않아요. 무엇을 고르든 출처를 지키는 습관은 같아요. 모든 구절에 ID, 그대로 유지해야 할 인용문, 안정적인 접두부, 응답에 대한 기계적 검사예요.
FAQ
Opus 4.6이 4.5보다 편집을 더 잘하나요? 긴 글 편집에는 어떤 Claude 모델이 가장 좋은가요?
측정 가능한 차이는 용량과 가격이에요. 4.6은 1,000,000토큰을 읽고 128,000토큰을 쓰며, 입력 토큰당 약 11퍼센트 더 비싸요. 그 한도가 필요할 때 고르세요. 새로 구축한다면 샘플링 제어나 강제 도구 선택이 필요 없는 경우 Opus 5.5가 둘보다 저렴하고 윈도도 더 커요.
컨텍스트가 가득 찼을 때, 또는 네이티브 컨텍스트 편집 없이는 어떻게 하나요?
새 요청을 시작하세요. 출처 패키지를 맨 앞에 두고 바꾸지 말고, 오래된 턴은 이미 내린 결정(어떤 날짜를 정정했는지, 어떤 구절이 끝났는지)의 짧은 요약으로 바꾸고, 다음 작업을 맨 끝에 두세요. 오래된 턴을 버리는 것은 비용이 들지 않지만, 출처를 버리면 편집을 잃어요.
인용문이 바뀌지 않게 하려면?
출처를 증거로 표시하고, 따옴표는 출처의 정확한 텍스트 주위에만 허용하고, 모든 응답에 위의 인용 검사를 실행하세요.
같은 출처 블록을 유지하면 캐시 적중이 보장되나요?
아니요. 재사용이 가능하도록 안정적으로 유지하되, 반환된 캐시 사용량과 확정된 과금에서 적중이 확인될 때까지는 캐시 없이 예산을 잡으세요. 캐시 항목은 과금 최적화일 뿐이며, 편집을 더 충실하게 만들지는 않아요.







