본문 바로가기
C.W.K.
Stream
Lesson 07 of 08 · published

세션은 이어 가고 JSONL은 다시 세울 근거를 남겨

~16 min · sessions, resume, jsonl, persistence

Level 0Observer
0 XP0/64 lessons0/13 achievements
0/150 XP to next level150 XP to go0% complete

세션 ID가 대화 상태를 잇는 열쇠야

Agent SDK는 세션 ID를 발급하고 대화 상태를 내부에 보관해. ClaudeSDKClient의 세션은 클라이언트 수명과 함께 가고 query()는 한 번 쓰고 끝나. 같은 ID로 재개하면 저장된 상태를 불러와 새 프롬프트부터 이어 갈 수 있어.

JSONL을 내구성 있는 기준 기록으로 둬

SDK 사건을 JSONL로 흘리면 프롬프트·응답 조각·도구 호출·결과가 타입을 가진 한 줄씩 남아. cwkPippa는 이 파일을 기준으로 삼고 SQLite와 ChromaDB는 다시 만들 수 있는 파생 색인으로 둬. 불일치가 생기면 부분 수정으로 꿰매지 않고 지운 뒤 원본을 재생해.

프로세스가 바뀌어도 같은 세션을 되살려

작업자 프로세스가 재시작되면 같은 세션 ID로 새 ClaudeSDKClient를 만들고 SDK 상태를 복구할 수 있어. cwkPippa의 heartbeat 작업도 이 방식으로 서버 재시작 뒤에 대화 상태를 잃지 않아.

원칙: JSONL을 유일한 기준 기록으로 두고 DB 행과 색인은 언제든 다시 만들 수 있게 해.

Code

이벤트를 JSONL로 stream·python
import json, pathlib
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions

async def run_with_jsonl(conv_id: str, prompt: str):
    log_path = pathlib.Path(f"/var/lib/myagent/sessions/{conv_id}.jsonl")
    log_path.parent.mkdir(parents=True, exist_ok=True)
    log = log_path.open("a", buffering=1)  # line-buffered

    client = ClaudeSDKClient(options=ClaudeAgentOptions(cwd="/srv"))
    await client.connect()
    try:
        async for event in client.send_message(prompt):
            log.write(json.dumps({"event": event.dict()}) + "\n")
            log.flush()  # write before show
            forward_to_user(event)
    finally:
        await client.disconnect()
        log.close()
Id로 세션 resume·python
# session_id는 SDK가 할당한 거(또는 connect 시 너가 할당).
options = ClaudeAgentOptions(
    cwd="/srv",
    resume=session_id,  # SDK가 internal 상태 reload
)
client = ClaudeSDKClient(options=options)
await client.connect()
async for event in client.send_message("Continue where we left off."):
    print(event)

External links

Exercise

Agent SDK 호출 하나의 사건을 JSONL로 남기고 스트림 중간에 프로세스를 끊어. 같은 세션 ID로 재개해 대화를 이어 가고 모든 델타가 남았는지 확인해.
Hint
하류 저장소와 JSONL이 다르면 JSONL을 믿고 파생 상태를 다시 만들어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.