@opencode/sdk/effect 是 Effect 原生的嵌入式 SDK。操作返回带类型的 Effect 与 Stream,关闭所属 Scope 会释放 router、Location 服务、fiber 以及插件注册。
bun add @opencode/sdk/effect@4.0.1

创建宿主

在 Effect.scoped 内创建宿主,然后使用其生成的 API 分组或 sessions 别名。
import { AbsolutePath, Location, OpenCode } from "@opencode/sdk/effect"
import { Effect } from "effect"

const program = Effect.scoped(
  Effect.gen(function* () {
    const opencode = yield* OpenCode.create()
    const session = yield* opencode.sessions.create({
      location: Location.Ref.make({ directory: AbsolutePath.make("/workspace") }),
    })
    yield* opencode.sessions.prompt({
      sessionID: session.id,
      text: "Review the current changes",
    })
    return session
  }),
)

const session = await Effect.runPromise(program)
嵌入式宿主使用与 @opencode/client/effect 相同的 schema 值、已声明的错误、请求选项和 Stream。
const info = yield* opencode.server.info()
const sessions = yield* opencode.sessions.list()

流式事件

流式端点返回 Effect 的 Stream 值。若消费者应在后台运行,请在宿主 Scope 中 fork 它们。
import { Effect, Stream } from "effect"

yield* opencode.events.subscribe().pipe(
  Stream.runForEach((event) => Effect.logInfo("OpenCode event", { type: event.type })),
  Effect.forkScoped,
)

自定义

通过注册 Effect 插件来定制你的 OpenCode 实例。使用嵌入式宿主可自定义智能体、模型、工具及其他行为:
import { Plugin } from "@opencode/plugin/effect"
import { Effect } from "effect"

const plugin = Plugin.define({
  id: "customize-agent",
  effect: (ctx) =>
    Effect.gen(function* () {
      const agent = ctx.agent
      yield* agent.transform((agents) => {
        agents.update("build", (agent) => {
          agent.description = "Builds features and fixes bugs for our team"
        })
      })
    }),
})

yield* opencode.plugin(plugin)
参阅完整的 Effect 插件文档,了解插件钩子、转换、工具以及完整的插件上下文。

层(Layer)

当嵌入式宿主应当作为应用服务时,请使用 OpenCode.layer()。
import { OpenCode } from "@opencode/sdk/effect"
import { Effect } from "effect"

const program = Effect.gen(function* () {
  const opencode = yield* OpenCode.Service
  return yield* opencode.server.info()
})

const health = await Effect.runPromise(program.pipe(Effect.provide(OpenCode.layer())))