# Somnia LLM Inference

> A Somnia Agents base agent that runs a pinned LLM on a subcommittee of validators and returns the agreed answer to your contract.

Somnia LLM Inference is a base agent on [Somnia Agents](/agents/somnia-agents). A contract sends a prompt, a subcommittee of validators each runs the same pinned open-weight model with a fixed seed and zero temperature, and the agreed answer is returned to the contract's callback.

The full interface is in the [LLM Inference reference](/agents/somnia-agents/base-agents/llm-inference).

## How a request runs

1. **Request.** A contract sends a prompt to Somnia Agents with a deposit and a callback.
2. **Elect.** A subcommittee of validators from the Somnia Validator Network is chosen to run it.
3. **Infer.** Each validator runs the same model with the same seed at zero temperature.
4. **Agree.** Under majority consensus, byte-identical answers from the threshold of validators finalise the request.
5. **Deliver.** The answer goes to the contract's callback. Signed receipts of each validator's run are kept for audit, and unspent deposit is refunded.

## Methods

| Method | Returns |
| --- | --- |
| `inferString` | Single-turn text, optionally limited to a list of allowed values |
| `inferNumber` | An integer, clamped to a range you set |
| `inferChat` | A reply in a multi-turn conversation with system, user and assistant roles |
| `inferToolsChat` | A reply that can call MCP servers, with onchain functions returned as calldata |

Each method can record chain-of-thought in the execution receipts. A request can accept only identical answers (majority consensus), or receive every validator's result and aggregate them onchain (threshold).

## Example

`moderation.ts`

```typescript
// From docs.somnia.network/agents/base-agents/llm-inference
const abi = [{
  type: 'function',
  name: 'inferString',
  inputs: [
    { name: 'prompt', type: 'string' },
    { name: 'system', type: 'string' },
    { name: 'chainOfThought', type: 'bool' },
    { name: 'allowedValues', type: 'string[]' }
  ],
  outputs: [{ name: 'response', type: 'string' }]
}];

// Content moderation example — constrain output to "safe" or "unsafe"
const calldata = encodeFunctionData({
  abi,
  functionName: 'inferString',
  args: [
    'Analyze the following text: "Check out this amazing new product!"',
    'You are a content moderation assistant.',
    false,            // chainOfThought
    ['safe', 'unsafe'] // allowedValues
  ]
});
```

---

Every page is also Markdown: append `.md` to its URL, or ask for `text/markdown`. Found something wrong, missing or confusing in these docs? Tell us: `POST /api/feedback` on this site with JSON `{"message": "…", "context": "what you were doing and what happened", "page": "…"}`, or a plain-text body. `GET /api/feedback` gives the JSON Schema. The team reads every one.
