fix: empty file ZeroDivisionError in file_read; remove SiderLLMSession; init global_mem with header
This commit is contained in:
@@ -5,7 +5,7 @@ if sys.stderr is None: sys.stderr = open(os.devnull, "w")
|
|||||||
elif hasattr(sys.stderr, 'reconfigure'): sys.stderr.reconfigure(errors='replace')
|
elif hasattr(sys.stderr, 'reconfigure'): sys.stderr.reconfigure(errors='replace')
|
||||||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
||||||
|
|
||||||
from llmcore import SiderLLMSession, LLMSession, ToolClient, ClaudeSession, MixinSession, NativeToolClient, NativeClaudeSession, NativeOAISession
|
from llmcore import LLMSession, ToolClient, ClaudeSession, MixinSession, NativeToolClient, NativeClaudeSession, NativeOAISession
|
||||||
from agent_loop import agent_runner_loop
|
from agent_loop import agent_runner_loop
|
||||||
from ga import GenericAgentHandler, smart_format, get_global_memory, format_error, consume_file
|
from ga import GenericAgentHandler, smart_format, get_global_memory, format_error, consume_file
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ load_tool_schema()
|
|||||||
mem_dir = os.path.join(script_dir, 'memory')
|
mem_dir = os.path.join(script_dir, 'memory')
|
||||||
if not os.path.exists(mem_dir): os.makedirs(mem_dir)
|
if not os.path.exists(mem_dir): os.makedirs(mem_dir)
|
||||||
mem_txt = os.path.join(mem_dir, 'global_mem.txt')
|
mem_txt = os.path.join(mem_dir, 'global_mem.txt')
|
||||||
if not os.path.exists(mem_txt): open(mem_txt, 'w', encoding='utf-8').write('')
|
if not os.path.exists(mem_txt): open(mem_txt, 'w', encoding='utf-8').write('# [Global Memory - L2]\n')
|
||||||
mem_insight = os.path.join(mem_dir, 'global_mem_insight.txt')
|
mem_insight = os.path.join(mem_dir, 'global_mem_insight.txt')
|
||||||
if not os.path.exists(mem_insight):
|
if not os.path.exists(mem_insight):
|
||||||
t = os.path.join(script_dir, 'assets/global_mem_insight_template.txt')
|
t = os.path.join(script_dir, 'assets/global_mem_insight_template.txt')
|
||||||
@@ -50,8 +50,6 @@ class GeneraticAgent:
|
|||||||
elif 'native' in k and 'oai' in k: llm_sessions += [NativeToolClient(NativeOAISession(cfg=cfg))]
|
elif 'native' in k and 'oai' in k: llm_sessions += [NativeToolClient(NativeOAISession(cfg=cfg))]
|
||||||
elif 'claude' in k: llm_sessions += [ToolClient(ClaudeSession(cfg=cfg))]
|
elif 'claude' in k: llm_sessions += [ToolClient(ClaudeSession(cfg=cfg))]
|
||||||
elif 'oai' in k: llm_sessions += [ToolClient(LLMSession(cfg=cfg))]
|
elif 'oai' in k: llm_sessions += [ToolClient(LLMSession(cfg=cfg))]
|
||||||
elif 'sider' in k: llm_sessions += [ToolClient(SiderLLMSession(cfg={'apikey': cfg, 'model': x})) for x in \
|
|
||||||
["gemini-3.0-flash", "gpt-5.4"]]
|
|
||||||
elif 'mixin' in k: llm_sessions += [{'mixin_cfg': cfg}]
|
elif 'mixin' in k: llm_sessions += [{'mixin_cfg': cfg}]
|
||||||
except: pass
|
except: pass
|
||||||
for i, s in enumerate(llm_sessions):
|
for i, s in enumerate(llm_sessions):
|
||||||
|
|||||||
2
ga.py
2
ga.py
@@ -243,7 +243,7 @@ def file_read(path, start=1, keyword=None, count=200, show_linenos=True):
|
|||||||
else: return f"Keyword '{keyword}' not found after line {start}. Falling back to content from line {start}:\n\n" \
|
else: return f"Keyword '{keyword}' not found after line {start}. Falling back to content from line {start}:\n\n" \
|
||||||
+ file_read(path, start, None, count, show_linenos)
|
+ file_read(path, start, None, count, show_linenos)
|
||||||
else: res = list(itertools.islice(stream, count))
|
else: res = list(itertools.islice(stream, count))
|
||||||
realcnt = len(res); L_MAX = min(max(100, 256000//realcnt), 8000); TAG = " ... [TRUNCATED]"
|
realcnt = len(res); L_MAX = min(max(100, 256000//max(realcnt,1)), 8000); TAG = " ... [TRUNCATED]"
|
||||||
remaining = sum(1 for _ in itertools.islice(stream, 5000))
|
remaining = sum(1 for _ in itertools.islice(stream, 5000))
|
||||||
total_lines = (res[0][0] - 1 if res else start - 1) + realcnt + remaining
|
total_lines = (res[0][0] - 1 if res else start - 1) + realcnt + remaining
|
||||||
total_tag = "[FILE] Total " + (f"{total_lines}+" if remaining >= 5000 else str(total_lines)) + ' lines\n'
|
total_tag = "[FILE] Total " + (f"{total_lines}+" if remaining >= 5000 else str(total_lines)) + ' lines\n'
|
||||||
|
|||||||
14
llmcore.py
14
llmcore.py
@@ -91,20 +91,6 @@ def auto_make_url(base, path):
|
|||||||
if b.endswith(p): return b
|
if b.endswith(p): return b
|
||||||
return f"{b}/{p}" if re.search(r'/v\d+(/|$)', b) else f"{b}/v1/{p}"
|
return f"{b}/{p}" if re.search(r'/v\d+(/|$)', b) else f"{b}/v1/{p}"
|
||||||
|
|
||||||
class SiderLLMSession:
|
|
||||||
def __init__(self, cfg):
|
|
||||||
from sider_ai_api import Session # 不使用sider的话没必要安装这个包
|
|
||||||
self._core = Session(cookie=cfg['apikey'], proxies=proxies)
|
|
||||||
self.model = cfg.get('model', 'gemini-3.0-flash')
|
|
||||||
def ask(self, prompt, stream=False):
|
|
||||||
model = self.model
|
|
||||||
if len(prompt) > 28000:
|
|
||||||
print(f"[Warn] Prompt too long ({len(prompt)} chars), truncating.")
|
|
||||||
prompt = prompt[-28000:]
|
|
||||||
full_text = self._core.chat(prompt, model, stream=False)
|
|
||||||
if stream: return iter([full_text]) # gen有奇怪的空回复或死循环行为,sider足够快
|
|
||||||
return full_text
|
|
||||||
|
|
||||||
def _parse_claude_sse(resp_lines):
|
def _parse_claude_sse(resp_lines):
|
||||||
"""Parse Anthropic SSE stream. Yields text chunks, returns list[content_block]."""
|
"""Parse Anthropic SSE stream. Yields text chunks, returns list[content_block]."""
|
||||||
content_blocks = []; current_block = None; tool_json_buf = ""
|
content_blocks = []; current_block = None; tool_json_buf = ""
|
||||||
|
|||||||
Reference in New Issue
Block a user