CBT / chat.py
Neithanvarvas's picture
[UPDATE] Add the matched 1D-RoPE twin (twin_1d/) and load(variant=...)
8414bb4 verified
Raw History Blame Contribute Delete
2.49 kB
#!/usr/bin/env python3
"""Terminal demo for CBT-18.95M. Sums like `123+456` go to the adder; anything else is a chat turn.
python chat.py # interactive
python chat.py "98765432109876+1234" # one prompt
python chat.py --online "Who was Ada Lovelace?"
python chat.py --variant twin_1d "31415926535897932384626433832795+27182818284590452353602874713527"
"""
import argparse
import functools
import re
from cbt import add, chat, execute_tool, load
SUM = re.compile(r"^\s*(\d+)\s*\+\s*(\d+)\s*=?\s*$")
def respond(model, tok, text: str, online: bool, show_raw: bool) -> None:
m = SUM.match(text)
if m:
r = add(model, tok, m.group(1), m.group(2))
print(f" scratchpad : {r['scratchpad']}")
print(f" answer : {r['answer']} [{'PASS' if r['correct'] else 'FAIL'}]")
else:
r = chat(model, tok, text, tool_executor=functools.partial(execute_tool, online=online))
for key in ("think", "call", "result", "answer"):
if r[key] is not None:
print(f" {key:<10} : {r[key]}")
if show_raw:
print(f" raw : {r['raw']}")
print()
def main() -> None:
p = argparse.ArgumentParser(description="CBT-18.95M terminal demo")
p.add_argument("prompt", nargs="?", help="single prompt; omit for interactive mode")
p.add_argument("--model", default=None, help="local folder or Hugging Face repo id (default: this folder)")
p.add_argument("--variant", default="cbt_2d", choices=["cbt_2d", "twin_1d"], help="released 2D model or its 1D-RoPE twin")
p.add_argument("--device", default=None, help="cpu or cuda (default: auto)")
p.add_argument("--online", action="store_true", help="let the search tool query Wikipedia")
p.add_argument("--raw", action="store_true", help="also print the raw token stream")
args = p.parse_args()
model, tok = load(args.model, args.device, args.variant)
if args.prompt:
respond(model, tok, args.prompt, args.online, args.raw)
return
print(f"CBT-18.95M ({args.variant}). Type a sum (e.g. 123456789+987654321) or a question. Ctrl-D to quit.\n")
while True:
try:
text = input("> ").strip()
except (EOFError, KeyboardInterrupt):
print()
break
if text.lower() in ("exit", "quit"):
break
if text:
respond(model, tok, text, args.online, args.raw)
if __name__ == "__main__":
main()