Files
wehub-resource-sync b4fbd6fe9f
Deploy Site / deploy-vercel (push) Has been skipped
Deploy Site / deploy-docs (push) Has been skipped
Build Skills Index / build-index (push) Has been skipped
CI / Deny unrelated histories (push) Has been skipped
CI / Detect affected areas (push) Successful in 27m35s
CI / OSV scan (push) Failing after 4s
CI / Build&Test Docker image (push) Successful in 9s
CI / Supply-chain scan (push) Has been skipped
CI / Lint Docker scripts (push) Failing after 5m13s
CI / Check contributors (push) Failing after 12m8s
CI / Docs Site (push) Failing after 12m8s
CI / TypeScript (push) Failing after 12m8s
CI / Python lints (push) Failing after 12m9s
CI / Python tests (push) Failing after 12m9s
CI / Check uv.lock (push) Failing after 23m22s
CI / CI timing report (push) Has been cancelled
Build Skills Index / trigger-deploy (push) Has been cancelled
CI / All required checks pass (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 11:56:03 +08:00

55 lines
2.4 KiB
Python

"""Schema-shape tests for the built-in memory tool.
The memory tool previously used ``allOf: [{if: ..., then: {required: ...}}]``
at the top level of ``parameters`` to hint per-action required fields. That
form was:
1. Ignored by every provider (Chat Completions doesn't honour ``if/then``
on function schemas), so it never actually enforced anything.
2. **Rejected outright by strict backends** — OpenAI's Codex endpoint
(``chatgpt.com/backend-api/codex``, gpt-5.x) returns
``Invalid schema for function 'memory': schema must have type 'object'
and not have 'oneOf'/'anyOf'/'allOf'/'enum'/'not' at the top level``.
We now rely on the runtime handler (``memory_tool()`` in ``tools/memory_tool.py``)
to validate required fields per action and return actionable error messages.
These tests guard the schema against regressing back to a shape strict
backends reject.
"""
import json
from tools.memory_tool import MEMORY_SCHEMA
_FORBIDDEN_TOP_LEVEL_KEYS = ("allOf", "anyOf", "oneOf", "enum", "not")
def test_memory_schema_has_no_forbidden_top_level_combinators():
"""OpenAI's Codex backend rejects these at the top level of parameters."""
params = MEMORY_SCHEMA["parameters"]
for key in _FORBIDDEN_TOP_LEVEL_KEYS:
assert key not in params, (
f"top-level {key!r} in memory tool parameters will break the "
"Codex backend (chatgpt.com/backend-api/codex). Per-action "
"required-field checks belong in the runtime handler, not the schema."
)
def test_memory_schema_is_well_formed():
params = MEMORY_SCHEMA["parameters"]
assert params["type"] == "object"
# Only ``target`` is universally required: ``action`` belongs to the
# single-op shape and is omitted when the batch ``operations`` array is used.
assert params["required"] == ["target"]
# Nested ``enum`` on property values is fine — only top-level is forbidden.
assert params["properties"]["action"]["enum"] == ["add", "replace", "remove"]
assert params["properties"]["target"]["enum"] == ["memory", "user"]
# Batch shape is exposed and its items reuse the same actions.
assert params["properties"]["operations"]["type"] == "array"
assert params["properties"]["operations"]["items"]["properties"]["action"]["enum"] == ["add", "replace", "remove"]
def test_memory_schema_is_json_serializable():
json.dumps(MEMORY_SCHEMA)