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"constBUNDLED_PROVIDERS={"@ai-sdk/amazon-bedrock": createAmazonBedrock,}// Proposed (lazy) constBUNDLED_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