coder / coder/blink

Limit response size for github_list_releases tool to prevent context overruns

Open
#83 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
164
Forks
18
Avg merge
1m
Merged PRs (30d)
4

Description

## Problem

The `github_list_releases` tool can return excessively large responses that cause the model to exceed context limits, resulting in "Input is too long for requested model" errors in brand new chats.

## Root Cause Analysis

When fetching releases with `include_body_and_assets: true`, the tool returns massive amounts of data. Testing with `coder/coder`:

- *5 releases* with bodies and assets = ~38KB of JSON
- Each release has ~24 assets (download URLs, sizes, counts, etc.)
- Release bodies can be ~1KB each (full changelogs)
- Requesting 100 releases with full data could exceed *500KB+*

The tool implementation at `packages/github/src/tools.ts` (line ~928) passes data through without any size limits:

```typescript
list_releases: toolWithOctokit(({ octokit }) =>
tool({
inputSchema: z.object({
owner: z.string(),
repo: z.string(),
page: z.number(),
per_page: z.number(), // No max limit!
include_body_and_assets: z.boolean(),
}),
execute: async (args, opts) => {
// ...
return {
releases: response.data.map((release) => ({
// Full body returned, no truncation
body: args.include_body_and_assets
? (release.body ?? undefined)
: undefined,
// ALL assets returned
assets: args.include_body_and_assets
? release.assets.map((asset) => ({ ... }))
: undefined,
})),
};
},
})
),
```

## Proposed Solution

Modify the tool in `packages/github/src/tools.ts`:

1. **Cap `per_page`** to a reasonable max (e.g., 10 releases)
2. **Truncate release bodies** to ~500-1000 chars with a `[truncated]` indicator
3. **Limit assets per release** to 5-10 most relevant ones
4. **Add response size indicator** so the model knows data was limited

```typescript
list_releases: toolWithOctokit(({ octokit }) =>
tool({
inputSchema: z.object({
owner: z.string(),
repo: z.string(),
page: z.number(),
per_page: z.number().max(10), // Hard cap
include_body_and_assets: z.boolean(),
}),
execute: async (args, opts) => {
const MAX_BODY_LENGTH = 500;
const MAX_ASSETS = 5;

const response = await (await octokit()).request(...);

return {
releases: response.data.map((release) => ({
// ...
body: args.include_body_and_assets && release.body
? release.body.length > MAX_BODY_LENGTH
? release.body.slice(0, MAX_BODY_LENGTH) + '... [truncated]'
: release.body
: undefined,
assets: args.include_body_and_assets
? release.assets.slice(0, MAX_ASSETS).map((asset) => ({ ... }))
: undefined,
total_assets: release.assets.length, // Let model know if more exist
})),
_truncated: true, // Signal that limits were applied
};
},
})
),
```

## Related Context

This affects the Blink agent (`coder/agents`) which uses `github.tools` directly. The fix should be in the SDK (`coder/blink`) since that's where the tool is defined.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.