feat: --verbose flag, lazy mykeys loading, temperature config support

- agentmain: add --verbose arg for subagent monitoring mode
- llmcore: lazy-load mykeys/proxies via module __getattr__
- llmcore: fix auto_make_url regex for trailing slash cases
- llmcore: support temperature override from session config
- docs: update subagent.md with --verbose usage note
This commit is contained in:
Liang Jiaqing
2026-04-12 14:29:32 +08:00
parent 9e03a675ae
commit 2b5cbff7be
4 changed files with 21 additions and 15 deletions

View File

@@ -10,9 +10,14 @@ def _load_mykeys():
if not os.path.exists(p): raise Exception('[ERROR] mykey.py or mykey.json not found, please create one from mykey_template.')
with open(p, encoding='utf-8') as f: return json.load(f)
mykeys = _load_mykeys()
proxy = mykeys.get("proxy", 'http://127.0.0.1:2082')
proxies = {"http": proxy, "https": proxy} if proxy else None
def __getattr__(name):
if name in ('mykeys', 'proxies'):
mk = _load_mykeys()
proxy = mk.get("proxy", 'http://127.0.0.1:2082')
px = {"http": proxy, "https": proxy} if proxy else None
globals().update(mykeys=mk, proxies=px)
return globals()[name]
raise AttributeError(f"module 'llmcore' has no attribute {name}")
def compress_history_tags(messages, keep_recent=10, max_len=800, force=False):
"""Compress <thinking>/<tool_use>/<tool_result> tags in older messages to save tokens."""
@@ -61,8 +66,7 @@ def _sanitize_leading_user_msg(msg):
if isinstance(c, list): # content 本身也可能是 list[{type:text,text:...}]
texts.extend(b.get('text', '') for b in c if isinstance(b, dict))
else: texts.append(str(c))
elif block.get('type') == 'text':
texts.append(block.get('text', ''))
elif block.get('type') == 'text': texts.append(block.get('text', ''))
msg['content'] = [{"type": "text", "text": '\n'.join(t for t in texts if t)}]
return msg
@@ -83,7 +87,8 @@ def trim_messages_history(history, context_win):
def auto_make_url(base, path):
b, p = base.rstrip('/'), path.strip('/')
if b.endswith('$'): return b[:-1].rstrip('/')
return b if b.endswith(p) else f"{b}/{p}" if re.search(r'/v\d+$', b) else f"{b}/v1/{p}"
if b.endswith(p): return b
return f"{b}/{p}" if re.search(r'/v\d+(/|$)', b) else f"{b}/v1/{p}"
def build_multimodal_content(prompt_text, image_paths):
parts = []
@@ -439,6 +444,7 @@ class BaseSession:
if effort and not self.reasoning_effort: print(f"[WARN] Invalid reasoning_effort {effort!r}, ignored.")
mode = str(cfg.get('api_mode', 'chat_completions')).strip().lower().replace('-', '_')
self.api_mode = 'responses' if mode in ('responses', 'response') else 'chat_completions'
self.temperature = cfg.get('temperature')
def ask(self, prompt, stream=False):
def _ask_gen():
content = ''
@@ -519,6 +525,7 @@ class NativeClaudeSession(BaseSession):
def raw_ask(self, messages, temperature=0.5, max_tokens=6144):
messages = _fix_messages(messages)
model = self.default_model
if self.temperature is not None: temperature = self.temperature
beta_parts = ["claude-code-20250219", "interleaved-thinking-2025-05-14", "redact-thinking-2026-02-12", "prompt-caching-scope-2026-01-05"]
if "[1m]" in model.lower():
beta_parts.insert(1, "context-1m-2025-08-07"); model = model.replace("[1m]", "").replace("[1M]", "")
@@ -553,7 +560,6 @@ class NativeClaudeSession(BaseSession):
self.history.append(msg)
trim_messages_history(self.history, self.context_win)
messages = [{"role": m["role"], "content": list(m["content"])} for m in self.history]
content_blocks = None
gen = self.raw_ask(messages)
try:
@@ -580,8 +586,8 @@ class NativeOAISession(NativeClaudeSession):
"""OpenAI streaming. yields text chunks, generator return = list[content_block]"""
msgs = ([{"role": "system", "content": self.system}] if self.system else []) + _msgs_claude2oai(messages)
return (yield from _openai_stream(self.api_base, self.api_key, msgs, self.default_model, self.api_mode,
temperature=temperature, max_tokens=max_tokens, tools=self.tools,
reasoning_effort=self.reasoning_effort,
temperature=temperature, max_tokens=max_tokens,
tools=self.tools, reasoning_effort=self.reasoning_effort,
max_retries=self.max_retries, connect_timeout=self.connect_timeout,
read_timeout=self.read_timeout, proxies=self.proxies))
@@ -591,10 +597,8 @@ def openai_tools_to_claude(tools):
for t in tools:
if 'input_schema' in t: result.append(t); continue # 已是claude格式
fn = t.get('function', t)
result.append({
'name': fn['name'], 'description': fn.get('description', ''),
'input_schema': fn.get('parameters', {'type': 'object', 'properties': {}})
})
result.append({'name': fn['name'], 'description': fn.get('description', ''),
'input_schema': fn.get('parameters', {'type': 'object', 'properties': {}})})
return result