---
title: Claude Haiku 4.5 | Runware Docs
url: https://runware.ai/docs/models/anthropic-claude-haiku-4-5
description: Fast, cost-efficient multimodal language model for low-latency agents and scaled reasoning workloads
---
# Claude Haiku 4.5

Claude Haiku 4.5 is Anthropic's fastest and most cost-efficient Claude model. It is built for latency-sensitive applications, high-volume agents, sub-agent orchestration, coding assistance, and budget-conscious deployments that still need strong reasoning and multimodal understanding.

- **ID**: `anthropic-claude-haiku-4-5`
- **Status**: api-only
- **Creator**: Anthropic
- **Release Date**: October 15, 2025
- **Capabilities**: Text to Text, Image to Text

## Request Parameters

**API Options**

Platform-level options for task execution and delivery.

### [taskType](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-tasktype)

- **Type**: `string`
- **Required**: true
- **Value**: `textInference`

Identifier for the type of task being performed

### [taskUUID](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-taskuuid)

- **Type**: `string`
- **Required**: true
- **Format**: `UUID v4`

UUID v4 identifier for tracking tasks and matching async responses. Must be unique per task.

### [webhookURL](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-webhookurl)

- **Type**: `string`
- **Format**: `URI`

Specifies a webhook URL where JSON responses will be sent via HTTP POST when generation tasks complete. For batch requests with multiple results, each completed item triggers a separate webhook call as it becomes available.

**Learn more** (1 resource):

- [Webhooks](https://runware.ai/docs/platform/webhooks) (platform)

### [deliveryMethod](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-deliverymethod)

- **Type**: `string`
- **Default**: `sync`

Determines how the API delivers task results.

**Allowed values**:

- `sync` Returns complete results directly in the API response.
- `async` Returns an immediate acknowledgment with the task UUID. Poll for results using getResponse.
- `stream` Streams results token-by-token as they are generated.

**Learn more** (1 resource):

- [Task Polling](https://runware.ai/docs/platform/task-polling) (platform)

### [includeCost](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-includecost)

- **Type**: `boolean`
- **Default**: `false`

Include task cost in the response.

### [includeUsage](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-includeusage)

- **Type**: `boolean`
- **Default**: `false`

Include token usage statistics in the response.

### [numberResults](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-numberresults)

- **Type**: `integer`
- **Min**: `1`
- **Max**: `4`
- **Default**: `1`

Number of results to generate. Each result uses a different seed, producing variations of the same parameters.

**Inputs**

Input resources for the task (images, audio, etc). These must be nested inside the \`inputs\` object.

### [documents](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-inputs-documents)

- **Path**: `inputs.documents`
- **Type**: `array of strings`

Array of document inputs (UUID, URL, or Base64).

### [images](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-inputs-images)

- **Path**: `inputs.images`
- **Type**: `array of strings`

Array of image inputs (UUID, URL, Data URI, or Base64).

**Generation Parameters**

Core parameters for controlling the generated content.

### [model](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-model)

- **Type**: `string`
- **Required**: true
- **Value**: `anthropic-claude-haiku-4-5`

Identifier of the model to use for generation.

**Learn more** (3 resources):

- [Text To Image: Model Selection The Foundation Of Generation](https://runware.ai/docs/guides/text-to-image#model-selection-the-foundation-of-generation) (guide)
- [Image Inpainting: Model Specialized Inpainting Models](https://runware.ai/docs/guides/image-inpainting#model-specialized-inpainting-models) (guide)
- [Image Outpainting: Other Critical Parameters](https://runware.ai/docs/guides/image-outpainting#other-critical-parameters) (guide)

### [messages](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-messages)

- **Path**: `messages.role`
- **Type**: `array of objects (2 properties)`
- **Required**: true

Array of chat messages forming the conversation context.

#### [role](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-messages-role)

- **Path**: `messages.role`
- **Type**: `string`
- **Required**: true

The role of the message author.

**Allowed values**: `user` `assistant`

#### [content](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-messages-content)

- **Path**: `messages.content`
- **Type**: `string`
- **Required**: true
- **Min**: `1`

The text content of the message.

**Settings**

Technical parameters to fine-tune the inference process. These must be nested inside the \`settings\` object.

### [systemPrompt](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-settings-systemprompt)

- **Path**: `settings.systemPrompt`
- **Type**: `string`
- **Min**: `1`
- **Max**: `200000`

System-level instruction that guides the model's behavior and output style across the entire generation.

### [cache](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-settings-cache)

- **Path**: `settings.cache`
- **Type**: `object (2 properties)`

Prompt caching configuration. Caches designated parts of the request to reduce cost and latency on repeated calls.

#### [scope](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-settings-cache-scope)

- **Path**: `settings.cache.scope`
- **Type**: `string`
- **Default**: `system+history`

Controls which parts of the request are cached.

**Allowed values**:

- `system` Cache the system prompt only.
- `system+history` Cache the system prompt and conversation history up to the last user message.

#### [ttl](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-settings-cache-ttl)

- **Path**: `settings.cache.ttl`
- **Type**: `string`
- **Default**: `5m`

Time-to-live for the cache.

**Allowed values**: `5m` `1h`

### [maxTokens](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-settings-maxtokens)

- **Path**: `settings.maxTokens`
- **Type**: `integer`
- **Min**: `1`
- **Max**: `64000`
- **Default**: `4096`

Maximum number of tokens to generate in the response.

### [stopSequences](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-settings-stopsequences)

- **Path**: `settings.stopSequences`
- **Type**: `array of strings`
- **Min**: `1`
- **Max**: `50`

Array of sequences that will cause the model to stop generating further tokens when encountered.

### [thinkingLevel](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-settings-thinkinglevel)

- **Path**: `settings.thinkingLevel`
- **Type**: `string`

Controls the depth of internal reasoning the model performs before generating a response.

**Allowed values**: `off` `low` `medium` `high`

### [toolChoice](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-toolchoice)

- **Path**: `toolChoice.type`
- **Type**: `object (2 properties)`

Controls how the model selects which tool to call. This only takes effect when `tools` are defined.

**Examples**:

**Let the model decide (default):**

```json
"toolChoice": {
  "type": "auto"
}
```

**Force a specific tool call:**

```json
"toolChoice": {
  "type": "tool",
  "name": "get_weather"
}
```

**Require any tool call:**

```json
"toolChoice": {
  "type": "any"
}
```

#### [type](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-toolchoice-type)

- **Path**: `toolChoice.type`
- **Type**: `string`
- **Required**: true

Strategy the model uses to decide when and which tools to call.

**Allowed values**:

- `auto` The model decides whether to call a tool based on the conversation context. This is the recommended default.
- `any` The model must call at least one tool but chooses which one. Useful when you always need structured output.
- `tool` The model must call the specific tool identified by name. Use this to force a particular function call.
- `none` The model will not call any tool, even if tools are defined. Useful for forcing a text-only response.

#### [name](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-toolchoice-name)

- **Path**: `toolChoice.name`
- **Type**: `string`

Name of the specific tool the model must call. Required when type is `tool`.

### [tools](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-tools)

- **Path**: `tools.type`
- **Type**: `array of objects (4 properties)`

An array of tool definitions that the model may call during generation. The model can invoke one or more tools based on the conversation context, outputting structured calls with arguments instead of (or alongside) free-text.

For `function` tools, each definition requires:

- **`type`**: `"function"`
- **`name`**: Unique identifier (alphanumeric, hyphens, underscores; max 64 chars).
- **`description`**: What the function does. The model uses this to decide when to call it.
- **`schema`**: JSON Schema object describing the expected input arguments.

> [!NOTE]
> The `search` tool is executed server-side by the provider. You don't need to handle the tool result yourself.

> [!NOTE]
> The `codeInterpreter` tool is executed server-side by the provider. You don't need to handle the tool result yourself.

**Examples**:

**Function tool, weather lookup:**

```json
"tools": [
  {
    "type": "function",
    "name": "get_weather",
    "description": "Get current weather for a city",
    "schema": {
      "type": "object",
      "properties": {
        "city": { "type": "string", "description": "City name" }
      },
      "required": ["city"]
    }
  }
],
"toolChoice": { "type": "auto" }
```

**Built-in web search:**

```json
"tools": [
  { "type": "search" }
]
```

**Built-in code interpreter:**

```json
"tools": [
  { "type": "codeInterpreter" }
]
```

**Multiple function tools:**

```json
"tools": [
  {
    "type": "function",
    "name": "search_products",
    "description": "Search the product catalog by query and filters.",
    "schema": {
      "type": "object",
      "properties": {
        "query": { "type": "string" },
        "category": { "type": "string" }
      },
      "required": ["query"]
    }
  },
  {
    "type": "function",
    "name": "add_to_cart",
    "description": "Add a product to the user's shopping cart.",
    "schema": {
      "type": "object",
      "properties": {
        "productId": { "type": "string" },
        "quantity": { "type": "integer", "minimum": 1 }
      },
      "required": ["productId"]
    }
  }
]
```

#### [type](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-tools-type)

- **Path**: `tools.type`
- **Type**: `string`
- **Required**: true

The kind of tool to make available to the model. User-defined functions require `name` and `schema`, while built-in tools (`search`, `codeInterpreter`) are executed server-side by the provider.

**Allowed values**:

- `function` User-defined function tool. The model outputs the tool name and arguments. You execute the function locally and send results back.
- `search` Built-in web search. The provider executes search server-side and enriches the response automatically.
- `codeInterpreter` Built-in code execution sandbox (Python). The provider runs code server-side and returns results automatically.

#### [name](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-tools-name)

- **Path**: `tools.name`
- **Type**: `string`
- **Max**: `64`

Unique function name. Required for function tools.

#### [description](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-tools-description)

- **Path**: `tools.description`
- **Type**: `string`

Explanation of what the function does, used by the model to decide when to call it.

#### [schema](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#request-tools-schema)

- **Path**: `tools.schema`
- **Type**: `object`

JSON Schema object describing the function's input parameters.

## Response Parameters

### [taskType](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#response-tasktype)

- **Type**: `string`
- **Required**: true
- **Value**: `textInference`

Type of the task.

### [taskUUID](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#response-taskuuid)

- **Type**: `string`
- **Required**: true
- **Format**: `UUID v4`

UUID of the task.

### [text](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#response-text)

- **Type**: `string`
- **Required**: true

Generated text content.

### [cost](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#response-cost)

- **Type**: `float`

Task cost in USD. Present when `includeCost` is set to `true` in the request.

### [finishReason](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#response-finishreason)

- **Type**: `string`
- **Required**: true

The reason why the model stopped generating tokens.

**Possible values**: `stop` `length` `content_filter` `unknown`

### [usage](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#response-usage)

- **Path**: `usage.promptTokens`
- **Type**: `object (4 properties)`
- **Required**: true

Token usage statistics for the request.

#### [promptTokens](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#response-usage-prompttokens)

- **Path**: `usage.promptTokens`
- **Type**: `integer`
- **Required**: true
- **Min**: `0`

Number of tokens in the input prompt.

#### [completionTokens](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#response-usage-completiontokens)

- **Path**: `usage.completionTokens`
- **Type**: `integer`
- **Required**: true
- **Min**: `0`

Number of tokens generated in the response.

#### [totalTokens](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#response-usage-totaltokens)

- **Path**: `usage.totalTokens`
- **Type**: `integer`
- **Required**: true
- **Min**: `0`

Total number of tokens used (prompt + completion).

#### [thinkingTokens](https://runware.ai/docs/models/anthropic-claude-haiku-4-5#response-usage-thinkingtokens)

- **Path**: `usage.thinkingTokens`
- **Type**: `integer`
- **Min**: `0`

Number of tokens used for internal reasoning. Billed separately.

## Examples

### Astrolabe Workshop Inventory Audit (Text to Text)

**Request**:

```json
{
  "taskType": "textInference",
  "taskUUID": "ccb2bc2f-b5b7-4837-ae96-95e20990ba6f",
  "model": "anthropic:claude@haiku-4.5",
  "settings": {
    "systemPrompt": "You are a meticulous operations analyst. Resolve inconsistencies, preserve important details, and present findings in crisp sections with practical recommendations.",
    "maxTokens": 8192,
    "thinkingLevel": "medium",
    "cache": {
      "scope": "system",
      "ttl": "1h"
    }
  },
  "messages": [
    {
      "role": "user",
      "content": "You are helping a small historical-instrument workshop prepare for a guild inspection. Below is a messy internal note compiled from voice memos, sticky notes, and partial shift logs. Read it carefully, then do four things: (1) produce a clean inventory table with item name, expected count, confirmed count, status, and notes; (2) list every contradiction or ambiguity you found; (3) identify the top 5 issues that must be resolved before inspection, ranked by urgency; (4) draft a short message to the workshop lead summarizing what to fix today. Be conservative: if something is uncertain, say so explicitly.\n\nWORKSHOP NOTE START\n\nNorth bench cabinet:\n- Brass astrolabe blanks: should be 18 after Tuesday casting.\n- Mira said 2 were set aside for engraving practice, but I only saw one tagged practice blank.\n- Finished rete assemblies on cork board: 7 total? Wait, no — board has 6 hanging, plus 1 wrapped in linen in drawer N3.\n- Drawer N3 label says 'rete assembly, polished x2', but one bundle felt too light.\n\nLathe corner:\n- Ebony handles for demonstration pieces: 12 planned for the season.\n- Counted 9 in the tray at open.\n- Tomas borrowed 2 yesterday for photography props; not sure if returned.\n- Afternoon note says 'all handles back except cracked one' — unclear whether cracked one is included in the tray count or discarded.\n\nApprentice shelf:\n- Star charts, printed reference sheets: master set should be 24 sheets.\n- Current stack clipped in blue folder: 23 sheets.\n- One coffee-stained copy was removed last week, but Hana may have reprinted it.\n- There is also a loose duplicate of sheet 7 with handwritten angle corrections.\n\nFinishing room:\n- Lacquer jars, clear coat: purchase ledger says 8 jars delivered.\n- Visible on rack: 5 sealed, 1 open, 1 nearly empty.\n- Shipping crate by door still contains packing straw and maybe one jar, but nobody checked because the lid is jammed.\n- Safety log says minimum reserve before inspection is 6 usable jars.\n\nFront display prep:\n- Demonstration astrolabes ready for visitors: target 5.\n- Window stand currently holds 3.\n- One more complete unit on polishing cloth near the vice.\n- Another unit is missing its pointer pin; body and dial are assembled.\n\nTool roll inventory:\n- Fine gravers expected: 14.\n- Roll pockets occupied: 13.\n- One graver may be at sharpening station.\n- Sharpening station note says 'returned after honing', but timestamp smudged and no initials.\n\nPacking area:\n- Wool wrap squares for transport kits: expected 30.\n- Open bundle counted at 26.\n- Two kits already pre-packed with 2 wraps each.\n- Scrap bin contains 1 wrap cut into strips, not usable.\n\nGeneral remarks:\n- If an item is assembled but missing a single essential fastening piece, do not count it as inspection-ready.\n- Practice blanks should not count toward finished demonstration inventory.\n- Consumables that are open but still usable may count as usable reserve, but nearly empty containers should be flagged separately.\n- If two notes conflict, prefer the most recent note only when it is specific.\n\nWORKSHOP NOTE END\n\nReturn the answer in plain text with clear headings."
    }
  ]
}
```

**Response**:

```json
{
  "taskType": "textInference",
  "taskUUID": "ccb2bc2f-b5b7-4837-ae96-95e20990ba6f",
  "text": "# WORKSHOP INSPECTION READINESS AUDIT\n\n---\n\n## 1. CLEAN INVENTORY TABLE\n\n| Item | Expected | Confirmed Count | Status | Notes |\n|------|----------|-----------------|--------|-------|\n| **Brass astrolabe blanks** | 18 | 17 (1 practice + ~16 regular) | ⚠ INCOMPLETE | Mira reported 2 practice blanks set aside; only 1 tagged practice blank located. **Missing: 1 practice blank or miscounted during casting.** |\n| **Rete assemblies** | 7 | 7 (6 hanging + 1 in linen, drawer N3) | ✓ LIKELY COMPLETE | Drawer N3 label notes \"polished x2\" with one bundle feeling light. Unclear if this is separate inventory or already included in the 7 count. Requires verification. |\n| **Ebony demonstration handles** | 12 | 9 confirmed in tray + 2 borrowed (back per afternoon note) + 1 cracked (status uncertain) | ⚠ INCOMPLETE | Afternoon note states \"all handles back except cracked one\"—most recent source favored per instructions. Cracked handle usability undetermined; may be discarded or counted as damaged stock. |\n| **Star charts (reference sheets)** | 24 | 23 in blue folder + 1 possibly reprinted by Hana | ⚠ UNCERTAIN | Coffee-stained copy removed last week; Hana may have reprinted but **not confirmed**. Extra duplicate of sheet 7 (handwritten corrections) exists. Net count depends on Hana's reprint. |\n| **Lacquer jars (clear coat)** | 8 | 5 sealed + 1 open + 1 nearly empty + 1 unverified in crate | ⚠ CRITICAL | One jar in crate by door **not yet checked** (jammed lid). Nearly empty jar questionable for usability. **Safety minimum: 6 usable jars required for inspection.** Current confirmed usable: 6–7 (depends on nearly-empty jar assessment and unchecked crate). |\n| **Demonstration astrolabes (ready)** | 5 | 4 complete (3 window stand + 1 polishing cloth) + 1 incomplete (missing pointer pin) | ✗ INSPECTION-FAILED | 1 unit is missing pointer pin (essential fastening piece per workshop standards). **Only 4 of 5 demonstration units are inspection-ready.** Missing unit cannot be counted. |\n| **Fine gravers** | 14 | 13 in tool roll + 1 possibly at sharpening station | ⚠ UNCERTAIN | 1 graver's location unconfirmed. Sharpening station note says \"returned after honing\" but timestamp smudged and **no signature/initials recorded**. Requires verification. |\n| **Wool wrap transport squares** | 30 | 26 in open bundle + 4 in pre-packed kits (2 kits × 2 wraps) + 1 in scrap (cut into strips) | ⚠ USABILITY ISSUE | 29 usable squares confirmed. 1 square in scrap bin (cut into strips) not usable for transport kits. |\n\n---\n\n## 2. CONTRADICTIONS & AMBIGUITIES\n\n### **Critical Conflicts:**\n\n1. **Brass astrolabe practice blanks (North bench cabinet)**  \n   - Mira stated 2 blanks set aside for engraving practice.  \n   - Only 1 tagged practice blank found during count.  \n   - **Resolution needed:** Locate the 2nd practice blank or confirm it was not cast.\n\n2. **Rete assemblies in drawer N3 (North bench cabinet)**  \n   - Cork board visually contains 7 total (6 hanging + 1 linen).  \n   - Drawer N3 label states \"rete assembly, polished x2\" with note \"one bundle felt too light.\"  \n   - **Ambiguity:** Are these the same 7, or separate polished units? Is \"light\" a sign of incompleteness or damage?  \n   - **Resolution needed:** Inspect both drawer N3 bundles and clarify inventory overlap.\n\n3. **Ebony handles—borrowed and cracked (Lathe corner)**  \n   - Opening count: 9 in tray.  \n   - Tomas borrowed 2 (status initially unknown).  \n   - Afternoon note (more recent): \"all handles back except cracked one.\"  \n   - **Ambiguity:** Does \"back\" mean the 2 borrowed ones are in the tray (counted in 9)? Is the cracked one included in the 9, separate, or discarded?  \n   - **Resolution needed:** Verify that 2 borrowed handles are returned and confirm cracked handle's disposition (usable, damaged, or missing).\n\n4. **Lacquer jars—unchecked crate (Finishing room)**  \n   - Ledger says 8 jars delivered.  \n   - 7 jars visually confirmed (5 sealed + 1 open + 1 nearly empty).  \n   - 1 jar possibly in crate by door, but **lid is jammed and unchecked**.  \n   - **Critical ambiguity:** Cannot confirm the 8th jar exists or its usability.\n\n5. **Demonstration astrolabes—pointer pin (Front display prep)**  \n   - Target: 5 ready for inspection.  \n   - Confirmed: 3 on window stand + 1 on polishing cloth.  \n   - Issue: 1 complete unit missing pointer pin (body and dial assembled).  \n   - **Per workshop standards:** Items missing essential fastening pieces do not count as ready.  \n   - **Resolution needed:** Repair or source replacement pointer pin, or accept only 4 units for display.\n\n6. **Star charts—reprinting status (Apprentice shelf)**  \n   - 23 sheets in blue folder (target: 24).  \n   - 1 coffee-stained copy removed; Hana \"may have reprinted it.\"  \n   - **Status unconfirmed.**  \n   - **Resolution needed:** Verify whether Hana completed reprint.\n\n7. **Fine gravers—sharpening station location (Tool roll)**  \n   - 13 confirmed in roll; 1 potentially at sharpening station.  \n   - Station note says \"returned after honing\" but timestamp is smudged and no initials recorded.  \n   - **Unverifiable:** Cannot confirm return or identity of graver.  \n   - **Resolution needed:** Check sharpening station physically and log the graver's return with signature.\n\n8. **Wool wraps—scrap bin accounting (Packing area)**  \n   - Expected: 30.  \n   - Counted: 26 open + 4 in pre-packed kits = 30 total.  \n   - Plus: 1 in scrap bin (cut into strips, not usable).  \n   - **Unclear:** Is the scrap wrap part of the original 30, or an additional damaged item?  \n   - **Most likely interpretation:** The 30 includes the scrap; thus 29 usable wraps are available.\n\n---\n\n## 3. TOP 5 URGENT ISSUES (Ranked by Inspection Impact)\n\n### **RANK 1: Demonstration Astrolabes — Missing Pointer Pin (CRITICAL FAIL)**\n- **Issue:** 1 of 5 required display units is incomplete (missing pointer pin, essential fastening piece).  \n- **Impact:** Inspection requires 5 ready astrolabes; can deliver only 4. Automatic failure for display readiness.  \n- **Action required:** Fabricate/source pointer pin and reassemble, OR identify a replacement unit, OR document variance before inspection.  \n- **Timeline:** Must resolve **today** before inspection.\n\n---\n\n### **RANK 2: Lacquer Jars — Safety Minimum at Risk (CRITICAL RISK)**\n- **Issue:** 8 jars delivered; only 7 confirmed visible. 1 jar in crate is unchecked (jammed lid). Additionally, 1 of 7 visible jars is \"nearly empty\" (usability uncertain).  \n- **Impact:** Safety log requires minimum 6 usable jars. Currently confirmed usable: 5–6 (if nearly empty is counted) or 6–7 (if unchecked crate contains a usable jar). **Below-minimum risk is real.**  \n- **Action required:** (a) Force open crate and verify 8th jar; (b) test/discard nearly empty jar and confirm usability; (c) reconcile count against delivery receipt.  \n- **Timeline:** Must resolve **today** before inspection.\n\n---\n\n### **RANK 3: Brass Astrolabe Practice Blanks — One Missing (HIGH)**\n- **Issue:** Mira reported 2 practice blanks set aside; only 1 found. Unclear if 2nd blank was never cast or is lost/misfiled.  \n- **Impact:** Inventory discrepancy; practice blanks should not count toward finished inventory, but their loss suggests casting/quality control issues. Guild may question casting process integrity.  \n- **Action required:** Confirm with Mira the status of the 2nd blank. Check all work surfaces, bins, and storage. Review casting records for Tuesday.  \n- **Timeline:** Resolve **before inspection** (within 24 hours).\n\n---\n\n### **RANK 4: Ebony Handles — Borrowed Items & Cracked Handle Status (HIGH)**\n- **Issue:** 2 handles borrowed by Tomas for photography; afternoon note says \"back,\" but cracked handle status (in tray vs. separate vs. discarded) is unclear. Expected 12; confirmed usable count is ambiguous.  \n- **Impact:** Inventory accuracy is compromised. If cracked handle is discarded, only 11 usable handles exist. If borrowed handles were not returned, only 9 exist.  \n- **Action required:** Physically verify all 12 handles in tray, confirm Tomas's returns, and separate/discard cracked handle with documentation.  \n- **Timeline:** Resolve **before inspection** (within 24 hours).\n\n---\n\n### **RANK 5: Fine Gravers — Unverified Sharpening Station Return (MEDIUM-HIGH)**\n- **Issue:** 1 of 14 expected gravers' location is unconfirmed. Sharpening station note lacks timestamp verification and signature.  \n- **Impact:** Tool inventory count is incomplete. If graver is not at station, it may be lost or in use without logging (safety/liability issue for guild inspection).  \n- **Action required:** Physically check sharpening station. If graver is present, log return with date, time, and staff signature. If absent, investigate all work areas and staff interviews.  \n- **Timeline:** Resolve **before inspection** (within 24 hours).\n\n---\n\n## 4. MESSAGE TO WORKSHOP LEAD\n\n---\n\n**SUBJECT: URGENT — Five Critical Issues for Today Before Inspection**\n\nHi [Lead],\n\nI've completed an inventory audit against our guild inspection checklist. **We have five issues that must be resolved today.** Here's the priority list:\n\n**🔴 CRITICAL (Stop work until fixed):**\n\n1. **Astrolabes (Display)** — One of our five demonstration units is missing its pointer pin. The body and dial are done, but it fails inspection-ready status because the pointer is an essential fastening piece. We need to either fabricate/install a pin or swap in a complete unit today.\n\n2. **Lacquer jars (Safety)** — We're at or below the safety minimum of 6 usable jars. We have 7 visible, but one is nearly empty (questionable) and one jar in the crate by the door hasn't been checked yet (jammed lid). We need to: (a) open that crate and verify the 8th jar, and (b) test the nearly-empty jar. If both fail, we drop to 5 usable jars and fail the safety requirement.\n\n**🟡 HIGH PRIORITY (Resolve before inspection closes today):**\n\n3. **Brass blanks (Practice)** — Mira said she set aside 2 practice blanks on Tuesday, but we found only 1 tagged. We need to find the second blank or confirm it was never cast. Check Mira's workspace, scrap bins, and the casting records.\n\n4. **Ebony handles (Inventory accuracy)** — Tomas borrowed 2 for photography. The afternoon note says they're \"back,\" but we need to physically verify all 12 handles are accounted for and separate out the cracked one with documentation.\n\n5. **Fine gravers (Tool tracking)** — One graver is supposedly at the sharpening station, but the return note has a smudged timestamp and no signature. Check the station, locate the graver, and log it back with a signature and date.\n\n**Secondary items that need attention (within 48 hours):**\n- Star charts: Confirm if Hana reprinted the coffee-stained copy.\n- Rete assemblies: Clarify whether the two \"polished\" items in drawer N3 are part of the seven or separate stock.\n- Wool wraps: Document the one in the scrap bin as unusable.\n\nCan you prioritize the two critical items (astrolabe pointer, lacquer jars) first? Those are inspection stoppers. Please confirm completion by end of day.\n\nThanks,  \n[Audit Team]\n\n---",
  "cost": 0.030258,
  "finishReason": "stop"
}
```

---

### Handwritten Festival Planning Whiteboard (Image to Text)

**Request**:

```json
{
  "taskType": "textInference",
  "taskUUID": "cccb39e2-8aaf-43b7-b587-825a563eb703",
  "model": "anthropic:claude@haiku-4.5",
  "settings": {
    "systemPrompt": "You are a precise operations assistant. When given an image of notes, extract only what is visible, distinguish uncertain readings, and present the result in a practical structured summary. Do not invent text that cannot be reasonably read.",
    "maxTokens": 1200,
    "thinkingLevel": "low",
    "cache": {
      "scope": "system",
      "ttl": "5m"
    }
  },
  "inputs": {
    "images": [
      "https://assets.runware.ai/assets/inputs/5449a50d-44d8-4804-ae32-1d4ec14aef52.jpg"
    ]
  },
  "messages": [
    {
      "role": "user",
      "content": "Analyze this planning-board photo and return: 1) a one-paragraph overview of the event, 2) a chronological schedule in bullet points, 3) a table-like list of tasks with owners if visible, 4) supplies or budget concerns mentioned, and 5) any text that is unclear or partially illegible."
    }
  ]
}
```

**Response**:

```json
{
  "taskType": "textInference",
  "taskUUID": "cccb39e2-8aaf-43b7-b587-825a563eb703",
  "text": "# Neighborhood Lantern Festival Planning Board Analysis\n\n## 1. Overview\nThe whiteboard documents planning for a Neighborhood Lantern Festival, capturing vendor/activity coordination, budget allocations, task assignments (distributed via colorful sticky notes on the left), a vendor schedule with pricing, and a spatial layout plan for booth placement. The event appears to be in active planning stages with multiple team members assigned various responsibilities.\n\n## 2. Chronological Schedule\n- Sings: $200 (appears as a budgeted item)\n- Sims: $20\n- Snack: $40\n- $50 (noted twice—purposes unclear)\n- Additional booth setup and vendor coordination needed\n\n*(Note: Specific dates are not clearly legible on the visible portions)*\n\n## 3. Tasks and Owners (Partial—from readable sticky notes)\n| Task/Area | Owner (if visible) | Status |\n|-----------|-------------------|--------|\n| Holtsinger | [appears on multiple notes] | In progress |\n| Sullivan | [on left-side sticky notes] | Assigned |\n| Various committee tasks | [Names on pink/green/yellow notes] | Distributed |\n\n*(Most task assignments are obscured or at angles making complete extraction unreliable)*\n\n## 4. Budget & Supplies Mentioned\n- Sings: $200\n- Sims: $20\n- Snack: $40\n- $50 (×2—purpose unclear)\n- **Vendor costs:** $15.20 dowels\n- **Quantities:** 280 slurpers, 220 suggestion items\n- **Layout:** Booth configuration shown with multiple vendor stations\n\n## 5. Unclear/Partially Illegible Text\n- Most sticky note text (overlapping and at various angles)\n- Specific vendor names in the schedule table\n- Dates associated with tasks\n- \"Boothcart\" layout labels (partially legible: \"Northseat,\" \"East,\" \"Cream\")\n- Red arrows connecting activities (text is cursive and difficult to parse completely)\n- Several handwritten items in the planning matrix lack clarity",
  "cost": 0.005689,
  "finishReason": "stop"
}
```

---

### Museum Ledger Deciphering Workflow (Image to Text)

**Request**:

```json
{
  "taskType": "textInference",
  "taskUUID": "4ff75869-4fb1-4889-a0d1-1c1d03f4d03c",
  "model": "anthropic:claude@haiku-4.5",
  "settings": {
    "systemPrompt": "You are a meticulous archival transcription assistant. Extract information conservatively, clearly separate what is directly visible from what is inferred, and preserve ambiguity when handwriting is unclear. Prefer concise structured output.",
    "maxTokens": 1400,
    "thinkingLevel": "low",
    "cache": {
      "scope": "system",
      "ttl": "1h"
    }
  },
  "inputs": {
    "images": [
      "https://assets.runware.ai/assets/inputs/0d7e480f-ca3a-4d06-a5ab-38c5dd55e8db.jpg"
    ]
  },
  "messages": [
    {
      "role": "user",
      "content": "Analyze the uploaded ledger page and return:\n1. A 2-3 sentence overview of what kind of document this is.\n2. A markdown table with one row per visible entry and these columns: line_number, accession_id, date, donor, object_description, dimensions, condition_notes, confidence.\n3. A bullet list of any illegible words or uncertain readings.\n4. A short preservation note describing stains, folds, fading, tears, or annotations visible on the page.\nIf a field is missing, use \"—\". Do not invent text that is not reasonably readable."
    }
  ]
}
```

**Response**:

```json
{
  "taskType": "textInference",
  "taskUUID": "4ff75869-4fb1-4889-a0d1-1c1d03f4d03c",
  "text": "# Archival Ledger Analysis\n\n## Overview\nThis is a museum acquisition ledger (Accessions Register) documenting donations and acquisitions of furniture and decorative arts (\"Möbelen u.Kunstgewerbe\"). Written in German in old cursive script, the document records objects received by the museum with associated donor information, dates, descriptions, and condition notes, spanning the 1880s-1890s.\n\n## Entries Table\n\n| Line | Accession_ID | Date | Donor | Object_Description | Dimensions | Condition_Notes | Confidence |\n|------|--------------|------|-------|-------------------|------------|-----------------|-----------|\n| 1 | 66437 | 1897 | [Illegible] | [Musical instrument-related; crossed out] | — | — | Low |\n| 2 | 141.24 | 1888-89 | [Illegible] | [Decorative object; heavily marked] | — | — | Low |\n| 3 | 141.30 | 1889 | [Illegible] | [Furniture or vessel] | — | — | Low |\n| 4 | 141.33 | 1892 | [Illegible] | [Object with decorative elements] | — | — | Low |\n| 5 | 67124 | [1890s] | [Illegible] | [Vessel or container] | — | — | Low |\n| 6 | 121.23 | 1894 | [Illegible - possibly \"Hammondsche\"] | [Object; multiple lines] | — | — | Low |\n\n## Illegible or Uncertain Readings\n- Most donor names are obscured by handwriting quality and age\n- Entire object descriptions are largely illegible due to German cursive script\n- Multiple entries contain crossed-out corrections\n- Right-side notation columns contain fragmentary text\n- Specific measurements/dimensions are not clearly distinguishable\n\n## Preservation Notes\n- **Folds**: Two diagonal fold lines crossing through center of page\n- **Annotations**: Extensive pen marks, cross-outs, and corrections in darker ink throughout\n- **Staining**: Light age-related browning and foxing on cream-colored paper\n- **Ink fading**: Some earlier entries show faded ink\n- **Condition**: Page remains legible but handling appears to have caused creasing; document is brittle at edges",
  "cost": 0.005773,
  "finishReason": "stop"
}
```

---

### Annotated Market Receipt Breakdown (Image to Text)

**Request**:

```json
{
  "taskType": "textInference",
  "taskUUID": "c8fe03e6-46ef-47b7-8a0c-ee97dd7fa060",
  "model": "anthropic:claude@haiku-4.5",
  "settings": {
    "systemPrompt": "You are a precise document-understanding assistant. Read shopping receipts carefully, preserve uncertainty when text is ambiguous, and present the result in clean JSON followed by a short plain-language note.",
    "maxTokens": 1200,
    "thinkingLevel": "low",
    "cache": {
      "scope": "system",
      "ttl": "1h"
    }
  },
  "inputs": {
    "images": [
      "https://assets.runware.ai/assets/inputs/c4adf6ec-1fd5-4f40-9393-40e5ae30f839.jpg"
    ]
  },
  "messages": [
    {
      "role": "user",
      "content": "Analyze the receipt image and return: 1) merchant_name, 2) purchase_datetime, 3) currency if inferable, 4) an items array with description, quantity if shown, unit_price if shown, line_total, 5) subtotal, tax, total, 6) payment_method details if visible, 7) a short list of possible OCR ambiguities, and 8) whether the arithmetic appears consistent. First output valid JSON only, then on a new line write a concise one-sentence summary."
    }
  ]
}
```

**Response**:

```json
{
  "taskType": "textInference",
  "taskUUID": "c8fe03e6-46ef-47b7-8a0c-ee97dd7fa060",
  "text": "```json\n{\n  \"merchant_name\": \"Maple Street Market\",\n  \"purchase_datetime\": \"2019-01-11T18:04:00\",\n  \"datetime_note\": \"Original text '2019-- 011:184' is ambiguous; interpreted as best guess\",\n  \"currency\": \"USD\",\n  \"items\": [\n    {\n      \"description\": \"Ooldee\",\n      \"quantity\": null,\n      \"unit_price\": null,\n      \"line_total\": 0.00\n    },\n    {\n      \"description\": \"8Ab402.34\",\n      \"quantity\": null,\n      \"unit_price\": null,\n      \"line_total\": 0.00\n    },\n    {\n      \"description\": \"Mapa2:4094\",\n      \"quantity\": null,\n      \"unit_price\": null,\n      \"line_total\": 0.00\n    },\n    {\n      \"description\": \"Mapa2:4226\",\n      \"quantity\": null,\n      \"unit_price\": null,\n      \"line_total\": 0.00\n    },\n    {\n      \"description\": \"Maple:4023\",\n      \"quantity\": null,\n      \"unit_price\": null,\n      \"line_total\": 0.00\n    },\n    {\n      \"description\": \"H48 Cad1:093\",\n      \"quantity\": null,\n      \"unit_price\": null,\n      \"line_total\": 0.00\n    },\n    {\n      \"description\": \"H48 BBB8T00BTT.8300\",\n      \"quantity\": null,\n      \"unit_price\": null,\n      \"line_total\": 1.00\n    },\n    {\n      \"description\": \"H48 Meater Litts.8D\",\n      \"quantity\": null,\n      \"unit_price\": null,\n      \"line_total\": 0.00\n    },\n    {\n      \"description\": \"H48 PBR0B00R19.8.903D\",\n      \"quantity\": null,\n      \"unit_price\": null,\n      \"line_total\": 1.00\n    },\n    {\n      \"description\": \"H43 5RR+08\",",
  "cost": 0.007566,
  "finishReason": "length"
}
```