opencode.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132
  1. import { Effect } from "effect"
  2. import { PluginV2 } from "../../plugin"
  3. import { ProviderV2 } from "../../provider"
  4. export const OpencodePlugin = PluginV2.define({
  5. id: PluginV2.ID.make("opencode"),
  6. effect: Effect.gen(function* () {
  7. let hasKey = false
  8. return {
  9. "catalog.transform": Effect.fn(function* (evt) {
  10. const item = evt.data.find((record) => record.provider.id === ProviderV2.ID.opencode)
  11. if (!item) return
  12. hasKey = Boolean(
  13. process.env.OPENCODE_API_KEY ||
  14. item.provider.env.some((env) => process.env[env]) ||
  15. item.provider.options.aisdk.provider.apiKey ||
  16. (item.provider.enabled && item.provider.enabled.via === "account"),
  17. )
  18. evt.provider.update(item.provider.id, (provider) => {
  19. if (!hasKey) provider.options.aisdk.provider.apiKey = "public"
  20. })
  21. if (hasKey) return
  22. for (const model of item.models.values()) {
  23. if (!model.cost.some((cost) => cost.input > 0)) continue
  24. evt.model.update(item.provider.id, model.id, (draft) => {
  25. draft.enabled = false
  26. })
  27. }
  28. }),
  29. }
  30. }),
  31. })