> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/iii-hq/sdk/llms.txt
> Use this file to discover all available pages before exploring further.

# III Client

> Initialize and configure the III SDK client

## init()

Initialize a new III SDK instance and connect to the engine.

```typescript theme={null}
import { init } from 'iii-sdk'

const iii = init(address, options?)
```

<ParamField path="address" type="string" required>
  WebSocket URL of the III Engine (e.g., `ws://localhost:49199`)
</ParamField>

<ParamField path="options" type="InitOptions">
  Optional configuration for the SDK instance

  <Expandable title="InitOptions properties">
    <ParamField path="workerName" type="string">
      Custom worker name for identification. Defaults to `hostname:pid`
    </ParamField>

    <ParamField path="enableMetricsReporting" type="boolean" default="true">
      Enable automatic worker metrics reporting via OpenTelemetry
    </ParamField>

    <ParamField path="invocationTimeoutMs" type="number" default="120000">
      Default timeout for function invocations in milliseconds (2 minutes)
    </ParamField>

    <ParamField path="reconnectionConfig" type="Partial<IIIReconnectionConfig>">
      WebSocket reconnection behavior configuration

      <Expandable title="Reconnection config properties">
        <ParamField path="initialDelayMs" type="number" default="1000">
          Initial delay before first reconnection attempt
        </ParamField>

        <ParamField path="maxDelayMs" type="number" default="30000">
          Maximum delay between reconnection attempts
        </ParamField>

        <ParamField path="backoffMultiplier" type="number" default="2">
          Exponential backoff multiplier for reconnection delays
        </ParamField>

        <ParamField path="jitterFactor" type="number" default="0.3">
          Random jitter factor (0-1) to prevent thundering herd
        </ParamField>

        <ParamField path="maxRetries" type="number" default="-1">
          Maximum retry attempts (-1 for infinite)
        </ParamField>
      </Expandable>
    </ParamField>

    <ParamField path="otel" type="OtelConfig">
      OpenTelemetry configuration. OTel is enabled by default.

      <Expandable title="OpenTelemetry config properties">
        <ParamField path="enabled" type="boolean" default="true">
          Enable OpenTelemetry. Set to `false` or env `OTEL_ENABLED=false` to disable
        </ParamField>

        <ParamField path="serviceName" type="string" default="iii-node">
          Service name for telemetry (also reads `OTEL_SERVICE_NAME` env var)
        </ParamField>

        <ParamField path="serviceVersion" type="string" default="unknown">
          Service version (also reads `SERVICE_VERSION` env var)
        </ParamField>

        <ParamField path="metricsEnabled" type="boolean" default="true">
          Enable metrics export (also reads `OTEL_METRICS_ENABLED` env var)
        </ParamField>

        <ParamField path="metricsExportIntervalMs" type="number" default="60000">
          Metrics export interval in milliseconds
        </ParamField>

        <ParamField path="fetchInstrumentationEnabled" type="boolean" default="true">
          Auto-instrument `fetch()` calls for HTTP client tracing
        </ParamField>

        <ParamField path="instrumentations" type="Instrumentation[]">
          Custom OpenTelemetry instrumentations (e.g., PrismaInstrumentation)
        </ParamField>
      </Expandable>
    </ParamField>

    <ParamField path="telemetry" type="TelemetryOptions">
      Additional telemetry metadata

      <Expandable title="Telemetry options">
        <ParamField path="language" type="string">
          Language/locale for telemetry
        </ParamField>

        <ParamField path="project_name" type="string">
          Project name for telemetry grouping
        </ParamField>

        <ParamField path="framework" type="string">
          Framework name (e.g., "express", "fastify")
        </ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ResponseField name="iii" type="ISdk">
  An initialized III SDK instance
</ResponseField>

### Example

```typescript theme={null}
import { init } from 'iii-sdk'

const iii = init('ws://localhost:49199', {
  workerName: 'api-worker-1',
  invocationTimeoutMs: 30000, // 30 seconds
  reconnectionConfig: {
    maxRetries: 10,
    initialDelayMs: 500
  },
  otel: {
    serviceName: 'my-api-service',
    serviceVersion: '1.0.0',
    metricsEnabled: true
  }
})
```

## Connection Management

### getConnectionState()

Get the current connection state.

```typescript theme={null}
const state = iii.getConnectionState()
```

<ResponseField name="state" type="IIIConnectionState">
  Current connection state: `'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'failed'`
</ResponseField>

### onConnectionStateChange()

Register a callback to be notified of connection state changes.

```typescript theme={null}
const unsubscribe = iii.onConnectionStateChange((state) => {
  console.log('Connection state:', state)
})

// Later: unsubscribe
unsubscribe()
```

<ParamField path="callback" type="(state: IIIConnectionState) => void" required>
  Function called when connection state changes
</ParamField>

<ResponseField name="unsubscribe" type="() => void">
  Function to unregister the callback
</ResponseField>

### Example: Connection State Handling

```typescript theme={null}
import { init } from 'iii-sdk'

const iii = init('ws://localhost:49199')

iii.onConnectionStateChange((state) => {
  switch (state) {
    case 'connected':
      console.log('✓ Connected to III Engine')
      break
    case 'reconnecting':
      console.warn('⟳ Reconnecting...')
      break
    case 'failed':
      console.error('✗ Connection failed')
      break
  }
})
```

## Lifecycle Management

### shutdown()

Gracefully shutdown the SDK, cleaning up all resources.

```typescript theme={null}
await iii.shutdown()
```

This method:

* Stops all metrics reporting
* Flushes and shuts down OpenTelemetry
* Rejects all pending invocations
* Closes the WebSocket connection
* Clears all callbacks

### Example: Graceful Shutdown

```typescript theme={null}
import { init } from 'iii-sdk'

const iii = init('ws://localhost:49199')

// Handle shutdown signals
process.on('SIGINT', async () => {
  console.log('Shutting down...')
  await iii.shutdown()
  process.exit(0)
})

process.on('SIGTERM', async () => {
  console.log('Shutting down...')
  await iii.shutdown()
  process.exit(0)
})
```

## Engine Queries

### listFunctions()

List all functions registered across the III network.

```typescript theme={null}
const functions = await iii.listFunctions()
```

<ResponseField name="functions" type="FunctionInfo[]">
  Array of registered function information

  <Expandable title="FunctionInfo properties">
    <ResponseField name="function_id" type="string">
      Function ID/path
    </ResponseField>

    <ResponseField name="description" type="string">
      Function description
    </ResponseField>

    <ResponseField name="request_format" type="RegisterFunctionFormat">
      Input schema definition
    </ResponseField>

    <ResponseField name="response_format" type="RegisterFunctionFormat">
      Output schema definition
    </ResponseField>

    <ResponseField name="metadata" type="Record<string, unknown>">
      Custom function metadata
    </ResponseField>
  </Expandable>
</ResponseField>

### listWorkers()

List all workers connected to the engine.

```typescript theme={null}
const workers = await iii.listWorkers()
```

<ResponseField name="workers" type="WorkerInfo[]">
  Array of connected worker information

  <Expandable title="WorkerInfo properties">
    <ResponseField name="id" type="string">
      Worker unique ID
    </ResponseField>

    <ResponseField name="name" type="string">
      Worker name
    </ResponseField>

    <ResponseField name="runtime" type="string">
      Runtime identifier (e.g., "node")
    </ResponseField>

    <ResponseField name="version" type="string">
      SDK version
    </ResponseField>

    <ResponseField name="status" type="WorkerStatus">
      Worker status: `'connected' | 'available' | 'busy' | 'disconnected'`
    </ResponseField>

    <ResponseField name="function_count" type="number">
      Number of functions registered by this worker
    </ResponseField>

    <ResponseField name="active_invocations" type="number">
      Number of currently executing invocations
    </ResponseField>
  </Expandable>
</ResponseField>

### Example: Service Discovery

```typescript theme={null}
// Discover available functions
const functions = await iii.listFunctions()

console.log('Available functions:')
for (const fn of functions) {
  console.log(`- ${fn.function_id}: ${fn.description || 'No description'}`)
}

// Monitor worker health
const workers = await iii.listWorkers()

console.log(`\n${workers.length} workers online`)
for (const worker of workers) {
  console.log(`- ${worker.name}: ${worker.function_count} functions, ${worker.active_invocations} active`)
}
```
