{"record":{"id":"7c96fb729cd4cbfb","repo":"vercel/ai","slug":"opencode-session-create-returned-no-id","errorCode":null,"errorMessage":"OpenCode session create returned no id.","messagePattern":"OpenCode session create returned no id\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/harness-opencode/src/bridge/index.ts","lineNumber":595,"sourceCode":"  if (start.resumeSessionId) {\n    const existing = await legacySessionGet({\n      client,\n      sessionId: start.resumeSessionId,\n    }).catch(() => undefined);\n    if (existing && !existing.error) {\n      runtime.sessionId = start.resumeSessionId;\n      emit({ type: 'bridge-thread', threadId: runtime.sessionId });\n      return runtime.sessionId;\n    }\n  }\n  const created = await legacySessionCreate({ client });\n  if (created.error) {\n    throw new Error(\n      `OpenCode session create failed: ${formatError(created.error)}`,\n    );\n  }\n  const id = readSessionId(created.data);\n  if (!id) throw new Error('OpenCode session create returned no id.');\n  runtime.sessionId = id;\n  emit({ type: 'bridge-thread', threadId: id });\n  return id;\n}\n\nasync function runPrompt({\n  client,\n  sessionId,\n  start,\n  turn,\n  emit,\n}: {\n  client: OpenCodeClient;\n  sessionId: string;\n  start: StartMessage;\n  turn: BridgeTurn;\n  emit: Emit;\n}): Promise<HarnessUsage | undefined> {","sourceCodeStart":577,"sourceCodeEnd":613,"githubUrl":"https://github.com/vercel/ai/blob/69428b1f8b037e4d118fb4853428d5c4e620493c/packages/harness-opencode/src/bridge/index.ts#L577-L613","documentation":"After a successful session-create call, ensureSession reads the session id out of the response with readSessionId. If the id cannot be found, the bridge throws this error. It means the OpenCode server responded OK but with a body that does not carry a recognizable id field — almost always an API contract/version mismatch.","triggerScenarios":"legacySessionCreate resolves without created.error but readSessionId(created.data) returns undefined, e.g. the server returns a wrapped/envelope response, a snake_case id field, or an empty body the bridge's reader does not understand.","commonSituations":"OpenCode server upgraded/changed its session-create response shape; a proxy strips or rewrites the response body; running against a mock/incompatible server implementation.","solutions":["Check the actual session-create response shape from your OpenCode server (curl the endpoint) and compare with what readSessionId expects.","Align the OpenCode server version with the harness-bridge version that matches the response format.","If behind a proxy, ensure it does not strip or transform the JSON body.","Log created.data (e.g. patch or wrap the client) to see what the server actually returned."],"exampleFix":"// before: server returns { data: { session: { id } } } but bridge reads data.id\nconst id = readSessionId(created.data); // undefined -> throws\n// after: upgrade @ai-sdk/harness-opencode / OpenCode server to matching versions\npnpm update @ai-sdk/harness-opencode opencode","handlingStrategy":"type-guard","validationCode":"const probe = await fetch(`${base}/session`, { method: 'POST', body: '{}' }).then(r => r.json());\nif (!probe || (typeof probe.id !== 'string' && typeof probe.data?.id !== 'string')) {\n  throw new Error('OpenCode session-create response missing id — check server version');\n}","typeGuard":"function hasSessionId(data: unknown): data is { id: string } {\n  return typeof data === 'object' && data !== null && 'id' in data && typeof (data as { id: unknown }).id === 'string';\n}","tryCatchPattern":"try {\n  await agent.run(...);\n} catch (e) {\n  if (e instanceof Error && e.message === 'OpenCode session create returned no id.') {\n    console.error('Response shape mismatch — dump server response and align versions');\n  } else throw e;\n}","preventionTips":["Pin compatible OpenCode server/bridge versions in CI.","Probe the session-create endpoint response shape after upgrades.","Avoid proxies that rewrite JSON bodies.","Log raw created.data when troubleshooting response-shape drift."],"tags":["session","opencode","response-shape","version-mismatch"],"backgroundTag":"unexpected-api-response-shape","analyzedSha":"69428b1f8b037e4d118fb4853428d5c4e620493c","analyzedAt":"2026-08-30T12:32:21.016Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}