Add OpenCode TensorX experiment adapter
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
import importlib.util
|
||||
import json
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
ADAPTER_PATH = Path(__file__).with_name("opencode-tensorx-adapter.py")
|
||||
SPEC = importlib.util.spec_from_file_location("opencode_tensorx_adapter", ADAPTER_PATH)
|
||||
ADAPTER = importlib.util.module_from_spec(SPEC)
|
||||
SPEC.loader.exec_module(ADAPTER)
|
||||
|
||||
|
||||
class OpenCodeTensorXAdapterTests(unittest.TestCase):
|
||||
def test_model_reference_keeps_upstream_slashes(self):
|
||||
self.assertEqual(
|
||||
(
|
||||
"tensorx/qwen/qwen3.8-flash-next",
|
||||
"qwen/qwen3.8-flash-next",
|
||||
),
|
||||
ADAPTER.normalize_model("qwen/qwen3.8-flash-next"),
|
||||
)
|
||||
self.assertEqual(
|
||||
(
|
||||
"tensorx/qwen/qwen3.8-flash-next",
|
||||
"qwen/qwen3.8-flash-next",
|
||||
),
|
||||
ADAPTER.normalize_model("tensorx/qwen/qwen3.8-flash-next"),
|
||||
)
|
||||
|
||||
def test_custom_mode_translates_agents_and_restricts_delegation(self):
|
||||
base = {
|
||||
"provider": {
|
||||
"tensorx": {
|
||||
"models": {"qwen/qwen3.8-flash-next": {"name": "Qwen"}}
|
||||
}
|
||||
}
|
||||
}
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
temp = Path(temp_dir)
|
||||
root = temp / "root"
|
||||
output = root / "run" / "Ergebnisse"
|
||||
root.mkdir()
|
||||
output.mkdir(parents=True)
|
||||
agents = temp / "agents.json"
|
||||
agents.write_text(
|
||||
json.dumps(
|
||||
{
|
||||
"reviewer": {
|
||||
"description": "Prueft Fakten",
|
||||
"prompt": "Pruefe nur die zugewiesenen Fakten.",
|
||||
}
|
||||
}
|
||||
),
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
config = ADAPTER.build_run_config(
|
||||
base,
|
||||
"tensorx/qwen/qwen3.8-flash-next",
|
||||
"qwen/qwen3.8-flash-next",
|
||||
"custom",
|
||||
root,
|
||||
output,
|
||||
agents,
|
||||
)
|
||||
|
||||
self.assertEqual("allow", config["permission"]["task"]["reviewer"])
|
||||
self.assertEqual("deny", config["permission"]["task"]["*"])
|
||||
self.assertEqual("subagent", config["agent"]["reviewer"]["mode"])
|
||||
self.assertEqual(
|
||||
"tensorx/qwen/qwen3.8-flash-next",
|
||||
config["agent"]["reviewer"]["model"],
|
||||
)
|
||||
self.assertEqual("deny", config["agent"]["reviewer"]["permission"]["task"])
|
||||
self.assertIn(
|
||||
ADAPTER.normalized_path(output) + "/**",
|
||||
config["permission"]["edit"],
|
||||
)
|
||||
self.assertIn(
|
||||
"run/Ergebnisse/**",
|
||||
config["permission"]["edit"],
|
||||
)
|
||||
|
||||
def test_output_permissions_include_parent_relative_worktree_path(self):
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
temp = Path(temp_dir)
|
||||
root = temp / "QuellCode" / "Product"
|
||||
output = temp / "Versuche" / "Lauf" / "Ergebnisse"
|
||||
root.mkdir(parents=True)
|
||||
output.mkdir(parents=True)
|
||||
|
||||
patterns = ADAPTER.output_permission_patterns(root, output, temp)
|
||||
|
||||
self.assertIn("Versuche/Lauf/Ergebnisse/**", patterns)
|
||||
self.assertIn("../../Versuche/Lauf/Ergebnisse", patterns)
|
||||
self.assertIn("../../Versuche/Lauf/Ergebnisse/**", patterns)
|
||||
self.assertIn(ADAPTER.normalized_path(output) + "/**", patterns)
|
||||
|
||||
def test_normalize_result_uses_exported_metrics_and_tool_calls(self):
|
||||
session = {
|
||||
"info": {
|
||||
"id": "ses_test",
|
||||
"version": "1.18.25",
|
||||
"model": {
|
||||
"id": "qwen/qwen3.8-flash-next",
|
||||
"providerID": "tensorx",
|
||||
},
|
||||
"tokens": {
|
||||
"input": 100,
|
||||
"output": 10,
|
||||
"reasoning": 5,
|
||||
"cache": {"read": 20, "write": 0},
|
||||
},
|
||||
"cost": 0.1,
|
||||
},
|
||||
"messages": [
|
||||
{
|
||||
"info": {"role": "assistant", "finish": "stop"},
|
||||
"parts": [
|
||||
{
|
||||
"type": "tool",
|
||||
"tool": "task",
|
||||
"state": {
|
||||
"status": "completed",
|
||||
"input": {
|
||||
"subagent_type": "reviewer",
|
||||
"description": "Pruefen",
|
||||
},
|
||||
},
|
||||
},
|
||||
{"type": "text", "text": "Fertig"},
|
||||
],
|
||||
}
|
||||
],
|
||||
}
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
output = Path(temp_dir)
|
||||
(output / "StRS.md").write_text("Inhalt", encoding="utf-8")
|
||||
result = ADAPTER.normalize_result(
|
||||
session=session,
|
||||
events=[],
|
||||
model_ref="tensorx/qwen/qwen3.8-flash-next",
|
||||
mode="custom",
|
||||
effort="low",
|
||||
exit_code=0,
|
||||
timed_out=False,
|
||||
interrupted=False,
|
||||
duration_s=1.5,
|
||||
output_dir=output,
|
||||
errors=[],
|
||||
)
|
||||
|
||||
self.assertFalse(result["is_error"])
|
||||
self.assertEqual(135, result["usage"]["total_tokens"])
|
||||
self.assertEqual(1, result["tool_call_count"])
|
||||
self.assertEqual(1, result["subagent_stats"]["spawned"])
|
||||
self.assertEqual({"reviewer": 1}, result["subagent_stats"]["by_type"])
|
||||
self.assertEqual("Fertig", result["result"])
|
||||
self.assertEqual(1, len(result["written_files"]))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user