Skip to content

Commit dc2e4f5

Browse files
committed
Add LLM research provider profile
1 parent 13e063c commit dc2e4f5

2 files changed

Lines changed: 208 additions & 0 deletions

File tree

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#!/usr/bin/env bash
2+
3+
llm_profile_is_true() {
4+
case "${1:-}" in
5+
1|true|TRUE|yes|YES|on|ON) return 0 ;;
6+
*) return 1 ;;
7+
esac
8+
}
9+
10+
llm_profile_set_default() {
11+
local name="$1"
12+
local value="$2"
13+
if llm_profile_is_true "${LLM_RESEARCH_PROFILE_FORCE:-0}" || [[ -z "${!name:-}" ]]; then
14+
export "$name=$value"
15+
fi
16+
}
17+
18+
llm_profile_set_role() {
19+
local key_name="$1"
20+
local model_name="$2"
21+
local base_url_name="$3"
22+
local api_mode_name="$4"
23+
local model_value="$5"
24+
local base_url_value="$6"
25+
local api_mode_value="$7"
26+
[[ -n "${!key_name:-}" ]] || return 0
27+
llm_profile_set_default "$model_name" "$model_value"
28+
llm_profile_set_default "$base_url_name" "$base_url_value"
29+
llm_profile_set_default "$api_mode_name" "$api_mode_value"
30+
}
31+
32+
llm_profile_print_summary() {
33+
llm_profile_is_true "${LLM_RESEARCH_PROFILE_VERBOSE:-0}" || return 0
34+
{
35+
echo "llm_research_profile profile=${LLM_RESEARCH_PROFILE:-balanced}"
36+
echo "llm_provider role=primary model=${OPENAI_MODEL:-} api_mode=${OPENAI_API_MODE:-} base_url=${OPENAI_BASE_URL:-}"
37+
echo "llm_provider role=secondary model=${OPENAI_SECONDARY_MODEL:-} api_mode=${OPENAI_SECONDARY_API_MODE:-} base_url=${OPENAI_SECONDARY_BASE_URL:-}"
38+
echo "llm_provider role=backup model=${OPENAI_BACKUP_MODEL:-} api_mode=${OPENAI_BACKUP_API_MODE:-} base_url=${OPENAI_BACKUP_BASE_URL:-}"
39+
echo "llm_provider role=fallback model=${OPENAI_FALLBACK_MODEL:-} api_mode=${OPENAI_FALLBACK_API_MODE:-} base_url=${OPENAI_FALLBACK_BASE_URL:-}"
40+
} >&2
41+
}
42+
43+
llm_research_profile="${LLM_RESEARCH_PROFILE:-balanced}"
44+
case "$llm_research_profile" in
45+
off|none|disabled|0)
46+
return 0 2>/dev/null || exit 0
47+
;;
48+
balanced)
49+
llm_profile_set_role OPENAI_API_KEY OPENAI_MODEL OPENAI_BASE_URL OPENAI_API_MODE \
50+
"deepseek-v3-2-251201" "https://windhub.cc/v1" "messages"
51+
;;
52+
semantic)
53+
llm_profile_set_role OPENAI_API_KEY OPENAI_MODEL OPENAI_BASE_URL OPENAI_API_MODE \
54+
"doubao-seed-1-8-251228" "https://windhub.cc/v1" "messages"
55+
;;
56+
*)
57+
echo "unsupported LLM_RESEARCH_PROFILE: $llm_research_profile" >&2
58+
return 2 2>/dev/null || exit 2
59+
;;
60+
esac
61+
62+
llm_profile_set_role OPENAI_SECONDARY_API_KEY OPENAI_SECONDARY_MODEL OPENAI_SECONDARY_BASE_URL OPENAI_SECONDARY_API_MODE \
63+
"gemini-3.1-pro-preview" "https://api.xn--chy-js0fk50c.top/v1" "chat"
64+
llm_profile_set_role OPENAI_BACKUP_API_KEY OPENAI_BACKUP_MODEL OPENAI_BACKUP_BASE_URL OPENAI_BACKUP_API_MODE \
65+
"longcat-flash-chat" "https://elysiver.h-e.top/v1" "chat"
66+
llm_profile_set_role OPENAI_FALLBACK_API_KEY OPENAI_FALLBACK_MODEL OPENAI_FALLBACK_BASE_URL OPENAI_FALLBACK_API_MODE \
67+
"gpt-5.4" "https://api.wwcloud.app" "responses"
68+
69+
llm_profile_print_summary

tests/test_llm_research_profile.py

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
import os
2+
import subprocess
3+
from pathlib import Path
4+
5+
6+
ROOT = Path(__file__).resolve().parents[1]
7+
LOADER = ROOT / "scripts" / "load_llm_research_profile.sh"
8+
9+
10+
def run_loader(env):
11+
command = (
12+
"set -euo pipefail; "
13+
f"source {LOADER}; "
14+
"printf 'OPENAI_MODEL=%s\\n' \"${OPENAI_MODEL-}\"; "
15+
"printf 'OPENAI_BASE_URL=%s\\n' \"${OPENAI_BASE_URL-}\"; "
16+
"printf 'OPENAI_API_MODE=%s\\n' \"${OPENAI_API_MODE-}\"; "
17+
"printf 'OPENAI_SECONDARY_MODEL=%s\\n' \"${OPENAI_SECONDARY_MODEL-}\"; "
18+
"printf 'OPENAI_SECONDARY_BASE_URL=%s\\n' \"${OPENAI_SECONDARY_BASE_URL-}\"; "
19+
"printf 'OPENAI_SECONDARY_API_MODE=%s\\n' \"${OPENAI_SECONDARY_API_MODE-}\"; "
20+
"printf 'OPENAI_BACKUP_MODEL=%s\\n' \"${OPENAI_BACKUP_MODEL-}\"; "
21+
"printf 'OPENAI_BACKUP_BASE_URL=%s\\n' \"${OPENAI_BACKUP_BASE_URL-}\"; "
22+
"printf 'OPENAI_BACKUP_API_MODE=%s\\n' \"${OPENAI_BACKUP_API_MODE-}\"; "
23+
"printf 'OPENAI_FALLBACK_MODEL=%s\\n' \"${OPENAI_FALLBACK_MODEL-}\"; "
24+
"printf 'OPENAI_FALLBACK_BASE_URL=%s\\n' \"${OPENAI_FALLBACK_BASE_URL-}\"; "
25+
"printf 'OPENAI_FALLBACK_API_MODE=%s\\n' \"${OPENAI_FALLBACK_API_MODE-}\""
26+
)
27+
clean_env = {
28+
"PATH": os.environ.get("PATH", ""),
29+
"OPENAI_API_KEY": "primary-key",
30+
"OPENAI_SECONDARY_API_KEY": "secondary-key",
31+
"OPENAI_BACKUP_API_KEY": "backup-key",
32+
"OPENAI_FALLBACK_API_KEY": "fallback-key",
33+
**env,
34+
}
35+
result = subprocess.run(
36+
["/bin/bash", "-lc", command],
37+
cwd=ROOT,
38+
env=clean_env,
39+
text=True,
40+
capture_output=True,
41+
check=True,
42+
)
43+
return dict(line.split("=", 1) for line in result.stdout.strip().splitlines())
44+
45+
46+
def test_balanced_profile_exports_benchmark_provider_order():
47+
values = run_loader({})
48+
49+
assert values["OPENAI_MODEL"] == "deepseek-v3-2-251201"
50+
assert values["OPENAI_BASE_URL"] == "https://windhub.cc/v1"
51+
assert values["OPENAI_API_MODE"] == "messages"
52+
assert values["OPENAI_SECONDARY_MODEL"] == "gemini-3.1-pro-preview"
53+
assert values["OPENAI_SECONDARY_BASE_URL"] == "https://api.xn--chy-js0fk50c.top/v1"
54+
assert values["OPENAI_SECONDARY_API_MODE"] == "chat"
55+
assert values["OPENAI_BACKUP_MODEL"] == "longcat-flash-chat"
56+
assert values["OPENAI_BACKUP_BASE_URL"] == "https://elysiver.h-e.top/v1"
57+
assert values["OPENAI_BACKUP_API_MODE"] == "chat"
58+
assert values["OPENAI_FALLBACK_MODEL"] == "gpt-5.4"
59+
assert values["OPENAI_FALLBACK_BASE_URL"] == "https://api.wwcloud.app"
60+
assert values["OPENAI_FALLBACK_API_MODE"] == "responses"
61+
62+
63+
def test_semantic_profile_uses_high_recall_primary_only():
64+
values = run_loader({"LLM_RESEARCH_PROFILE": "semantic"})
65+
66+
assert values["OPENAI_MODEL"] == "doubao-seed-1-8-251228"
67+
assert values["OPENAI_BASE_URL"] == "https://windhub.cc/v1"
68+
assert values["OPENAI_API_MODE"] == "messages"
69+
assert values["OPENAI_BACKUP_MODEL"] == "longcat-flash-chat"
70+
71+
72+
def test_loader_preserves_explicit_values_without_force():
73+
values = run_loader(
74+
{
75+
"OPENAI_MODEL": "manual-model",
76+
"OPENAI_BASE_URL": "https://manual.example/v1",
77+
"OPENAI_API_MODE": "chat",
78+
}
79+
)
80+
81+
assert values["OPENAI_MODEL"] == "manual-model"
82+
assert values["OPENAI_BASE_URL"] == "https://manual.example/v1"
83+
assert values["OPENAI_API_MODE"] == "chat"
84+
85+
86+
def test_force_replaces_explicit_values():
87+
values = run_loader(
88+
{
89+
"LLM_RESEARCH_PROFILE_FORCE": "1",
90+
"OPENAI_MODEL": "manual-model",
91+
"OPENAI_BASE_URL": "https://manual.example/v1",
92+
"OPENAI_API_MODE": "chat",
93+
}
94+
)
95+
96+
assert values["OPENAI_MODEL"] == "deepseek-v3-2-251201"
97+
assert values["OPENAI_BASE_URL"] == "https://windhub.cc/v1"
98+
assert values["OPENAI_API_MODE"] == "messages"
99+
100+
101+
def test_off_profile_makes_no_changes():
102+
values = run_loader({"LLM_RESEARCH_PROFILE": "off"})
103+
104+
assert all(value == "" for value in values.values())
105+
106+
107+
def test_missing_role_key_skips_that_role():
108+
values = run_loader({"OPENAI_BACKUP_API_KEY": ""})
109+
110+
assert values["OPENAI_MODEL"] == "deepseek-v3-2-251201"
111+
assert values["OPENAI_BACKUP_MODEL"] == ""
112+
assert values["OPENAI_BACKUP_BASE_URL"] == ""
113+
assert values["OPENAI_BACKUP_API_MODE"] == ""
114+
115+
116+
def test_verbose_output_does_not_print_keys():
117+
env = {
118+
"PATH": os.environ.get("PATH", ""),
119+
"OPENAI_API_KEY": "primary-secret",
120+
"OPENAI_SECONDARY_API_KEY": "secondary-secret",
121+
"OPENAI_BACKUP_API_KEY": "backup-secret",
122+
"OPENAI_FALLBACK_API_KEY": "fallback-secret",
123+
"LLM_RESEARCH_PROFILE_VERBOSE": "1",
124+
}
125+
result = subprocess.run(
126+
["/bin/bash", "-lc", f"source {LOADER}"],
127+
cwd=ROOT,
128+
env=env,
129+
text=True,
130+
capture_output=True,
131+
check=True,
132+
)
133+
134+
combined = result.stdout + result.stderr
135+
assert "primary-secret" not in combined
136+
assert "secondary-secret" not in combined
137+
assert "backup-secret" not in combined
138+
assert "fallback-secret" not in combined
139+
assert "deepseek-v3-2-251201" in combined

0 commit comments

Comments
 (0)