chenhg5/cc-connect · error
googlechat: SendFile: invalid reply context type %T
Error message
googlechat: SendFile: invalid reply context type %T
What it means
SendFile, like SendImage, requires a googlechat.replyContext as its reply-context argument; any other dynamic type passed through the core.FileSender interface fails the assertion and produces this error, which includes the offending type for diagnosis.
Source
Thrown at platform/googlechat/googlechat.go:577
// SendImage uploads an image and posts it as a Chat message attachment.
// Implements core.ImageSender.
func (p *Platform) SendImage(ctx context.Context, rctx any, img core.ImageAttachment) error {
rc, ok := rctx.(replyContext)
if !ok {
return fmt.Errorf("googlechat: SendImage: invalid reply context type %T", rctx)
}
return p.postAttachment(ctx, rc,
coalesce(img.FileName, "image.png"),
coalesce(img.MimeType, "image/png"),
img.Data)
}
// SendFile uploads a file and posts it as a Chat message attachment.
// Implements core.FileSender.
func (p *Platform) SendFile(ctx context.Context, rctx any, file core.FileAttachment) error {
rc, ok := rctx.(replyContext)
if !ok {
return fmt.Errorf("googlechat: SendFile: invalid reply context type %T", rctx)
}
return p.postAttachment(ctx, rc,
coalesce(file.FileName, "attachment"),
coalesce(file.MimeType, "application/octet-stream"),
file.Data)
}
var _ core.ImageSender = (*Platform)(nil)
var _ core.FileSender = (*Platform)(nil)
var _ core.ReplyContextReconstructor = (*Platform)(nil)
func (p *Platform) Stop() error {
if p.cancel != nil {
p.cancel()
}
if p.psClient != nil {
return p.psClient.Close()
}View on GitHub (pinned to 4000b2338a)
Solutions
- Pass the googlechat reply context that accompanied the original incoming message
- Type-check the context at the call site before calling SendFile
- Fix test mocks to construct the real replyContext type
Example fix
// before
p.SendFile(ctx, genericCtx, file)
// after
rc, ok := genericCtx.(googlechat.ReplyContext)
if !ok { return fmt.Errorf("file send requires google chat reply context") }
p.SendFile(ctx, rc, file) Defensive patterns
Strategy: type-guard
Type guard
func isGoogleChatReplyContext(rctx any) bool { _, ok := rctx.(replyContext); return ok } Try / catch
if err := p.SendFile(ctx, rctx, file); err != nil {
if strings.Contains(err.Error(), "invalid reply context type") { slog.Error("SendFile got non-googlechat context", "type", fmt.Sprintf("%T", rctx)) }
return err
} Prevention
- Keep per-platform context plumbing separate
- Add compile-time interface assertions in adapters
- Write tests that assert context type errors for cross-platform misuse
When it happens
Trigger: Calling SendFile with a reply context from another platform, nil, or a hand-rolled value that is not googlechat.replyContext.
Common situations: Shared sending code reusing one context struct for all platforms; wiring bugs in multi-platform setups; tests passing a mock context of the wrong type.
Understand the failure class
Background: Type mismatch errors: IllegalArgumentException, TypeError and type guards across 150 open-source libraries — this error's family across 150 libraries.
Related errors
- googlechat: SendImage: invalid reply context type %T
- dingtalk: SendImage: invalid reply context type %T
- googlechat: invalid reply context type %T
- max: unexpected replyCtx type %T
- qqbot: invalid reply context
AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06).
Data as JSON: /api/errors/e4b7009992ccf8b9.
Report an issue: GitHub.