Skip to main content

Ganchos de ciclo de vida de sessão

Use os ganchos onSessionStart e onSessionEnd para inicializar o contexto, limpar recursos e acompanhar as métricas de sessão em SDK do Copilot.

Quem pode usar esse recurso?

SDK do GitHub Copilot está disponível com todos os Copilot planos.

Observação

SDK do Copilot está atualmente em versão prévia técnica. A funcionalidade e a disponibilidade estão sujeitas a alterações.

Os ganchos de ciclo de vida da sessão permitem que você responda aos eventos de início e término da sessão. Use-os para:

  • Inicialize o contexto quando as sessões começarem
  • Limpar recursos quando as sessões terminarem
  • Acompanhar as métricas e análises da sessão
  • Configurar o comportamento da sessão dinamicamente

Gancho de início da sessão

O onSessionStart gancho é chamado quando uma sessão é iniciada, seja nova ou retomada.

Assinatura do gancho

import type { SessionStartHookInput, HookInvocation, SessionStartHookOutput } from "@github/copilot-sdk";
type SessionStartHandler = (
  input: SessionStartHookInput,
  invocation: HookInvocation
) => Promise<
  SessionStartHookOutput | null | undefined
>;

Para obter assinaturas de gancho em Python, Go e .NET, consulte o github/copilot-sdk repositório.

Entrada

CampoTipoDescrição
timestampnúmeroTimestamp Unix quando o hook foi acionado
cwdcadeiaDiretório de trabalho atual
source
          `"startup"`
          \|
          `"resume"`
          \|
          `"new"`
         | Como a sessão foi iniciada |

| initialPrompt | cadeia de caracteres | indefinida | O prompt inicial, se fornecido |

Saída

CampoTipoDescrição
additionalContextcadeiaContexto a ser adicionado no início da sessão
modifiedConfigobjetoSobrepor configuração de sessão

Exemplos

Adicionar contexto de projeto no início

const session = await client.createSession({
  hooks: {
    onSessionStart: async (
      input, invocation
    ) => {
      console.log(
        `Session ${invocation.sessionId} `
        + `started (${input.source})`
      );

      const projectInfo =
        await detectProjectType(input.cwd);

      return {
        additionalContext:
          `This is a ${projectInfo.type} project.\n`
          + `Main language: `
          + `${projectInfo.language}\n`
          + `Package manager: `
          + `${projectInfo.packageManager}`,
      };
    },
  },
});

Para obter exemplos em Python, consulte o github/copilot-sdk repositório.

Lidar com a retomada de sessão

const session = await client.createSession({
  hooks: {
    onSessionStart: async (
      input, invocation
    ) => {
      if (input.source === "resume") {
        const previousState =
          await loadSessionState(
            invocation.sessionId
          );

        return {
          additionalContext:
            `Session resumed. Previous context:\n`
            + `- Last topic: `
            + `${previousState.lastTopic}\n`
            + `- Open files: `
            + previousState.openFiles.join(", "),
        };
      }
      return null;
    },
  },
});

Carregar preferências do usuário

const session = await client.createSession({
  hooks: {
    onSessionStart: async () => {
      const preferences =
        await loadUserPreferences();

      const contextParts = [];

      if (preferences.language) {
        contextParts.push(
          `Preferred language: `
          + `${preferences.language}`
        );
      }
      if (preferences.codeStyle) {
        contextParts.push(
          `Code style: ${preferences.codeStyle}`
        );
      }
      if (preferences.verbosity === "concise") {
        contextParts.push(
          "Keep responses brief and "
          + "to the point."
        );
      }

      return {
        additionalContext:
          contextParts.join("\n"),
      };
    },
  },
});

Gancho de fim de sessão

O onSessionEnd gancho é invocado quando uma sessão termina.

Assinatura do gancho

import {
  HookInvocation,
  SessionEndHookInput,
  SessionEndHookOutput,
} from "@github/copilot-sdk";

type SessionEndHandler = (
  input: SessionEndHookInput,
  invocation: HookInvocation
) => Promise<
  SessionEndHookOutput | null | undefined
>;

Para obter assinaturas de gancho em Python, Go e .NET, consulte o github/copilot-sdk repositório.

Entrada

CampoTipoDescrição
timestampnúmeroTimestamp Unix quando o hook foi acionado
cwdcadeiaDiretório de trabalho atual
reasoncadeiaPor que a sessão terminou (consulte a tabela a seguir)
finalMessagecadeia de caracteres | indefinidaA última mensagem da sessão
errorcadeia de caracteres | indefinidaMensagem de erro se a sessão terminou devido a um erro

Motivos finais

ReasonDescrição
"complete"Sessão concluída normalmente
"error"Sessão encerrada devido a um erro
"abort"A sessão foi abortada pelo usuário ou pelo código.
"timeout"Sessão expirada
"user_exit"O usuário encerrou explicitamente a sessão

Saída

CampoTipoDescrição
suppressOutputbooleanSuprimir a saída final da sessão
cleanupActionscadeia de caracteres[]Lista de ações de limpeza a serem executadas
sessionSummarycadeiaResumo da sessão para registro/análise de dados

Exemplos

Acompanhar métricas de sessão

const sessionStartTimes =
  new Map<string, number>();

const session = await client.createSession({
  hooks: {
    onSessionStart: async (
      input, invocation
    ) => {
      sessionStartTimes.set(
        invocation.sessionId, input.timestamp
      );
      return null;
    },
    onSessionEnd: async (
      input, invocation
    ) => {
      const startTime = sessionStartTimes.get(
        invocation.sessionId
      );
      const duration = startTime
        ? input.timestamp - startTime
        : 0;

      await recordMetrics({
        sessionId: invocation.sessionId,
        duration,
        endReason: input.reason,
      });

      sessionStartTimes.delete(
        invocation.sessionId
      );
      return null;
    },
  },
});

Para obter exemplos em Python, consulte o github/copilot-sdk repositório.

Limpar os recursos

const sessionResources =
  new Map<string, { tempFiles: string[] }>();

const session = await client.createSession({
  hooks: {
    onSessionStart: async (
      input, invocation
    ) => {
      sessionResources.set(
        invocation.sessionId,
        { tempFiles: [] }
      );
      return null;
    },
    onSessionEnd: async (
      input, invocation
    ) => {
      const resources =
        sessionResources.get(
          invocation.sessionId
        );

      if (resources) {
        for (const file
          of resources.tempFiles) {
          await fs.unlink(file).catch(() => {});
        }
        sessionResources.delete(
          invocation.sessionId
        );
      }

      console.log(
        `Session ${invocation.sessionId} `
        + `ended: ${input.reason}`
      );
      return null;
    },
  },
});

Salvar o estado da sessão para retomar

const session = await client.createSession({
  hooks: {
    onSessionEnd: async (input, invocation) => {
      if (input.reason !== "error") {
        // Save state for potential resume
        await saveSessionState(invocation.sessionId, {
          endTime: input.timestamp,
          cwd: input.cwd,
          reason: input.reason,
        });
      }
      return null;
    },
  },
});

Resumo da sessão de log

const sessionData: Record<
  string,
  { prompts: number; tools: number;
    startTime: number }
> = {};

const session = await client.createSession({
  hooks: {
    onSessionStart: async (
      input, invocation
    ) => {
      sessionData[invocation.sessionId] = {
        prompts: 0,
        tools: 0,
        startTime: input.timestamp,
      };
      return null;
    },
    onUserPromptSubmitted: async (
      _, invocation
    ) => {
      sessionData[
        invocation.sessionId
      ].prompts++;
      return null;
    },
    onPreToolUse: async (_, invocation) => {
      sessionData[
        invocation.sessionId
      ].tools++;
      return { permissionDecision: "allow" };
    },
    onSessionEnd: async (
      input, invocation
    ) => {
      const data =
        sessionData[invocation.sessionId];
      const durationSec =
        (input.timestamp - data.startTime)
        / 1000;
      console.log(
        `Session Summary:\n`
        + `  ID: ${invocation.sessionId}\n`
        + `  Duration: ${durationSec}s\n`
        + `  Prompts: ${data.prompts}\n`
        + `  Tool calls: ${data.tools}\n`
        + `  End reason: ${input.reason}`
      );

      delete sessionData[
        invocation.sessionId
      ];
      return null;
    },
  },
});

Práticas recomendadas

  •         **Mantenha-se `onSessionStart` rápido.** Os usuários estão aguardando a sessão ficar pronta.
    
  •         **Lidar com todos os motivos finais.** Não suponha que as sessões terminem de forma limpa; lide com erros e interrupções.
    
  •         **Limpe os recursos.** Use `onSessionEnd` para liberar todos os recursos alocados durante a sessão.
    
  •         **Armazene o estado mínimo.** Se estiver monitorando os dados da sessão, mantenha-os leves.
    
  •         **Torne a limpeza idempotente.** 
            `onSessionEnd` pode não ser chamado se o processo falhar.
    

Leitura adicional

  •         [AUTOTITLE](/copilot/how-tos/copilot-sdk/use-hooks/quickstart)
    
  •         [AUTOTITLE](/copilot/how-tos/copilot-sdk/use-hooks/error-handling)
    
  •         [AUTOTITLE](/copilot/how-tos/copilot-sdk/use-hooks/user-prompt-submitted)