Guide for using completers — TokenCompleter and MessageCompleter for text generation during RL rollouts and evaluation. Use when the user asks about generating text, completing messages, or using completers in RL environments.
Scanned 9/1/2026
Install to Claude Code
npx -y skills add uiuc-kang-lab/rlvr_generalization_bounds --skill completers --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Completers?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/uiuc-kang-lab-completers)More formats (shields.io, HTML) on the badges page.
---
name: completers
description: Guide for using completers — TokenCompleter and MessageCompleter for text generation during RL rollouts and evaluation. Use when the user asks about generating text, completing messages, or using completers in RL environments.
---
# Completers
Completers wrap SamplingClient for convenient text generation. Two levels of abstraction:
- **TokenCompleter** — low-level, returns tokens + logprobs
- **MessageCompleter** — high-level, returns parsed Message objects
## Reference
Read these for details:
- `tinker_cookbook/completers.py` — Implementation
- `docs/completers.mdx` — Usage guide
## TokenCompleter
Generates tokens from a ModelInput prompt. Used internally by RL rollouts.
```python
from tinker_cookbook.completers import TinkerTokenCompleter, TokensWithLogprobs
completer = TinkerTokenCompleter(
sampling_client=sc,
max_tokens=256,
temperature=1.0,
)
result: TokensWithLogprobs = await completer(
model_input=prompt,
stop=stop_sequences, # list[str] or list[int]
)
# result.tokens: list[int]
# result.maybe_logprobs: list[float] | None
```
## MessageCompleter
Higher-level: takes a conversation (list of Messages), returns a Message. Handles rendering and parsing internally.
```python
from tinker_cookbook.completers import TinkerMessageCompleter
completer = TinkerMessageCompleter(
sampling_client=sc,
renderer=renderer,
max_tokens=256,
temperature=1.0,
stop_condition=None, # Override stop sequences
)
response_message: Message = await completer(messages=[
{"role": "user", "content": "What is 2+2?"},
])
# response_message = {"role": "assistant", "content": "4"}
```
## When to use which
- **TokenCompleter**: RL rollouts, custom generation loops where you need logprobs and token-level control
- **MessageCompleter**: Evaluation, tool-use environments, multi-turn RL where you work with Messages
## Custom completers
Both are abstract base classes you can subclass for non-Tinker backends:
```python
from tinker_cookbook.completers import TokenCompleter, MessageCompleter
class MyTokenCompleter(TokenCompleter):
async def __call__(self, model_input, stop) -> TokensWithLogprobs:
...
class MyMessageCompleter(MessageCompleter):
async def __call__(self, messages) -> Message:
...
```
## Common pitfalls
- Create a new completer (with a new SamplingClient) after saving weights
- `TokensWithLogprobs.maybe_logprobs` can be `None` if logprobs weren't requested
- MessageCompleter uses the renderer for both prompt construction and response parsing
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!