oclaw/tests/test_oclaw_agent_core_trace.py
oliver 420abac9f1 refactor: root-package imports (svc/runtime/interfaces) and fix PYTHONPATH
- Rename platform/ to svc/ to avoid shadowing stdlib platform.
- Replace from oclaw.* with from svc/runtime/interfaces; update -m CLI paths.
- tests/conftest: prepend repo root to sys.path (no parent-folder package name).
- CI: paths and offline_eval script under repo root.
- Ops scripts: PYTHONPATH must be repo root for python -m runtime.* (fixes gateway/WhatsApp sidecar startup).
- Fix default oclaw.json path in tabular/file attachment limits; stabilize attachment test config.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-13 14:51:17 +08:00

119 lines
4 KiB
Python

from __future__ import annotations
from pathlib import Path
import pytest
from runtime.agent_core_run import AgentCoreRunInput, run_agent_core
from runtime.types import StandardMessage
from svc.llm.chat_models import StaticTextChatModel
from svc.persistence.sqlite_store import SqliteStore
from runtime.tools.base import ToolRegistry
def _msg(session_id: str, *, metadata: dict | None = None) -> StandardMessage:
return StandardMessage(
session_id=session_id,
tenant_id="t1",
user_id="u1",
role="member",
channel="admin_chat",
text="hello",
attachments=[],
metadata=metadata if isinstance(metadata, dict) else {"tenant_id": "t1", "user_id": "u1"},
)
def test_agent_core_run_started_trace_payload_keys(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
store = SqliteStore(str(tmp_path / "trace.sqlite"))
sess = store.create_session("t")
events: list[dict] = []
real_add = store.add_trace_event
def _wrap(**kwargs: object) -> None:
events.append(dict(kwargs))
return real_add(**kwargs)
monkeypatch.setattr(store, "add_trace_event", _wrap)
trace_id = "trace-abc"
run_agent_core(
store=store,
data=AgentCoreRunInput(
msg=_msg(sess.id),
lang="zh",
system_prompt="sys",
model=StaticTextChatModel("done"),
tools=ToolRegistry([]),
trace_id=trace_id,
parent_span_id=None,
max_attempts=1,
oclaw_task_id="task-99",
oclaw_worker_id="worker-zz",
),
)
started = [e for e in events if e.get("event_type") == "run_started"]
assert started, events
pl = started[0].get("payload") or {}
assert pl.get("pipeline") == "oclaw_agent_core"
assert pl.get("oc_stage") == "run_start"
assert pl.get("trace_id") == trace_id
assert pl.get("lang") == "zh"
assert "run_id" in pl
assert pl.get("oclaw_task_id") == "task-99"
assert pl.get("oclaw_worker_id") == "worker-zz"
assert pl.get("relay_envelope_present") is False
assert pl.get("relay_envelope_pointer_count") == 0
att = [e for e in events if e.get("event_type") == "attempt_started"]
assert att
apl = att[0].get("payload") or {}
assert apl.get("oc_stage") == "attempt"
assert apl.get("attempt_no") == 1
def test_agent_core_trace_includes_relay_envelope_stats(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
store = SqliteStore(str(tmp_path / "trace2.sqlite"))
sess = store.create_session("t")
events: list[dict] = []
real_add = store.add_trace_event
def _wrap(**kwargs: object) -> None:
events.append(dict(kwargs))
return real_add(**kwargs)
monkeypatch.setattr(store, "add_trace_event", _wrap)
run_agent_core(
store=store,
data=AgentCoreRunInput(
msg=_msg(
sess.id,
metadata={
"tenant_id": "t1",
"user_id": "u1",
"relay_share_envelope": {
"schema_version": "v1",
"attachments": {"pointers": [{"pointer_uri": "relay://attachments/scope_1/abcdef123456"}]},
},
},
),
lang="zh",
system_prompt="sys",
model=StaticTextChatModel("done"),
tools=ToolRegistry([]),
trace_id="trace-relay",
parent_span_id=None,
max_attempts=1,
),
)
started = [e for e in events if e.get("event_type") == "run_started"]
assert started
sp = started[0].get("payload") or {}
assert sp.get("relay_envelope_present") is True
assert sp.get("relay_envelope_pointer_count") == 1
att = [e for e in events if e.get("event_type") == "attempt_started"]
assert att
ap = att[0].get("payload") or {}
assert ap.get("relay_envelope_present") is True
assert ap.get("relay_envelope_pointer_count") == 1