def on_task_exception(self): logger.exception("An internal error occurred in the application") toast_msg = ("应用发生内部错误" if "zh" in session_info.user_language else "An internal error occurred in the application") e_type, e_value, e_tb = sys.exc_info() lines = traceback.format_exception(e_type, e_value, e_tb) traceback_msg = "".join(lines) traceback_console = Console(color_system="truecolor", tab_size=2, record=True, width=90) with traceback_console.capture(): # prevent logging to stdout again traceback_console.print_exception(word_wrap=True, extra_lines=1, show_locals=True) if State.theme == "dark": theme = DARK_TERMINAL_THEME else: theme = LIGHT_TERMINAL_THEME html = traceback_console.export_html(theme=theme, code_format=TRACEBACK_CODE_FORMAT, inline_styles=True) try: popup(title=toast_msg, content=put_html(html), size=PopupSize.LARGE) run_js( "console.error(traceback_msg)", traceback_msg="Internal Server Error\n" + traceback_msg, ) except Exception: pass
def generate( self, prompt: str = "", temperature: float = 0.7, max_tokens: int = 32, stop: str = "", model: str = "davinci", bg: tuple = (31, 36, 40), accent: tuple = (0, 64, 0), pngquant: bool = False, output_txt: str = None, output_img: str = None, include_prompt: bool = True, include_coloring: bool = True, watermark: str = "Generated using GPT-3 via OpenAI's API", ): assert isinstance(stop, str), "stop is not a str." data = { "prompt": prompt, "max_tokens": max_tokens, "temperature": temperature, "stop": stop, "stream": True, "logprobs": 1, } console = Console(record=True) console.clear() if include_prompt: prompt_text = Text(prompt, style="bold", end="") console.print(prompt_text, end="") with httpx.stream( "POST", f"https://api.openai.com/v1/engines/{model}/completions", headers=self.headers, data=json.dumps(data), timeout=None, ) as r: for chunk in r.iter_text(): text = chunk[6:] # JSON chunks are prepended with "data: " if len(text) < 10 and "[DONE]" in text: break temp_token = None logprobs = json.loads(text)["choices"][0]["logprobs"] tokens = logprobs["tokens"] token_logprobs = logprobs["token_logprobs"] for i in range(len(tokens)): token = tokens[i] log_prob = token_logprobs[i] if token == stop or token == "<|endoftext|>": break if token.startswith("bytes:") and not temp_token: # We need to hold the 2-byte token to the next 1-byte token # to get the full bytestring to decode # # The API-returned tokens are in the form: # "bytes:\xe2\x80" and "bytes:\x9d" temp_token = token[6:] temp_prob = log_prob else: if temp_token: bytestring = temp_token + token[6:] # https://stackoverflow.com/a/37059682/9314418 token = codecs.escape_decode(bytestring, "utf-8")[0].decode( "utf-8" ) temp_token = None log_prob = temp_prob # the true prob is the first one text = Text( token, style=f"on {self.derive_token_bg(log_prob, bg, accent, include_coloring,)}", end="", ) console.print(text, end="") # Export the generated text as HTML. raw_html = self.replace_hex_colors( console.export_html(inline_styles=True, code_format="{code}", clear=False) ) # Render the HTML as an image prompt_hash = hashlib.sha256(bytes(prompt, "utf-8")).hexdigest()[0:8] temp_string = str(temperature).replace(".", "_") timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") if output_img: img_file_name = output_img else: if not os.path.exists("img_output"): os.makedirs("img_output") img_file_name = f"img_output/{timestamp}__{prompt_hash}__{temp_string}.png" if self.imgmaker: self.imgmaker.generate( "dark.html", { "html": raw_html.replace("\n", "</br>"), "accent": f"rgb({accent[0]},{accent[1]},{accent[2]})", "watermark": watermark, }, width=450, height=600, downsample=False, output_file=img_file_name, use_pngquant=pngquant, ) # Save the generated text to a plain-text file if output_txt: txt_file_name = output_txt else: if not os.path.exists("txt_output"): os.makedirs("txt_output") txt_file_name = f"txt_output/{prompt_hash}__{temp_string}.txt" with open(txt_file_name, "a", encoding="utf-8") as f: f.write(console.export_text() + "\n" + "=" * 20 + "\n") console.line()
def test_export_html_inline(): console = Console(record=True, width=100) console.print("[b]foo [link=https://example.org]Click[/link]") html = console.export_html(inline_styles=True) expected = '<!DOCTYPE html>\n<head>\n<style>\n\nbody {\n color: #000000;\n background-color: #ffffff;\n}\n</style>\n</head>\n<html>\n<body>\n <code>\n <pre style="font-family:Menlo,\'DejaVu Sans Mono\',consolas,\'Courier New\',monospace"><span style="font-weight: bold">foo </span><a href="https://example.org"><span style="font-weight: bold">Click</span></a>\n</pre>\n </code>\n</body>\n</html>\n' assert html == expected
def test_export_html_inline(): console = Console(record=True, width=100) console.print("[b]foo") html = console.export_html(inline_styles=True) expected = "<!DOCTYPE html>\n<head>\n<style>\n\nbody {\n color: #000000;\n background-color: #ffffff;\n}\n</style>\n</head>\n<html>\n<body>\n <code>\n <pre style=\"font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">foo</span>\n</pre>\n </code>\n</body>\n</html>\n" assert html == expected
Style(color="bright_blue"), "markdown.link_url": Style(color="blue"), } if __name__ == "__main__": # pragma: no cover import argparse import io from rich.console import Console from rich.table import Table from rich.text import Text parser = argparse.ArgumentParser() parser.add_argument("--html", action="store_true", help="Export as HTML table") args = parser.parse_args() html: bool = args.html console = Console(record=True, width=70, file=io.StringIO()) if html else Console() table = Table("Name", "Styling") for style_name, style in DEFAULT_STYLES.items(): table.add_row(Text(style_name, style=style), str(style)) console.print(table) if html: print(console.export_html(inline_styles=True))
print_table() # Get console output as text file1 = "table_export_plaintext.txt" text = console.export_text() with open(file1, "w") as file: file.write(text) print(f"Exported console output as plain text to {file1}") # Calling print_table again because console output buffer # is flushed once export function is called print_table() # Get console output as html # use clear=False so output is not flushed after export file2 = "table_export_html.html" html = console.export_html(clear=False) with open(file2, "w") as file: file.write(html) print(f"Exported console output as html to {file2}") # Export text output to table_export.txt file3 = "table_export_plaintext2.txt" console.save_text(file3, clear=False) print(f"Exported console output as plain text to {file3}") # Export html output to table_export.html file4 = "table_export_html2.html" console.save_html(file4) print(f"Exported console output as html to {file4}")