Skip to main content
Always read evaluation details first: reason, errorCode, errorMessage, and flagMetadata['fireweave.errorKind']. See Errors.
Also record: language + SDK version, runtime (Node / Bun / Deno + version), adapter (in-memory / FireWeave remote / vendor extra), and runtime.getState() / runtime.state() / runtime.State().
Problem. Cannot find module '@fireweaveai/sdk/posthog', missing controlPoints, or registry 404s for Go / Java.Cause. Version pin or an unpublished language, not a broken machine:
  • As of 2026-08-17, npm latest for @fireweaveai/sdk is 2.1.0 (CHANGELOG/docs previously described 2.1.0 as unpublished and latest as 2.0.0). 2.1.0 removed ./posthog and PostHogAdapter. 2.0.0 still has them — pin 2.0.0 only if you need that adapter; otherwise follow Migrate Node 2.0 to 2.1.
  • @fireweaveai/web-sdk is on npm at 2.1.0. fireweave is on PyPI at 0.1.0. The Go module and ai.fireweave:* remain unpublished.
Diagnosis. Check package.json / lockfile version. npm view @fireweaveai/sdk version should show what latest actually is.Solution. npm install @fireweaveai/sdk resolves to 2.1.0. pip install 'fireweave[openfeature]' and npm install @fireweaveai/web-sdk are valid. Install Go and Java from a checkout — do not run go get latest or Maven Central as if they were published. Node is ESM (type: module) with peer @openfeature/server-sdk.
Problem. Init is FATAL / PROVIDER_FATAL, or evaluations show GENERAL with fireweave.errorKind: Authentication or Authorization.Cause. Missing or wrong FW_PROJECT_API_KEY, wrong project, revoked key, host not on the allowlist, non-https off-loopback, or (web) a phc_ / phs_ / phx_ key rejected at construction.Diagnosis. Messages are redacted by design — compare key prefixes (project-api-key_… vs phc_) and the configured URL. Java: confirm you passed FireweaveConfig (no getenv). Web: confirm constructor apiUrl / apiKey. Deno: --allow-env if you rely on env vars.Solution. Set FW_API_URL and FW_PROJECT_API_KEY where those names are actually read (Configuration). Add custom hosts to allowedHosts. Never send vendor keys on the FireWeave remote path.
Problem. Every evaluate returns the default you passed.Diagnosis. Match the signature, then fix that cause only:
Problem. Rules that should match a user do not.Cause. The SDK forwards targetingKey and attributes. It does not invent an identity. Go and Java have no registerTarget on master. InMemory and the test-server stub do not persist registration.Diagnosis. Confirm you pass the same targetingKey on every evaluate. On Node/Python/Web, registerTarget / identify returns { ok, error? } and never throws — check ok. If you only registered and then evaluated against InMemory, registration was a no-op.Solution. Node/Python/Web: register durable properties where the API exists, and still send targetingKey (and per-request attributes) on evaluate. Go/Java: put properties on each evaluate context until a registration API exists. Do not expect the test stub to store targets.
Problem. No assignment events in capture or the console.Cause. sendExposure / send_exposure / SendExposure defaults to false in every language. OpenFeature evaluate is side-effect-free. Queued records sit in-process until flush. Identical tuples are deduplicated (deduped: true, not re-sent). Java close() and Go runtime.Shutdown do not drain the client exposure queue.Diagnosis. Check capabilities.get().runtime.features.exposureEmission. Log exposures.record results. Confirm you called flush (and, on Java/Go, that you flushed before shutdown).Solution. Opt in per call (sendExposure: true) or call exposures.record then flush. Web also flushes on visibilitychange → hidden and pagehide. See Exposures and Lifecycle.
Problem. recordHealth / recordError / recordMetric / recordOutcome seem to vanish.Cause. Signals queue and go out on the same /v1/capture flush path as exposures. Attributes pass an allowlist (Node default includes name, kind, status, value, unit, rolloutId, changeId, stampId, errorKind, message, flagKey, variant, environment, service). Delivery to fw-server vs in-process record is a known skew on some Node/Python paths.Diagnosis. Flush. Confirm the adapter is READY and not AlreadyClosed. Do not invent extra kinds or assume console Log/Alert/Block mapping.Solution. Call flush / shutdown paths that flush. Do not claim the server received a signal unless you verified capture (for example GET /_test/events against the stub’s { fwEvents }).
Problem. Evaluate times out (Timeout / GENERAL), or the process will not exit.Cause. Default request timeout is 3 s. Shutdown is deadline-bounded (10 s). A hang longer than that means shutdown was never called, or something outside FireWeave holds the event loop. Evaluate/capture are not retried by FireweaveRemoteAdapter. registerTarget retries once only when the kind is retryable.Diagnosis. Check FW_API_URL, allowlist, https vs loopback http, and that Java/Web actually received a URL (no env auto-read). Go: pass a deadline (ShutdownWithContext, CloseTimeout).Solution. Fix egress and config. Call shutdown on SIGTERM. Close injected vendor clients yourself. Reproduce faults on the test server (401, 429, 500, delay, invalid_json, quota_limited).
Problem. Provider looks ready but values are defaults; or you expected track.Cause. Node lazyReady: true (default). Web resolvers are sync reads of a prefetch cache — a lost prefetch is STALE, not a throw. Tracking (spec §6) is not implemented. Python OpenFeature is pre-1.0 (>=0.10,<0.11). Java pin is 1.15.1, not 1.21.0. Java getIntegerValue is 32-bit.Diagnosis. Read *Details and fireweave.errorKind. On web, check runtime state for STALE and provider Stale events.Solution. lazyReady: false when you need setProviderAndWait to wait. Use record / recordOutcome instead of track. See OpenFeature.
Problem. Guardrails or Java PostHog construction fails with UnsupportedCapability.Cause. Guardrails are a typed stub in every language (guardrails: false). Java PostHogAdapter.create(config) is UnsupportedCapability until a Java server SDK exists (inject PostHogClientApi).Diagnosis. capabilities.get().Solution. Do not call guardrails as if they work. For Java PostHog, use the injection seam or stay on FireweaveRemoteAdapter.

Language notes (verified)

  • Node: ESM, zero runtime deps, peer @openfeature/server-sdk. Integers beyond ±(2^53−1) are not lossless. @fireweaveai/sdk/posthog gone in 2.1 — see migration.
  • Python: OpenFeature needs fireweave[openfeature]; PostHog adapter needs fireweave[posthog]. After FATAL, the provider still returns default-valued decisions so you keep the taxonomy.
  • Go: Extension APIs take context.Context and return error. No registerTarget, no controlPoints namespace (Flags() only).
  • Java: No env auto-read. Native helpers are boolean + string; other types via evaluate or OpenFeature. SLF4J “no providers” warnings from the OpenFeature SDK are cosmetic.
  • Web: No env. Sync reads. identify then setContext. Secret key shapes refused at construction.

Next

Errors

Full kind table

Testing

Reproduce without a backend account
Last modified on August 18, 2026