chenhg5/cc-connect · error
telegram: send image: %w
Error message
telegram: send image: %w
What it means
Platform.SendImage wraps errors from bot.SendPhoto with "telegram: send image: ". It means the photo upload/delivery to Telegram failed; the image bytes are streamed via InputFileUpload so large payloads and network faults are the usual causes.
Source
Thrown at platform/telegram/telegram.go:1153
return fmt.Errorf("telegram: invalid reply context type %T", rctx)
}
bot, err := p.connectedBot("send image")
if err != nil {
return err
}
name := img.FileName
if name == "" {
name = "image"
}
slog.Debug("telegram: sending image", "chat_id", rc.chatID, "name", name, "size", len(img.Data))
params := &tgbot.SendPhotoParams{
ChatID: rc.chatID,
MessageThreadID: rc.threadID,
Photo: &models.InputFileUpload{Filename: name, Data: bytes.NewReader(img.Data)},
}
if _, err := bot.SendPhoto(ctx, params); err != nil {
return fmt.Errorf("telegram: send image: %w", err)
}
return nil
}
func (p *Platform) SendFile(ctx context.Context, rctx any, file core.FileAttachment) error {
rc, ok := rctx.(replyContext)
if !ok {
return fmt.Errorf("telegram: invalid reply context type %T", rctx)
}
bot, err := p.connectedBot("send file")
if err != nil {
return err
}
name := file.FileName
if name == "" {
name = "attachment"
}View on GitHub (pinned to 4000b2338a)
Solutions
- Check the wrapped cause for the real error (size limit vs network vs chat access)
- Resize/compress images to under 10 MB before SendPhoto, or send as a document instead
- Verify bot membership in the target chat and valid threadID
- Retry transient upload failures with backoff
- Validate img.Data is non-empty and a supported format (jpg/png/webp) before sending
Example fix
// before
if len(img.Data) > 10*1024*1024 { /* silently too large */ }
bot.SendPhoto(ctx, params) // fails
// after
if len(img.Data) > 10*1024*1024 {
return p.SendFile(ctx, rctx, core.FileAttachment{Name: name, Data: img.Data})
}
_, err := bot.SendPhoto(ctx, params) Defensive patterns
Strategy: validation
Validate before calling
// validate image before upload
if len(img.Data) == 0 {
return errors.New("empty image data")
}
if len(img.Data) > 10*1024*1024 {
return errors.New("image exceeds Telegram 10MB photo limit; send as document")
} Try / catch
if err := p.SendImage(ctx, rc, img); err != nil {
var apiErr *tgbot.Error
if errors.As(err, &apiErr) {
// inspect apiErr.Description for size/chat errors
}
return err
} Prevention
- Keep photos under 10MB or route through SendFile
- Compress screenshots before upload
- Verify bot chat membership
- Retry transient upload failures with backoff
When it happens
Trigger: bot.SendPhoto fails: multipart upload interrupted, image exceeds Telegram's 10 MB photo limit, invalid chat/thread ID, bot lacks access, or Telegram API returns an error.
Common situations: Sending screenshots or generated images larger than 10 MB (Telegram photo limit); flaky networks during multipart upload; bot removed from chat; sending to a topic thread that no longer exists.
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 chenhg5/cc-connect@4000b2338a (2026-09-06).
Data as JSON: /api/errors/dede6241377e4a5e.
Report an issue: GitHub.