426e9eeabd
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Waiting to run
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Waiting to run
Build Agent Image / build-and-push (push) Waiting to run
Chat shell gestures / Chat shell gesture + parity e2e (push) Waiting to run
Cloud Gateway Discord / Test (push) Waiting to run
Cloud Gateway Webhook / Test (push) Waiting to run
Cloud Tests / lint-and-types (push) Waiting to run
Cloud Tests / unit-tests (push) Waiting to run
Cloud Tests / integration-tests (push) Waiting to run
Cloud Tests / e2e-tests (push) Blocked by required conditions
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Apps Worker (Product 2) / Determine environment (push) Waiting to run
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Blocked by required conditions
Deploy Eliza Provisioning Worker / Determine environment (push) Waiting to run
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Blocked by required conditions
Dev Smoke / Classify changed paths (push) Waiting to run
Dev Smoke / bun run dev onboarding chat (push) Blocked by required conditions
Dev Smoke / Vite HMR dependency-level smoke (push) Blocked by required conditions
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Waiting to run
Publish @elizaos/example-code / check_npm (push) Waiting to run
Publish @elizaos/example-code / publish_npm (push) Blocked by required conditions
Publish @elizaos/plugin-elizacloud / verify_version (push) Waiting to run
Publish @elizaos/plugin-elizacloud / publish_npm (push) Blocked by required conditions
Sandbox Live Smoke / Sandbox live smoke (push) Waiting to run
Snap Build & Test / Build Snap (amd64) (push) Waiting to run
Snap Build & Test / Build Snap (arm64) (push) Waiting to run
supply-chain / sbom (push) Waiting to run
supply-chain / vulnerability-scan (push) Waiting to run
Build, Push & Deploy to Phala Cloud / build-and-push (push) Waiting to run
Test Packaging / Validate Packaging Configs (push) Waiting to run
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Waiting to run
Test Packaging / Pack & Test JS Tarballs (push) Waiting to run
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Waiting to run
UI Fixture E2E / ui-fixture-e2e (push) Waiting to run
UI Fixture E2E / fixture-e2e (push) Waiting to run
UI Story Gate / story-gate (push) Waiting to run
vault-ci / test (macos-latest) (push) Waiting to run
vault-ci / test (ubuntu-latest) (push) Waiting to run
vault-ci / test (windows-latest) (push) Waiting to run
vault-ci / app-core wiring tests (push) Waiting to run
verify-patches / verify patches/CHECKSUMS.sha256 (push) Waiting to run
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Waiting to run
Voice Benchmark Smoke / voice bench smoke summary (push) Blocked by required conditions
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Waiting to run
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Waiting to run
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Waiting to run
Test Packaging / Build & Test PyPI Package (push) Waiting to run
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
170 lines
5.6 KiB
Python
170 lines
5.6 KiB
Python
"""
|
|
Memory category utilities — vendored from upstream BFCL (Apache 2.0).
|
|
|
|
Source:
|
|
https://github.com/ShishirPatil/gorilla
|
|
berkeley-function-call-leaderboard/bfcl_eval/utils.py
|
|
|
|
Provides the small helpers that the MemoryAPI metaclass needs:
|
|
``is_first_memory_prereq_entry``, ``is_memory_prereq``,
|
|
``get_directory_structure_by_id``, plus the agentic substring checker
|
|
used to score the model's final response against ``possible_answer``.
|
|
|
|
Only the memory-related portions of upstream's much-larger ``utils.py`` are
|
|
vendored, since they are the only ones we depend on from the executable
|
|
runtime path. Pure functions, no side effects.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import re
|
|
from pathlib import Path
|
|
|
|
# Path to the local memory-prereq conversation fixtures.
|
|
# Lives next to this module to keep the vendored layout self-contained.
|
|
_THIS_DIR = Path(__file__).resolve().parent
|
|
MEMORY_PREREQ_CONVERSATION_PATH: Path = _THIS_DIR / "memory_prereq_conversation"
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Identity / category predicates (verbatim from upstream).
|
|
# ---------------------------------------------------------------------------
|
|
def is_web_search(test_category: str) -> bool:
|
|
return "web_search" in test_category
|
|
|
|
|
|
def is_memory(test_category: str) -> bool:
|
|
return "memory" in test_category
|
|
|
|
|
|
def is_first_memory_prereq_entry(test_entry_id: str) -> bool:
|
|
return "prereq" in test_entry_id and test_entry_id.endswith("-0")
|
|
|
|
|
|
def is_memory_prereq(test_category: str) -> bool:
|
|
return "prereq" in test_category
|
|
|
|
|
|
def is_agentic(test_category: str) -> bool:
|
|
return "web_search" in test_category or "memory" in test_category
|
|
|
|
|
|
def is_multi_turn(test_category: str) -> bool:
|
|
return "multi_turn" in test_category
|
|
|
|
|
|
def extract_test_category_from_id(
|
|
test_entry_id: str, remove_prereq: bool = False
|
|
) -> str:
|
|
"""Map ``memory_kv_3-finance-2`` -> ``memory_kv_3-finance``.
|
|
|
|
When ``remove_prereq=True`` the ``_prereq`` suffix is stripped first.
|
|
Verbatim from upstream's ``extract_test_category_from_id``.
|
|
"""
|
|
if remove_prereq:
|
|
test_entry_id = test_entry_id.replace("_prereq", "")
|
|
if ":" in test_entry_id:
|
|
test_entry_id = test_entry_id.split(":")[0]
|
|
return test_entry_id.rsplit("_", 1)[0]
|
|
|
|
|
|
def extract_memory_backend_type(test_category: str) -> str:
|
|
"""``memory_kv`` -> ``kv``."""
|
|
if not is_memory(test_category):
|
|
raise ValueError(f"Test category {test_category} is not a memory category.")
|
|
return test_category[len("memory_"):]
|
|
|
|
|
|
def get_general_grouping(test_id: str) -> str:
|
|
"""Map a test id to one of the high-level result groupings."""
|
|
if is_agentic(test_id):
|
|
return "agentic"
|
|
if is_multi_turn(test_id):
|
|
return "multi_turn"
|
|
return "non_live"
|
|
|
|
|
|
def get_directory_structure_by_id(test_id: str) -> str:
|
|
"""Returns ``agentic/memory/kv`` for memory tests, ``agentic`` for
|
|
web_search tests, etc. Used by the MemoryAPI snapshot folder layout.
|
|
"""
|
|
group = get_general_grouping(test_id)
|
|
if is_memory(test_id):
|
|
return os.path.join(
|
|
group,
|
|
"memory",
|
|
extract_memory_backend_type(
|
|
extract_test_category_from_id(test_id, remove_prereq=True)
|
|
),
|
|
)
|
|
return group
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Agentic checker — vendored from upstream
|
|
# bfcl_eval/eval_checker/agentic_eval/agentic_checker.py
|
|
# ---------------------------------------------------------------------------
|
|
def _standardize_string(input_string: str) -> str:
|
|
"""Normalize whitespace + punctuation for substring matching.
|
|
|
|
Strips ``,./-_*^()`` and lowercases.
|
|
"""
|
|
regex_string = r"[\,\.\/\-\_\*\^\(\)]"
|
|
return re.sub(regex_string, "", input_string).lower().replace("'", '"')
|
|
|
|
|
|
def agentic_checker(
|
|
model_response: object, possible_answer_list: list[str]
|
|
) -> dict:
|
|
"""Substring-match the model response against any of the possible answers,
|
|
ignoring case, whitespace, and ``,./-_*^()`` punctuation.
|
|
|
|
Returns ``{"valid": True}`` on a hit, otherwise a structured failure with
|
|
standardized strings for debugging.
|
|
"""
|
|
standardized_possible_answer_list = [
|
|
_standardize_string(possible_answer)
|
|
for possible_answer in possible_answer_list
|
|
]
|
|
if isinstance(model_response, list):
|
|
model_response = model_response[0] if model_response else ""
|
|
if not isinstance(model_response, str):
|
|
model_response = str(model_response)
|
|
|
|
standardized_model_response = _standardize_string(model_response)
|
|
|
|
for possible_answer in standardized_possible_answer_list:
|
|
if re.search(
|
|
rf"\b{re.escape(possible_answer)}\b",
|
|
standardized_model_response,
|
|
):
|
|
return {"valid": True, "error": []}
|
|
|
|
return {
|
|
"valid": False,
|
|
"error_message": "None of the expected answers were found in the model response.",
|
|
"error_type": "agentic:answer_not_found",
|
|
"details": {
|
|
"model_response": model_response,
|
|
"possible_answers": possible_answer_list,
|
|
"standardized_model_response": standardized_model_response,
|
|
"standardized_possible_answers": standardized_possible_answer_list,
|
|
},
|
|
}
|
|
|
|
|
|
__all__ = [
|
|
"MEMORY_PREREQ_CONVERSATION_PATH",
|
|
"agentic_checker",
|
|
"extract_memory_backend_type",
|
|
"extract_test_category_from_id",
|
|
"get_directory_structure_by_id",
|
|
"is_agentic",
|
|
"is_first_memory_prereq_entry",
|
|
"is_memory",
|
|
"is_memory_prereq",
|
|
"is_multi_turn",
|
|
"is_web_search",
|
|
]
|