-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathtest_resolve_cycle_llm.py
More file actions
128 lines (115 loc) · 4.5 KB
/
Copy pathtest_resolve_cycle_llm.py
File metadata and controls
128 lines (115 loc) · 4.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# SPDX-License-Identifier: Apache-2.0
# Copyright 2025 Provability-Fabric Contributors
from __future__ import annotations
import json
import os
import subprocess
import sys
import tempfile
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parent.parent
SCRIPT = REPO_ROOT / "experiments" / "scripts" / "resolve_cycle_llm.py"
def test_resolve_prints_model_from_manifest_when_env_empty():
with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False, encoding="utf-8") as f:
json.dump({"model": {"id": "gpt-4o"}}, f)
p = f.name
try:
env = {k: v for k, v in os.environ.items()}
env.pop("OPENHANDS_MODEL", None)
env["OPENHANDS_PROVIDER"] = "openai"
env["OPENAI_API_KEY"] = "sk-test"
r = subprocess.run(
[sys.executable, str(SCRIPT), p],
capture_output=True,
text=True,
env=env,
)
assert r.returncode == 0
assert r.stdout.strip() == "gpt-4o"
finally:
Path(p).unlink(missing_ok=True)
def test_prime_intellect_remaps_manifest_gpt_when_openhands_model_unset():
"""Bare gpt-* manifest defaults are a poor fit for Prime; cycle should substitute a vendor id."""
with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False, encoding="utf-8") as f:
json.dump({"model": {"id": "gpt-4o"}}, f)
p = f.name
try:
env = {k: v for k, v in os.environ.items()}
env.pop("OPENHANDS_MODEL", None)
env.pop("PF_PRIME_MANIFEST_FALLBACK_MODEL", None)
env["OPENHANDS_PROVIDER"] = "prime_intellect"
env["PRIME_INTELLECT_API_KEY"] = "pi-key"
r = subprocess.run(
[sys.executable, str(SCRIPT), p],
capture_output=True,
text=True,
env=env,
)
assert r.returncode == 0
assert r.stdout.strip() == "google/gemini-2.5-flash"
assert "Warning" in (r.stderr or "")
assert "OPENHANDS_MODEL unset" in (r.stderr or "")
finally:
Path(p).unlink(missing_ok=True)
def test_prime_intellect_keeps_vendor_qualified_manifest_when_env_unset():
with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False, encoding="utf-8") as f:
json.dump({"model": {"id": "google/gemini-2.5-flash"}}, f)
p = f.name
try:
env = {k: v for k, v in os.environ.items()}
env.pop("OPENHANDS_MODEL", None)
env["OPENHANDS_PROVIDER"] = "prime_intellect"
env["PRIME_INTELLECT_API_KEY"] = "pi-key"
r = subprocess.run(
[sys.executable, str(SCRIPT), p],
capture_output=True,
text=True,
env=env,
)
assert r.returncode == 0
assert r.stdout.strip() == "google/gemini-2.5-flash"
assert "OPENHANDS_MODEL unset" not in (r.stderr or "")
finally:
Path(p).unlink(missing_ok=True)
def test_prime_intellect_warns_but_keeps_explicit_bare_gpt_env():
with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False, encoding="utf-8") as f:
json.dump({"model": {"id": "gpt-4o"}}, f)
p = f.name
try:
env = {k: v for k, v in os.environ.items()}
env["OPENHANDS_MODEL"] = "gpt-4o-mini"
env["OPENHANDS_PROVIDER"] = "prime_intellect"
env["PRIME_INTELLECT_API_KEY"] = "pi-key"
r = subprocess.run(
[sys.executable, str(SCRIPT), p],
capture_output=True,
text=True,
env=env,
)
assert r.returncode == 0
assert r.stdout.strip() == "gpt-4o-mini"
assert "Warning" in (r.stderr or "")
assert "unqualified" in (r.stderr or "").lower()
finally:
Path(p).unlink(missing_ok=True)
def test_prime_intellect_allows_key_only_without_base_url():
with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False, encoding="utf-8") as f:
json.dump({"model": {"id": "meta-llama/Llama-3.1-8B-Instruct"}}, f)
p = f.name
try:
env = {k: v for k, v in os.environ.items()}
env.pop("OPENAI_BASE_URL", None)
env.pop("PRIME_INTELLECT_BASE_URL", None)
env["OPENHANDS_PROVIDER"] = "prime_intellect"
env["PRIME_INTELLECT_API_KEY"] = "pi-key"
env["OPENHANDS_MODEL"] = "m"
r = subprocess.run(
[sys.executable, str(SCRIPT), p],
capture_output=True,
text=True,
env=env,
)
assert r.returncode == 0
assert r.stdout.strip() == "m"
finally:
Path(p).unlink(missing_ok=True)