Skip to content

[Perf] Implement lazy loading for AI provider SDKs #30

@randomm

Description

@randomm

Problem

All 21 AI provider SDKs are eagerly imported at startup, adding 20-25 MB to the bundle. Most users only use 1-2 providers.

Current State

  • packages/opencode/src/provider/provider.ts (lines 17-39)
  • Static imports for all 21 providers
  • BUNDLED_PROVIDERS map references eager imports

Solution

Convert to lazy loading using dynamic imports:

// Current (eager)
import { createAmazonBedrock } from "@ai-sdk/amazon-bedrock"
const BUNDLED_PROVIDERS = {
  "@ai-sdk/amazon-bedrock": createAmazonBedrock,
}

// Proposed (lazy)  
const BUNDLED_PROVIDERS = {
  "@ai-sdk/amazon-bedrock": () => import("@ai-sdk/amazon-bedrock").then(m => m.createAmazonBedrock),
}

Why It's Feasible

  • getSDK() is already async
  • ✅ Fallback pattern exists for custom providers
  • ✅ State caching already implemented
  • ✅ Zero architecture changes needed

Expected Impact

  • Cold start: 20-25 MB → ~500 KB
  • Per provider: ~1.5-2.5 MB (on demand)
  • Typical user (2 providers): ~4 MB total

Trade-off

  • First provider access: +50-100ms latency (one-time)
  • Subsequent: instant (cached)

Acceptance Criteria

  • All 21 providers converted to dynamic imports
  • No startup regression
  • Provider caching still works
  • Tests pass

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions