Skip to content

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

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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