llmshim 0.2.1

Blazing fast LLM API translation layer in pure Rust
Documentation
# Conversations across models

llmshim does not store conversations. A conversation continues because the
caller sends the previous messages again.

Start with a history:

```json
[
  { "role": "user", "content": "What is a Rust closure?" },
  { "role": "assistant", "content": "A closure is..." },
  { "role": "user", "content": "Explain that another way." }
]
```

Send it to another provider by keeping `messages` and changing the address:

```diff
- "model": "anthropic/claude-opus-4-8"
+ "model": "openai/gpt-5.6-sol"
```

There is no session handoff between Anthropic and OpenAI. The new provider sees
the history because it is present in the new request.

## Who owns history?

- **Rust applications** keep and resend their own `messages` array.
- **HTTP callers and language clients** do the same. The proxy is stateless and
  does not assign conversation IDs.
- **`llmshim chat`** keeps history in memory for the interactive process. The
  `/model` command changes the model for the next request without clearing that
  history; `/clear` removes it.

Provider adapters translate recognized cross-provider artifacts before sending
the history upstream. This includes common message roles and supported tool
call/result shapes. They also remove provider-only response metadata that
should not be sent to another API.

That translation makes a shared history usable across providers, but it does
not make every provider-specific detail portable. A turn that depends on a
native extension, unsupported content block, or provider-only behavior can
still lose that behavior after a switch.

## What model switching does not do

Changing the model does not:

- summarize or truncate history;
- run more than one model;
- choose a model automatically;
- persist messages after the caller or CLI process discards them.

Multi-model conversation is therefore a small operation: preserve the history,
choose a new model address, and send the next request.