openai: compose healthchecks + dependency ordering, registries, LiteLLM routing

docker-compose.yml gains healthchecks and depends_on/condition chains for the
litellm/langfuse/postgres tier so dependants wait for a genuinely ready
service instead of a started container. Also plumbs AGAP_MCP_TOKEN into the
adolf and adolf-llm containers, sourced from openai/.env (gitignored), for the
kb#180 bearer auth on the agap MCP server; shared-mcp.json consumes it via
bearerTokenEnvVar so the Kimi backbone authenticates too.

agent-registry.yaml / agent_registry.py: the version-controlled source of
truth for agent identities and trust classes -- the same ids the agap-mcp
token map resolves to (`adolf`, `claude-coder`; note `claude-code-cli` is the
runtime entry, not an agent identity).

model-registry.yaml, litellm-config.yaml, auto-router-routes.json and
provision_litellm_keys.py: model tiering, virtual-key provisioning and
auto-router routes. tei-reranker/ is the local reranker service backing
Hindsight recall.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-30 04:41:31 +00:00
parent a5c625b9b6
commit b27d31b3ca
12 changed files with 732 additions and 40 deletions

View File

@@ -124,21 +124,18 @@ agents:
#
# Counts (same tool lists both layers, confirmed identical by
# validate_capability_grants.py, exit 0):
# agap 32->24, hindsight 29->9, kanboard 23->14,
# openclaw-tools 5->5 (already minimal, no filter needed).
# marketplace stays UNFILTERED at layer 1 (7/13 kept) but is not in
# shared-mcp.json AT ALL — Kimi's session never had it in the first
# place (pre-existing gap between what OpenClaw offers Adolf and
# what reaches Kimi, out of kb#144's scope to close).
# Reachable-by-Kimi total: hindsight+kanboard+openclaw-tools+agap
# 102-13(marketplace, never reached Kimi)=89 -> 9+14+5+24=52 tools
# (-42%). Byte-measured (chars/4) against each server's real
# tools/list JSON schemas: est. ~7K tokens saved/turn — estimate
# pending the real wire.jsonl number, which needs the adolf-llm
# container restart alvis owns (shared-mcp.json is bind-mounted
# read-only but adolf-llm's server.js caches its content at process
# start, so editing the file alone does not take effect — see
# capability_grant_status below for the confirm-post-restart command).
# agap 32->28 (includes kb#95 wiki_* and kb#170 todoist_capture_idea),
# hindsight 29->9, kanboard 23->14, marketplace 13->7 (now in shared-
# mcp.json, reaches Kimi), openclaw-tools 5->5 (already minimal).
# Reachable-by-Kimi total (2026-07-26): 9+14+7+5+28=63 tools.
# Previous total was 52 (excluding marketplace, pre-shared-mcp.json);
# byte-measure against each server's real tools/list JSON schemas:
# est. ~9K tokens/turn. Estimate pending the real wire.jsonl number,
# which needs the adolf-llm container restart alvis owns
# (shared-mcp.json is bind-mounted read-only but adolf-llm's
# server.js caches its content at process start, so editing the file
# alone does not take effect — see capability_grant_status below for
# the confirm-post-restart command).
#
# kb#95 (2026-07-23): added wiki_search/wiki_read/wiki_edit (family
# MediaWiki / РодоВики, family.alogins.net) to agap-mcp and to both
@@ -148,11 +145,17 @@ agents:
# recomputed here since it needs the same live wire.jsonl proof kb#144
# used and this task does not touch the running containers (see
# shared_mcp_kimi_allowlist below for the exact confirm command).
#
# kb#170: added todoist_capture_idea (agap-mcp/src/capture.js —
# classify with local bge-m3 nearest-centroid, no LLM call, then
# create the labelled Todoist task in one round trip) to agap-mcp
# and to both layers' agap allowlist below. Ages the counts comment
# above by +1/+1 for the same reason as kb#95's note.
mcp_tool_filter:
hindsight: [recall, retain, reflect, list_memories, get_memory, update_memory, list_directives, create_directive, delete_directive]
kanboard: [kanboard_list_projects, kanboard_get_project, kanboard_list_tasks, kanboard_my_tasks, kanboard_get_task, kanboard_search_tasks, kanboard_list_users, kanboard_project_activity, kanboard_create_task, kanboard_update_task, kanboard_move_task, kanboard_change_task_status, kanboard_assign_task, kanboard_add_comment]
marketplace: [marketplace_find_best, marketplace_search, marketplace_get_product, marketplace_get_recommendations, marketplace_get_reviews, marketplace_compare_prices, marketplace_status]
agap: [vw_get_password, vw_get_item, vw_list_items, vw_create_login, vw_update_password, ha_get_state, ha_list_entities, ha_call_service, ha_get_history, zabbix_get_problems, zabbix_get_hosts, zabbix_get_items, zabbix_get_triggers, radicale_list_calendars, radicale_list_events, radicale_get_event, radicale_put_event, radicale_delete_event, radicale_move_event, todoist_list_tasks, todoist_list_projects, todoist_create_task, todoist_update_task, todoist_complete_task, wiki_search, wiki_read, wiki_edit]
agap: [vw_get_password, vw_get_item, vw_list_items, vw_create_login, vw_update_password, ha_get_state, ha_list_entities, ha_call_service, ha_get_history, zabbix_get_problems, zabbix_get_hosts, zabbix_get_items, zabbix_get_triggers, radicale_list_calendars, radicale_list_events, radicale_get_event, radicale_put_event, radicale_delete_event, radicale_move_event, todoist_list_tasks, todoist_list_projects, todoist_create_task, todoist_update_task, todoist_complete_task, todoist_capture_idea, wiki_search, wiki_read, wiki_edit]
openclaw-tools: null # no filter in openclaw.json — already minimal (5/5 kept)
note: >
"scoped core tools" per kb#134's brief, now REAL at both levels: this
@@ -178,11 +181,20 @@ agents:
- { id: adolf-elizaveta, role: private, interlocutor: elizaveta }
- { id: adolf-shared, role: shared, interlocutor: household }
current_state: >
NOT split yet. A single live bank "adolf" (hindsight MCP,
http://hindsight:8888/mcp/adolf/, 269+ facts) serves every
interlocutor today with no per-human isolation — the exact defect
kb#153 exists to fix (depends on this registry existing first).
The three banks above are kb#153's target, not current fact.
NOT split yet for the plugin's recall/retain hooks: a single live
bank "adolf" (525+ facts) serves every interlocutor today with no
per-human isolation — the exact defect kb#153 exists to fix
(depends on this registry existing first). The three banks above
are kb#153's target, not current fact for the hooks.
kb#169 (2026-07-26): the SEPARATE raw hindsight MCP tool surface
(mcp.servers.hindsight in adolf/openclaw.json + openai/shared-
mcp.json — recall/retain/reflect/etc. callable directly by the
model, bypassing #153's interlocutor-scoping entirely) has been
repointed from http://hindsight:8888/mcp/adolf/ (the unpartitioned
bank, still what the hooks use) to http://hindsight:8888/mcp/
adolf-shared/ (pre-existing, 0 facts). That surface can now only
ever touch the shared bank — never a private one, never the mixed
"adolf" bank — regardless of who's talking to Adolf.
kb_identity: { username: adolf, user_id: 3 }
availability_note: "a(t) inherited from backbone at read time (kimi: quota-gated, ~60msg/5h ~300/wk — see model-registry.yaml)"
@@ -215,6 +227,14 @@ agents:
model: "session (ephemeral, per invocation) + repo state (git history, CLAUDE.md files, kanboard task/comment history) — no persistent Hindsight bank"
kb_identity: { username: claude, user_id: 2 }
availability_note: "a(t) inherited from backbone at read time (claude-code-cli: always-on, gated by claude-usage windows)"
completion_convention: >
Verified-completion flow (DESIGN v2.1 §2, kb#159): when completing a task,
the worker/agent NEVER closes it — only moves it to Done (unverified
completion) and leaves it open. Closing is verification, done by someone
OTHER than the producer (the submitter, a human, or a reviewer-agent after
checking acceptance criteria). The fabric-keeper audits this: closed tasks
where the producer also closed them are flagged as kb#159 violations in
the daily digest.
# ── torgash — marketplace analyst (sandboxed) ───────────────────────────
- id: torgash