Skip to content

LlmEngine

Low-level engine interface for advanced use cases.

Overview

LlmEngine is the underlying engine that powers LlmModel. Use it when you need more control or want to work with multiple models dynamically.

Recommendation: Use LlmModel for most cases. Only use LlmEngine if you need to switch models frequently or require advanced control.

typescript
import { igniteEngine, Message } from 'multi-llm-ts'

const config = { apiKey: 'API_KEY' }
const engine = igniteEngine('openai', config)

// Must pass model to each operation
await engine.complete(chatModel, messages)

Creating an LlmEngine

igniteEngine()

typescript
function igniteEngine(
  provider: string,
  config: EngineConfig
): LlmEngine

Parameters:

  • provider: Provider ID ('openai', 'anthropic', etc.)
  • config: Configuration with API key and options

Example:

typescript
const engine = igniteEngine('google', {
  apiKey: process.env.GOOGLE_API_KEY
})

Methods

complete()

Generate a complete response:

typescript
async complete(
  model: ChatModel,
  messages: Message[],
  opts?: LlmCompletionOpts
): Promise<LlmResponse>

Parameters:

  • model: ChatModel to use
  • messages: Array of Message objects
  • opts: Optional generation parameters

Example:

typescript
const response = await engine.complete(chatModel, messages, {
  temperature: 0.7
})

generate()

Generate a streaming response:

typescript
generate(
  model: ChatModel,
  messages: Message[],
  opts?: LlmCompletionOpts
): AsyncGenerator<LlmChunk>

Parameters:

  • model: ChatModel to use
  • messages: Array of Message objects
  • opts: Optional generation parameters

Example:

typescript
const stream = engine.generate(chatModel, messages)

for await (const chunk of stream) {
  console.log(chunk)
}

addPlugin()

Register a plugin:

typescript
addPlugin(plugin: Plugin): void

Example:

typescript
engine.addPlugin(new MyPlugin())

buildModel()

Create a ChatModel from a model ID:

typescript
buildModel(id: string): ChatModel

Example:

typescript
const chatModel = engine.buildModel('gpt-4')
await engine.complete(chatModel, messages)

EngineConfig

Configuration for engine creation:

typescript
interface EngineConfig {
  apiKey?: string
  baseURL?: string
  timeout?: number
  useOpenAIResponsesApi?: boolean
  customOpts?: Record<string, any>
}

Fields:

  • apiKey: API key for the provider
  • baseURL: Custom API endpoint
  • timeout: Request timeout in milliseconds
  • useOpenAIResponsesApi: Use OpenAI Responses API
  • customOpts: Provider-specific options

Example:

typescript
const config = {
  apiKey: 'KEY',
  baseURL: 'https://custom.api.com',
  timeout: 60000,
  customOpts: {
    // Ollama example
    num_ctx: 8192
  }
}

When to Use LlmEngine

Dynamic Model Selection

When switching models frequently:

typescript
const engine = igniteEngine('openai', config)

const models = await loadModels('openai', config)

// Use different models
await engine.complete(models.chat[0], messages)  // GPT-4
await engine.complete(models.chat[1], messages)  // GPT-3.5

Multiple Providers

Managing multiple providers:

typescript
const openaiEngine = igniteEngine('openai', configOpenAI)
const anthropicEngine = igniteEngine('anthropic', configAnthropic)

// Use different providers
const response1 = await openaiEngine.complete(gpt4Model, messages)
const response2 = await anthropicEngine.complete(claudeModel, messages)

Advanced Control

Fine-grained control over model selection:

typescript
async function generateWithFallback(messages: Message[]) {
  const models = await loadModels('openai', config)

  // Try flagship model first
  try {
    return await engine.complete(models.chat[0], messages)
  } catch (error) {
    // Fall back to cheaper model
    return await engine.complete(models.chat[1], messages)
  }
}

Comparison

FeatureLlmModelLlmEngine
API simplicity✅ Simple⚠️ Verbose
Model bindingBound to one modelDynamic
Plugin managementPer-modelShared
Use caseStandard usageAdvanced scenarios

Migration from LlmEngine to LlmModel

Before (v4.0):

typescript
const engine = igniteEngine('openai', config)
const models = await loadModels('openai', config)

await engine.complete(models.chat[0], messages)

After (v4.5+):

typescript
const models = await loadModels('openai', config)
const model = igniteModel('openai', models.chat[0], config)

await model.complete(messages)

Examples

Basic Usage

typescript
const engine = igniteEngine('anthropic', config)
const models = await loadModels('anthropic', config)
const claudeModel = models.chat[0]

const response = await engine.complete(claudeModel, messages)

Model Switching

typescript
const engine = igniteEngine('openai', config)
const models = await loadModels('openai', config)

// Use GPT-4 for complex tasks
const response1 = await engine.complete(models.chat[0], complexMessages)

// Use GPT-3.5 for simple tasks
const response2 = await engine.complete(models.chat[1], simpleMessages)

buildModel()

typescript
const engine = igniteEngine('openai', config)

// Quick model creation without loadModels()
const model = engine.buildModel('gpt-4')

await engine.complete(model, messages)

Next Steps

Released under the MIT License.