feat: stdout tracer

feature/stdout-breaker
hanchchch 1 year ago
parent 80282a47a2
commit b5f3187103

@ -103,3 +103,9 @@ class ANSI:
def to(self, *args: str):
self.args = list(args)
return self.wrap(self.text)
def dim_multiline(message: str) -> str:
return message.split("\n")[0] + ANSI(
"\n... ".join(["", *message.split("\n")[1:]])
).to(Color.black().bright())

@ -1,17 +1,11 @@
from typing import Any, Dict, List, Optional, Union
from ansi import ANSI, Color, Style
from ansi import ANSI, Color, Style, dim_multiline
from langchain.callbacks.base import BaseCallbackHandler
from langchain.schema import AgentAction, AgentFinish, LLMResult
from logger import logger
def dim_multiline(message: str) -> str:
return message.split("\n")[0] + ANSI(
"\n... ".join(["", *message.split("\n")[1:]])
).to(Color.black().bright())
class EVALCallbackHandler(BaseCallbackHandler):
def on_llm_start(
self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any

@ -2,8 +2,7 @@ import re
import time
from typing import Dict
from ansi import ANSI, Color, Style
from core.agents.callback import dim_multiline
from ansi import ANSI, Color, Style, dim_multiline
from core.prompts.input import EVAL_FORMAT_INSTRUCTIONS
from langchain.output_parsers.base import BaseOutputParser
from logger import logger

@ -1,4 +1,6 @@
import time
import subprocess
from datetime import datetime
from tempfile import TemporaryFile
from typing import Dict, List
@ -6,6 +8,7 @@ from core.tools.base import BaseToolSet, SessionGetter, ToolScope, tool
from core.tools.terminal.syscall import SyscallTracer
from env import settings
from logger import logger
from ansi import ANSI, Color, dim_multiline
class Terminal(BaseToolSet):
@ -33,13 +36,26 @@ class Terminal(BaseToolSet):
stderr=fp,
)
tracer = SyscallTracer(process.pid)
tracer.attach()
exitcode, reason = tracer.wait_until_stop_or_exit()
logger.debug(f"Stopped terminal execution: {exitcode} {reason}")
output = ""
last_stdout = datetime.now()
while True:
fp.seek(0)
new_output = fp.read().decode()
if new_output != output:
logger.info(
ANSI("Terminal Output").to(Color.magenta())
+ ": "
+ dim_multiline(new_output[len(output) :])
)
output = new_output
last_stdout = datetime.now()
if (datetime.now() - last_stdout).seconds > 10:
process.kill()
break
time.sleep(0.1)
fp.seek(0)
output = fp.read().decode()
except Exception as e:
output = str(e)

Loading…
Cancel
Save