EverOS/examples/langfuse
Dani 649046b0df
docs(api): use /api/v2 in docs and examples, demote v1 to legacy (#370)
1.2.0 introduced /api/v2 as the canonical, cloud-aligned prefix and mounted
every business router twice, but the user-facing entry points (README,
README.zh-CN, QUICKSTART, the docs/ set, the Langfuse example) still taught
/api/v1 — so new users were pointed at the compatibility alias while
docs/api.md already declared v2 canonical.

- Switch every EverOS endpoint reference in docs, examples, and
  `everos demo --live` to /api/v2, plus the matching CLI test expectations.
- Describe /api/v1 as a legacy compatibility alias that may be removed in a
  future major release, rather than a permanent one. Nothing changes at
  runtime: both prefixes still resolve to the same handlers and the
  v1/v2 parity test is untouched.
- Add a short note in README / README.zh-CN / QUICKSTART so existing v1
  integrations know they keep working.
- Fix the five dead endpoint anchors in the docs/api.md table of contents,
  which still pointed at the pre-1.2.0 #post-apiv1... slugs.

Left on v1 deliberately: docs/migration-to-1.0.0.md (historical record),
CHANGELOG history, tests/** (v1 must stay covered), and the
use-cases/claude-code-plugin + openher READMEs, which document a different
cloud API.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-29 10:52:29 +08:00
..
.gitignore docs(examples): replace Langfuse wrapper with native tracing example 2026-07-24 16:26:22 +08:00
README.md docs(api): use /api/v2 in docs and examples, demote v1 to legacy (#370) 2026-07-29 10:52:29 +08:00
demo.py docs(api): use /api/v2 in docs and examples, demote v1 to legacy (#370) 2026-07-29 10:52:29 +08:00

README.md

EverOS × Langfuse (native OpenTelemetry)

EverOS emits OpenTelemetry spans for its own memory operations — write, memcell boundary + episode extraction (LLM), search with recall-quality scores, and OME reflection — and exports them over OTLP to any backend, including Langfuse. There is no wrapper and no extra instrumentation code: enable it in config and the traces appear.

Enable

  1. Install the optional OpenTelemetry extra:

    pip install "everos[otel]"
    
  2. Add [observability] to your everos.toml. The Langfuse keys derive the OTLP endpoint and auth automatically:

    [observability]
    enabled             = true
    langfuse_public_key = "pk-lf-..."
    langfuse_secret_key = "sk-lf-..."
    langfuse_host       = "https://us.cloud.langfuse.com"   # EU: https://cloud.langfuse.com
    # capture_content   = true   # opt-in: also record query / extracted memory text
    

    Container/CI equivalent via env vars: EVEROS_OBSERVABILITY__ENABLED=true, EVEROS_OBSERVABILITY__LANGFUSE_PUBLIC_KEY=..., and so on.

  3. Run EverOS normally:

    everos server start
    

Off by default — with enabled = false (or the otel extra absent) there is zero tracing overhead.

What you get

EverOS operation Langfuse observation
POST /api/v2/memory/add · flush span everos.memory.add / everos.memory.flush
memcell boundary detection (LLM) generation everos.memcell.boundary (model + tokens)
episode extraction (LLM) generation everos.extract
markdown persistence span everos.persist.markdown
POST /api/v2/memory/search retriever everos.memory.searchrecall / rank
query / recall embedding embedding everos.embedding
OME reflection strategies agent everos.ome.<strategy> (linked to the triggering request's trace)

langfuse.session.id / langfuse.user.id group the traces. Recall quality is pushed as Langfuse scores, split by whether the method's score is calibrated: recall_top_score plus recall_hit for HYBRID / AGENTIC (comparable [0, 1]), and recall_top_score_raw for KEYWORD / single-route VECTOR, whose raw BM25 or cosine values are on a different scale and must not be averaged in with the calibrated ones. Query and memory text are captured only when capture_content = true.

Try it

With a server running and [observability] enabled:

python demo.py

It drives one add → flush → search (keyword / hybrid / agentic) cycle against http://127.0.0.1:8000 using only the standard library, then tells you to open Langfuse → Tracing filtered to session.id = langfuse_demo.

Learn more