The Slack invite token was pasted verbatim into twelve places across ten files
here. Slack shared-invite links expire — on the plan this workspace uses they
are capped at 30 days, with no "never expires" option — so every one of those
twelve copies had gone stale.
An expired Slack invite gives no useful signal. It quietly redirects to the
workspace's generic signup page, which is restricted to a company email domain
and tells the visitor to contact an administrator for an invitation. It reads
like the community is closed, or like a permissions bug. Two people reported it
that way this week before anyone realised the link was simply dead.
Rotating a token across twelve hardcoded copies every 30 days was never going
to happen, which is how it got this stale. Four of the copies are frozen
versioned sidebars (0.6 through 0.9) that nobody thinks to grep. They are
updated here too: a reader on old docs deserves a working link as much as
anyone.
Everything now points at https://vectorize.io/slack, which redirects to the
current invite. Rotating becomes a one-line change in one repository, and the
links in this one stop going stale.
Claude-Session: https://claude.ai/code/session_011mnzArjiCdBxa8dh1H47Fa
* feat(llm): add Meta Model API as a first-class provider
Meta Model API (https://ai.developer.meta.com) serves the Muse family over an
OpenAI-compatible chat/completions endpoint, so it slots into the existing
OpenAICompatibleLLM path exactly like deepseek / zai / atlas.
Set `HINDSIGHT_API_LLM_PROVIDER=meta` to route fact extraction, reflection and
consolidation through it. The base URL defaults to https://api.meta.ai/v1 and
the default model is muse-spark-1.3 (1M context).
Two Meta-specific behaviours are worth knowing, and are documented rather than
worked around:
- Muse Spark always reasons. `reasoning_effort: "none"` is rejected with HTTP
400 — only minimal/low/medium/high/xhigh are accepted, or omit it. Reasoning
tokens are billed against the output budget, so the per-operation max-token
limits need headroom.
- Chat Completions documents `max_tokens`, not `max_completion_tokens`. Muse
Spark is a reasoning model but not one of the OpenAI products the frozen
`_supports_reasoning_model` name list recognises, so the parameter name comes
from the provider default. A test pins that, and pins that a configured
reasoning_effort still reaches the request (the #3449 drop list only covers
OpenAI's own non-reasoning products).
The provider is registered on the chat/completions path only. Meta also serves
a Responses and an Anthropic-Messages endpoint; a `meta-responses` variant
mirroring openai/openai-responses was considered and deliberately left out.
Capability flags are left off deliberately: Meta has no batch endpoint, and its
prompt caching is automatic (no key, flag, or breakpoints), so it does not fit
the explicit `get_or_create_cached_prefix` contract `supports_prompt_caching`
describes — the benefit applies for free either way.
Changes:
- engine/llm_wrapper.py: register "meta" in create_llm_provider(),
LLMProvider.valid_providers, and the default base_url map
- engine/providers/openai_compatible_llm.py: register "meta" in
valid_providers, default base_url, and the API-key-required check
- config.py: PROVIDER_DEFAULT_MODELS["meta"] = muse-spark-1.3
- tests/test_meta_provider.py: default model/base URL, API-key requirement,
the max_tokens parameter name, and reasoning_effort pass-through
- hindsight-embed control center: add Meta Model API to the provider wizard
- docs: add Meta to llmProviders.json (drives the providers grid, the
capability table and the default-models table) and config examples in
developer/models.mdx + developer/configuration.md
- README + .env.example (+ the bundled embed copy): document the new provider
Also colours the docs provider grid, which was previously monochrome. Each tile
now carries its brand colour, taken from the Simple Icons dataset — the same
project the marks themselves come from, so a tile's colour matches its mark.
Near-black brands (OpenAI, Ollama, Anthropic, ...) get a dark-theme override so
they do not vanish against the dark surface. Providers with no Simple Icons
entry (Groq, Fireworks, Atlas Cloud, Requesty, opencode-go, Nous, llama.cpp,
LiteLLM) keep the neutral inherited colour rather than an invented hex. The
fallback is `inherit`, so the other IconGrid caller (ClientsGrid) is unchanged.
Meta uses its own mark (SiMeta) rather than the generic OpenAI-compatible glyph.
Not verified against the live API — no Meta API key was available — so
muse-spark-1.3 is deliberately absent from the "Tested Models" table, which
means models verified to work. Worth probing first with a real key: Meta
rejects recursive JSON schemas in structured output with HTTP 400.
* docs(llm): mark muse-spark-1.3 tested against the live Meta API
Verified end-to-end through Hindsight's own create_llm_provider() against
https://api.meta.ai/v1 (HTTP 200, valid content, token usage parsed including
reasoning tokens), so muse-spark-1.3 now belongs in the Tested Models table.
Four behaviours confirmed live, all matching the published docs:
- Structured output with a flat json_schema works, and classified the probe
input correctly (world vs experience).
- Recursive JSON schemas are rejected: HTTP 400 "Recursive JSON schemas are not
currently supported". Audited every Pydantic response model in
engine/response_models.py for self-reference through $defs — none is
recursive, so no Hindsight path is affected.
- reasoning_effort "none" is rejected: HTTP 400 '"reasoning_effort" does not
support "none" with this model.' Other levels are accepted.
- Reasoning tokens are substantial and come out of the output budget: a trivial
prompt spent 87 reasoning tokens against 11 visible output tokens, and at
max_tokens=64 the response comes back with no content at all. Hindsight's
defaults leave ample room (retain 64000; consolidation and reflect unbounded),
so this only bites an operator who lowers the cap — which is what the
configuration note added with the provider already warns about.
Also records in the max-tokens test that Meta accepts max_completion_tokens as
well, so sending max_tokens is a choice between two working names rather than a
correctness fix.
* fix(llm): reflect failed outright on Meta — tool_choice is auto-only
Found by running a real Hindsight instance against Meta Model API and
exercising retain, recall, reflect and consolidation end to end. Reflect
returned HTTP 400 on every call:
only `"auto"` is supported for `tool_choice`. `"none"`, `"required"`,
and named function choices are not currently supported
Reflect's agent loop forces a retrieval tool on its first turns, so the whole
reflect surface was unusable on this provider. The unit tests could not have
caught it: they cover provider construction and parameter naming, not the
tool-calling path.
This is the opposite failure mode to the one `_drops_tool_choice_required`
handles. LM Studio and Ollama accept the field and silently ignore it, so
reflect answers badly (#1563/#1179); Meta rejects the request outright, so
reflect answers not at all. The two need separate predicates, hence
`_rejects_non_auto_tool_choice` alongside the existing check rather than a
widening of it.
The field is dropped for any non-auto mode. A named choice has already been
narrowed to a single tool by the block above, so the call stays practically
forced under auto — the same reasoning the DeepSeek branch relies on. "none"
cannot be expressed by omission and would become "auto"; no caller reaches
this path with it (only the gemini, claude-code and github-copilot providers
handle NONE), so that is documented in place rather than given an untested
tools-stripping branch.
tests/test_meta_tool_choice.py covers required, named and auto, and asserts the
carve-out does not leak to other OpenAI-compatible endpoints. The LM Studio and
required-downgrade suites still pass unchanged.
Also documents the latency finding from the same run: Muse Spark reasons before
every reply, and reflect's 30s default deadline is too short for its final
synthesis — it timed out four times before failing. Raising
HINDSIGHT_API_REFLECT_LLM_TIMEOUT and HINDSIGHT_API_LLM_TIMEOUT to 300 makes
reflect return a correct grounded answer in ~60s.
Verified end to end on the fixed build: retain 26s (3 facts, entities and a
March 2026 temporal range), recall 1.7s (3 hits, correctly ranked), reflect 60s
(grounded answer), consolidation completed (4 observations, 15 links, 0 failed
operations).
* docs(models): give Meta Model API its own setup section with the required knobs
The provider's settings were inline comments inside the shared 20-provider
config block, which is the wrong place for something an operator must act on:
three of the four are required, not tuning, and one of them (the reflect
deadline) is the difference between reflect working and reflect returning
nothing at all.
Adds a "Meta Model API Setup" section alongside the other providers that need
one, with the required knobs as a table that states why each is required —
every one of them a consequence of Muse Spark always reasoning before it
replies. Also records the model lineup, the contributor-tier trade-off, and the
four things worth knowing up front: prompt caching is automatic (which is why
the capability table shows none), there is no batch or embeddings endpoint,
recursive JSON schemas are rejected, and calls are slow.
The shared config block keeps the two timeout exports, since they are required
to be set, and now points at the section for the reasoning.
Adds pi (@earendil-works/pi-coding-agent) as a harness and extracts createPiExtension(harness),
the extension adapter pi and its fork Prime Agent share. Supersedes #3775.
The `pi` key is removed from package.json: both hosts read that same key, so it could only ever
name one bundle, and the host it did not name loaded the other's and reported the wrong harness.
`hindsight-coding-agents install pi|prime-agent` is now the only route for both.
Also makes the companion skill self-update for every host that installs one — the paths now live
once in core/skill-dirs.ts, which both the installer and skill-sync read.
Co-authored-by: Sebastian Otaegui <feniix@gmail.com>
Adds a `github-copilot` LLM provider backed by the official GitHub Copilot SDK, using the signed-in Copilot entitlement with no `HINDSIGHT_API_LLM_API_KEY`.
Verified end-to-end against a live Copilot subscription: retain, consolidation and reflect all run on the provider.
Review fixes on top of the original submission:
- default to `gpt-5.6-terra`; the submitted `gpt-5.6-sol` is not in the model list the runtime serves, so every call failed and the provider was unusable out of the box
- make a rejected request configuration terminal instead of a runtime failure; an unavailable model was invalidating the shared runtime and respawning `copilot --headless` once per attempt (5 spawns at max_retries=3, ~12 at the default of 10)
- let a token-authenticated host run without `~/.copilot`, so the documented COPILOT_GITHUB_TOKEN / GH_TOKEN / GITHUB_TOKEN path works in containers and CI
- regenerate skills/hindsight-docs (the provider list also feeds the generated faq.md)
Co-authored-by: Max Marino <dudujuju828@users.noreply.github.com>
* docs(readme): track hindsight-client downloads, cover the missing concepts
The PyPI downloads badge tracked hindsight-api; point it at hindsight-client
(1.6M/month) and make both download badges real links — the NPM one passed
`link=` as a shields param, which is inert in an image.
Relabel the "CI" badge to "Release": it points at release.yml, which only runs
on v* tags, so green meant "the last release published", not "tests pass".
test.yml (the actual CI) has no push trigger, so there is no main history to
badge without changing its triggers.
The LLM Wrapper was pitched as the easiest way in and shown only as a PNG —
uncopyable, unreadable to search engines and coding agents, with no
`pip install hindsight-litellm` and no link to the integration. It is now real
code, and passes hindsight_api_url explicitly because the wrapper defaults to
Cloud, which would otherwise silently send a local-Docker reader to
api.hindsight.vectorize.io.
Add the concepts the README never mentioned: integrations (60+, none were
listed), coding agents, MCP, observations, mental models, knowledge pages,
banks/dispositions, multilingual, Memory Defense, and production concerns.
Add Helm, bare-metal pip and Cloud install paths, plus the Go and CLI clients.
Fix stale facts: link the live benchmarks site next to the January 2026 chart,
and replace the hand-maintained 8-provider list with 25+ and the headline names.
Structure: add a Contents block, move Supported Platforms next to Quick Start
(it sat in the footer, ~200 lines below the anchor pointing at it), and collapse
the three repeated client-setup preambles in the operations section.
* docs(readme): point Cloud mentions at the pricing page
The Cloud links went straight to signup, so a reader had to start an account
to find out what the hosted option actually includes. Point them at
https://vectorize.io/pricing instead, which is Hindsight-specific and compares
self-hosted, Cloud and Enterprise side by side, and summarise what Cloud gives
you (managed scaling, dashboard, backups, 99.9% SLA, usage-based billing with
free credits). Signup stays as the action link next to it.
No prices in the README on purpose — they would go stale here, which is the
same failure mode as the hand-maintained provider list this branch removed.
* docs(readme): drop Pricing from the header nav
The pricing links in the Managed install path and the production table are
where a reader is actually deciding between hosting options; the nav row does
not need a sixth item.
The api.star-history.com embed in the README was broken. Replace it with
nicoloboschi/gh-stars, which backfills stargazer data via a scheduled GitHub
Action and commits a self-hosted SVG chart into the repo, so the README image
no longer depends on a third-party service.
Atlas Cloud (https://www.atlascloud.ai) exposes an OpenAI-compatible
chat/completions endpoint, so it slots into the existing
OpenAICompatibleLLM path exactly like deepseek / zai / opencode-go.
Set `HINDSIGHT_API_LLM_PROVIDER=atlas` to route fact extraction,
reflection and consolidation through Atlas Cloud. The base URL defaults
to https://api.atlascloud.ai/v1 and the default model is
deepseek-ai/deepseek-v4-pro (a reasoning model — give it enough
max_tokens, >= 512).
Changes:
- engine/llm_wrapper.py: register "atlas" in create_llm_provider(),
LLMProvider.valid_providers, and the default base_url map
- engine/providers/openai_compatible_llm.py: register "atlas" in
valid_providers, default base_url, and the API-key-required check
- config.py: PROVIDER_DEFAULT_MODELS["atlas"] = deepseek-ai/deepseek-v4-pro
- hindsight-embed control center: add Atlas Cloud to the provider wizard
- docs: add Atlas Cloud to llmProviders.json (drives the providers grid
and table) and a config example in developer/models.mdx
- README + .env.example: document the new provider
Verified end-to-end: instantiated the atlas provider through Hindsight's
own create_llm_provider() and made a live call() to
deepseek-ai/deepseek-v4-pro (HTTP 200, valid content + token usage).
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
The gitcgr.com SSL certificate has expired, so the code-graph badge
image (added in #648) renders as a broken-image icon in the README for
all visitors. Remove it since the third-party service appears defunct
and we don't control the cert.
* docs: flag Intel (x86_64) macOS as slim-only in supported-platforms grid (#2115)
`pip install hindsight-all` on Intel Macs silently backtracks to a
months-old release: every release since 0.4.18 pulls hindsight-api-slim[all],
whose local-ML extra requires torch>=2.6.0 and mlx, neither of which ships
x86_64 macOS wheels. The docs' supported-platforms grid claimed Intel macOS
bare-metal pip was "fully supported", which is false.
- Split the macOS grid row into Apple Silicon (fully supported) and
Intel/x86_64 (Docker + pg0 ✅, bare-metal pip ⚠️ slim only).
- Mirror the grid into README.md.
- Point Intel-Mac users to hindsight-all-slim / hindsight-api-slim plus a
hosted embeddings/reranker provider or the in-process ONNX backend
(which has x86_64 macOS wheels).
- Replace the ad-hoc warnings with one-line pointers to the grid.
Refs #2115
* docs: move Supported Platforms grid to bottom of README
* docs: simplify README platform table to icons, link docs for details
* fix(docker): clear diagnostic for pg0 bind-mount permission failure (#1483)
The standalone image runs rootless (UID 1000). A host bind mount whose
directory isn't owned by UID 1000 — the default on macOS Docker Desktop and
most non-1000 Linux hosts — makes embedded pg0 fail with the opaque
"Permission denied (os error 13)". Auto-chowning the volume would require
running as root, which we deliberately avoid.
Instead:
- Recommend a Docker named volume in the README/installation docs; named
volumes are seeded with the image's UID-1000 ownership, so they work with
zero setup and stay rootless.
- Add a pg0 writability pre-check in start-all.sh that prints an actionable
message (named volume, or --user) and exits cleanly instead of letting pg0
emit os-error-13. Skipped when an external database is configured.
- Add regression tests for the new check in test-start-all.sh.
* docs(readme): drop bind-mount explanation, keep named-volume fix
A single child segfault under load propagates through start-all.sh and
exits the whole container; with the documented --rm run there was no
recovery. Replace --rm with --name hindsight --restart unless-stopped in
the documented server-run commands so a transient crash self-heals.
Leaves the throwaway --rm --entrypoint sh model-inspection command in
custom-models/README.md untouched. Refs #1918.
* docs: add Oracle Database as supported enterprise storage option
PostgreSQL remains the primary and recommended backend. Oracle is
mentioned as a drop-in alternative for enterprise environments with
full feature parity.
* docs: remove untested Oracle managed services list
* docs: specify Oracle AI Database 26ai as the supported version
* docs: use "Oracle AI Database" consistently, drop version suffix
Add MiniMax as a supported LLM provider via the OpenAI-compatible interface.
- Register MiniMax in the provider factory and valid providers list
- Set default base URL to https://api.minimax.io/v1
- Set default model to MiniMax-M2.5 in PROVIDER_DEFAULT_MODELS
- Add temperature clamping for MiniMax (must be >0, ≤1.0)
- Add API key validation (MiniMax requires an API key)
- Add MiniMax configuration example to .env.example
- Update documentation (models.md, configuration.md, embed.md, CLAUDE.md, README.md)
- Add unit and integration tests for MiniMax provider
Co-authored-by: octo-patch <octo-patch@users.noreply.github.com>
The waitlist is no longer needed. Update all references from
vectorize.io/hindsight/cloud to ui.hindsight.vectorize.io/signup
and change "request early access" language to "sign up".
Fix doc to increase the developer experience...
- if the code is intended to be a CommonJS by using `require` then you have to wrap `await` calls in an async function
- calling `client.recall` with using the results