github/copilot-sdk · error

failed to get events

Error message

failed to get events: %w

What it means

Session.GetEvents sends the `session.getMessages` RPC to the runtime to fetch the session's event/message list. This error wraps any transport- or server-side failure returned by that request, so the underlying cause (connection closed, session unknown, timeout) is in the wrapped `%w` chain.

Solutions

  1. Inspect the wrapped error (errors.Unwrap / %v) to find the root cause
  2. Verify the runtime process is still alive and the session ID is valid
  3. Reconnect the client and recreate/reattach the session, then retry GetEvents
  4. Add retry with backoff around GetEvents for transient transport errors

Example fix

// before
events, err := session.GetEvents(ctx)
// after
events, err := session.GetEvents(ctx)
if err != nil {
    var netErr net.Error
    if errors.As(err, &netErr) {
        events, err = session.GetEvents(ctx) // retry transient failure
    }
}
Defensive patterns

Strategy: retry

Validate before calling

if session == nil || session.SessionID == "" {
    return errors.New("session not initialized")
}

Try / catch

events, err := session.GetEvents(ctx)
if err != nil {
    var retryable bool
    for i := 0; i < 3 && !retryable; i++ {
        time.Sleep(backoff(i))
        events, err = session.GetEvents(ctx)
        retryable = err == nil
    }
}

Prevention

When it happens

Trigger: Calling Session.GetEvents(ctx) when the RPC request `session.getMessages` fails: the client connection is down, the session ID is no longer valid server-side, or the runtime returns an error response.

Common situations: Polling events after the runtime process exited; using a Session whose server-side state was discarded; network/pipe breakage between client and a child-process runtime.

Understand the failure class

Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.

Related errors


AI-assisted analysis of github/copilot-sdk@cd8cf15dc3 (2026-09-09). Data as JSON: /api/errors/5b70b482c48d6ae9. Report an issue: GitHub.

Appendix: source

Thrown at go/session.go:1803

// Returns an error if the session has been disconnected or the connection fails.
//
// Example:
//
//	events, err := session.GetEvents(context.Background())
//	if err != nil {
//	    log.Printf("Failed to get events: %v", err)
//	    return
//	}
//	for _, event := range events {
//	    if d, ok := event.Data.(*copilot.AssistantMessageData); ok {
//	        fmt.Println("Assistant:", d.Content)
//	    }
//	}
func (s *Session) GetEvents(ctx context.Context) ([]SessionEvent, error) {

	result, err := s.client.Request(ctx, "session.getMessages", sessionGetMessagesRequest{SessionID: s.SessionID})
	if err != nil {
		return nil, fmt.Errorf("failed to get events: %w", err)
	}

	var response sessionGetMessagesResponse
	if err := json.Unmarshal(result, &response); err != nil {
		return nil, fmt.Errorf("failed to unmarshal get events response: %w", err)
	}
	return response.Events, nil
}

// Disconnect closes this session and releases all in-memory resources (event
// handlers, tool handlers, permission handlers).
//
// The caller should ensure the session is idle (e.g., [Session.SendAndWait] has
// returned) before disconnecting. If the session is not idle, in-flight event
// handlers or tool handlers may observe failures.
//
// Session state on disk (conversation history, planning state, artifacts) is
// preserved, so the conversation can be resumed later by calling

View on GitHub (pinned to cd8cf15dc3)