Session

AgentSession 는 에이전트 실행에서 사용되는 대화 상태 컨테이너입니다.

AgentSession에 무엇이 포함되어 있는가

분야 목적
StateBag 이 세션의 임의 상태 저장소

C# AgentSession 은 추상 기본 클래스입니다. 구체적인 구현(통해 CreateSessionAsync()생성됨)은 서비스 관리 기록이 사용될 때 원격 채팅 기록 스토리지에 대한 ID와 같은 추가 상태를 추가할 수 있습니다.

분야 목적
session_id 이 세션의 로컬 고유 식별자
service_session_id 서비스 관리 기록이 사용되는 경우 대화 또는 응답 ID와 같은 원격 서비스 세션 식별자
state 컨텍스트/기록 공급자와 공유되는 변경 가능한 사전
분야 목적
agent.Session 대화에 연결된 키-값 상태 컨테이너

세션은 형식화된 키-값 스토리지를 제공합니다.

type UserPrefs struct {
    Theme    string `json:"theme"`
    Language string `json:"language"`
}

session.Set("user_prefs", UserPrefs{Theme: "dark", Language: "en"})

var prefs UserPrefs
session.Get("user_prefs", &prefs)

session.Delete("user_prefs")

서비스 세션 ID 범위 지정

서비스 관리 기록을 사용하는 경우 세션에 서비스 발급 세션 식별자가 포함될 수 있습니다. 예를 들어 OpenAI Responses는 resp_*previous_response_id 응답 ID를 사용할 수 있으며, OpenAI Conversations API는 대화를 conv_* 대화 ID로 사용할 수 있습니다.

OpenAI는 기본적으로 이러한 ID의 범위를 지원 API 키 또는 프로젝트로 지정합니다. 일반적으로 해당 키 또는 프로젝트가 단일 사용자 앱 또는 테넌트당 별도의 키/프로젝트와 같은 애플리케이션 경계와 이미 일치하는 경우 충분합니다. 위험한 호스트 패턴은 여러 최종 사용자에 대해 하나의 지원 키 또는 프로젝트를 사용하고, 원시 서비스 쪽 ID를 클라이언트에 에코하고, 소유권을 확인하지 않고 해당 ID를 다시 수락하는 것입니다. 하나의 기반 키 또는 프로젝트를 재사용하는 호스팅 앱 또는 다중 사용자 앱에서는 service_session_id, previous_response_id 또는 conversation/conversation_id를 최종 사용자 권한 부여 경계로 간주하지 마세요. 신뢰할 수 있는 애플리케이션 스토리지에 서비스 쪽 ID를 저장하고, 클라이언트에서 볼 수 있는 세션 ID를 해당 서비스 쪽 ID에 매핑하고, 대화를 다시 시작하기 전에 인증된 사용자 또는 테넌트를 확인합니다.

기본 제공 사용 패턴

AgentSession session = await agent.CreateSessionAsync();

var first = await agent.RunAsync("My name is Alice.", session);
var second = await agent.RunAsync("What is my name?", session);
session = agent.create_session()

first = await agent.run("My name is Alice.", session=session)
second = await agent.run("What is my name?", session=session)
session, err := a.CreateSession(ctx)
if err != nil {
    panic(err)
}

resp, _ := a.RunText(ctx, "Hello!", agent.WithSession(session)).Collect()
resp, _ = a.RunText(ctx, "Follow-up question.", agent.WithSession(session)).Collect()

기존 서비스 대화 ID에서 세션 만들기

기존 대화 ID에서 새 세션을 만드는 방법은 에이전트 유형에 따라 다릅니다. 다음은 몇 가지 예입니다.

사용하는 경우 ChatClientAgent

AgentSession session = await chatClientAgent.CreateSessionAsync(conversationId);

A2AAgent를 사용할 때

AgentSession session = await a2aAgent.CreateSessionAsync(contextId, taskId);

지원 서비스에 이미 대화 상태가 있는 경우 이를 사용합니다.

session = agent.get_session(service_session_id="<service-conversation-id>")
response = await agent.run("Continue this conversation.", session=session)

호스팅된 앱에서는 현재 사용자 또는 테넌트를 확인한 후 애플리케이션 소유 스토리지에서 <service-conversation-id>를 조회합니다. 먼저 호출자가 해당 대화의 소유자인지 확인하지 않는 한, 클라이언트로부터 서비스 측의 원시 ID를 수락하지 마세요.

직렬화와 복원

var serialized = agent.SerializeSession(session);
AgentSession resumed = await agent.DeserializeSessionAsync(serialized);
serialized = session.to_dict()
resumed = AgentSession.from_dict(serialized)
data, err := json.Marshal(session)
if err != nil {
    panic(err)
}

// Save to disk, database, etc.
if err := os.WriteFile("session.json", data, 0o644); err != nil {
    panic(err)
}

// Later, restore the session.
loaded, err := os.ReadFile("session.json")
if err != nil {
    panic(err)
}

var resumedSession agent.Session
if err := json.Unmarshal(loaded, &resumedSession); err != nil {
    panic(err)
}

resp, _ := a.RunText(ctx, "Continue from where we left off.", agent.WithSession(&resumedSession)).Collect()

팁 (조언)

전체 예제는 지속형 대화 샘플을 참조하세요.

중요합니다

세션은 에이전트/서비스별로 적용됩니다. 다른 에이전트 구성 또는 공급자를 사용하여 세션을 다시 사용하면 잘못된 컨텍스트가 발생할 수 있습니다. 직렬화된 세션에 서비스 쪽 세션 ID가 포함된 경우 해당 ID를 소유하는 애플리케이션 사용자 또는 테넌트에 대해서만 복원합니다.

다음 단계: