본문으로 건너뛰기

AI 문서 생성

POST /api/document/complete-stream

AI를 사용하여 문서 내용을 생성하거나 수정합니다. 스트리밍 응답을 반환합니다.

요청

Body

interface CompleteStreamRequest {
prompt: string;
content: string;
conversation_id?: string;
referenceContext?: {
text: string;
html: string;
range?: { start: number; end: number };
};
referenceMaterials?: ReferenceMaterial[];
guide?: string;
glossary?: string;
provider: "anthropic" | "openai";
model: string;
documentId: string;
}

예시

{
"prompt": "첫 문단을 더 격식있게 바꿔줘",
"content": "<p>안녕하세요. 반갑습니다.</p>",
"provider": "anthropic",
"model": "claude-sonnet-4-20250514",
"documentId": "doc_abc123"
}

응답

스트리밍 형식

Server-Sent Events (SSE) 형식으로 응답합니다.

Content-Type: text/event-stream

이벤트 타입

thinking

{ "type": "thinking", "content": "문서를 분석하고 있습니다..." }

start

{ "type": "start", "content": "" }

delta

{ "type": "delta", "content": "생성된 텍스트 조각" }

complete

{
"type": "complete",
"xmlContent": "<deletion>안녕하세요</deletion><addition>안녕하십니까</addition>",
"userMessage": "더 격식있는 표현으로 수정했습니다.",
"citations": [],
"conversation_id": "conv_xxx"
}

error

{ "type": "error", "error": "Error message" }

XML Diff 형식

AI는 문서 변경사항을 XML 태그로 표현합니다:

추가

<addition>새로 추가할 내용</addition>

삭제

<deletion>삭제할 내용</deletion>

대체

<deletion>기존 내용</deletion><addition>새 내용</addition>

코드 예시

const response = await fetch("/api/document/complete-stream", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
prompt: "요약해줘",
content: documentContent,
provider: "anthropic",
model: "claude-sonnet-4-20250514",
documentId: "doc_abc123",
}),
});

const reader = response.body?.getReader();
const decoder = new TextDecoder();

while (true) {
const { done, value } = await reader.read();
if (done) break;

const chunk = decoder.decode(value);
const lines = chunk.split("\n").filter(Boolean);

for (const line of lines) {
const event = JSON.parse(line);

switch (event.type) {
case "delta":
console.log("Received:", event.content);
break;
case "complete":
console.log("Done:", event.userMessage);
break;
}
}
}

출처 추적

참고자료를 사용한 경우 citations 배열이 포함됩니다:

{
"citations": [
{
"id": "1",
"refId": "ref_abc",
"refTitle": "참고자료.pdf",
"quotedText": "인용된 원문 텍스트",
"pageNumber": 5
}
]
}