fix(filesystem): require metadata evidence in chat

This commit is contained in:
BukeLy 2026-05-26 16:25:51 +08:00
parent 8ae94ade19
commit 5c948d0840
2 changed files with 22 additions and 0 deletions

View file

@ -51,6 +51,8 @@ cat <path> --node 0009. You may also use file_ref or document_id when a path is
ambiguous. After structure identifies a relevant section node, prefer
cat <path> --node <node_id>; use cat <path> --page <range> when the user asks
for page-level evidence, no suitable node exists, or exact page text is needed.
For questions about metadata fields, available summaries, or whether metadata
was provided, inspect stat --schema and stat <target> before making claims.
"""
AGENT_TOOL_POLICY = """
@ -69,6 +71,8 @@ Tool policy:
- Use cat <target> --page <start>-<end> when the user explicitly asks for pages/page ranges, when no suitable node_id exists, or when you need exact page text to verify page-level evidence.
- Avoid fetching a broad page span after a matching node is available unless page-level citation or verification is required.
- Do not call cat --page <target> <start> <end>; if you need a page span, use cat <target> --page <start>-<end>.
- For metadata or summary-field questions, run stat --schema and stat <target> for relevant files before answering; do not infer metadata presence or absence from ls/find output alone.
- Distinguish default/register metadata from caller-provided custom metadata when the evidence supports it.
"""
STREAM_MODE_ALIASES = {
@ -361,6 +365,8 @@ class PIFSAgentStreamObserver:
print(text, end="", file=self.output, flush=True)
def emit_tool_call(self, command: str, *, force: bool = False) -> None:
if not command.strip():
return
if self.stream_log is not None:
self.stream_log.append({"kind": "tool_call", "command": command})
if not (force or self.wants_tool_stream):

View file

@ -79,6 +79,17 @@ class PIFSAgentStreamTest(unittest.TestCase):
self.assertEqual(stream_log[1]["kind"], "tool_result")
self.assertEqual(stream_log[2], {"kind": "tool_args", "text": '{"command":"ls /"}'})
def test_empty_tool_command_is_not_printed_or_logged(self):
output = io.StringIO()
stream_log = []
observer = PIFSAgentStreamObserver("tools", stream_log=stream_log, output=output)
observer.emit_tool_call("")
observer.emit_tool_call(" ")
self.assertEqual(output.getvalue(), "")
self.assertEqual(stream_log, [])
def test_tool_result_preview_compacts_large_outputs(self):
output = io.StringIO()
observer = PIFSAgentStreamObserver("tools", output=output)
@ -188,6 +199,11 @@ class PIFSAgentStreamTest(unittest.TestCase):
self.assertIn("page-level evidence", AGENT_TOOL_POLICY)
self.assertIn("prefer\ncat <path> --node <node_id>", BASH_TOOL_DESCRIPTION)
def test_prompt_requires_stat_for_metadata_questions(self):
self.assertIn("stat --schema and stat <target>", AGENT_TOOL_POLICY)
self.assertIn("do not infer metadata presence or absence", AGENT_TOOL_POLICY)
self.assertIn("questions about metadata fields", BASH_TOOL_DESCRIPTION)
def test_system_prompt_sets_workspace_identity_and_scope(self):
self.assertIn("PageIndex FileSystem Demo Agent", AGENT_SYSTEM_PROMPT)
self.assertIn("VectifyAI Team", AGENT_SYSTEM_PROMPT)