# System instructions

> Set per-call system instruction separately from conversation history.

- Path: `Guides > Inference > Requests > System instructions`
- Human: https://looprig.com/docs/guides/inference/requests/system-instructions
- Machine index: https://looprig.com/llms.txt

`Request.System` is the per-agent system instruction string. It is separate from `Request.Messages`, so a caller can change the instruction for one invocation without rewriting the history thread.

## API surface

```go
request := inference.Request{
	System: "You are a careful release engineer. Cite evidence.",
	Messages: content.AgenticMessages{
		&content.UserMessage{Message: content.Message{
			Role: content.RoleUser,
			Blocks: []content.Block{&content.TextBlock{Text: "Review the change."}},
		}},
	},
}
```

The field is a plain string with no inference-layer constructor or validation beyond whatever provider codec policy applies. A system instruction is not automatically converted into a `SystemMessage`; choose the representation deliberately.

## Separation from history

Use `Request.System` for request-scoped behavior. Use [SystemMessage](/docs/guides/inference/messages/message-types/system-message.md) when a system turn is part of the ordered `AgenticMessages` conversation and must survive as history. This distinction matters for caching and provider codecs that treat system content specially.

## Proof

- Source: [`inference/client.go`](https://github.com/looprig/inference/blob/main/client.go), [`core/content/message.go`](https://github.com/looprig/core/blob/main/content/message.go)
- Tests: [`inference/client_test.go`](https://github.com/looprig/inference/blob/main/client_test.go), [`core/content/message_test.go`](https://github.com/looprig/core/blob/main/content/message_test.go)

Related: [Conversation input](/docs/guides/inference/requests/messages.md), [SystemMessage](/docs/guides/inference/messages/message-types/system-message.md).
