CODELOCK-8Bbeta / scripts /interactive_demo.py
CODELOCKHF's picture
Release v0.2: multichannel affect engine and calibrated vectors
031e289
Raw History Blame Contribute Delete
2.01 kB
"""Interactive four-channel session: /event NAME [INTENSITY], /wait SECONDS, /state."""
import argparse
import json
from codelock_affect import AffectEngine, ProjectConfig
from codelock_affect.model import load
from codelock_affect.session import AffectSession
from codelock_affect.vectors import VectorBank
def main():
p = argparse.ArgumentParser(description=__doc__)
p.add_argument("--model")
p.add_argument("--config", default="configs/default.json")
p.add_argument("--bank", default="vectors/multichannel")
p.add_argument("--state-only", action="store_true")
args = p.parse_args()
config = ProjectConfig.load(args.config)
engine = AffectEngine(config)
if not args.state_only:
model, tok = load(args.model or config.model)
session = AffectSession(model, tok, VectorBank.load(args.bank), engine)
print(__doc__ + " Use /quit to exit.")
while True:
try:
text = input("CODELOCK > ").strip()
if text == "/quit":
break
if text.startswith("/event "):
parts = text.split()
engine.observe(parts[1], float(parts[2]) if len(parts) > 2 else 1)
print(json.dumps(engine.levels.as_dict()))
continue
if text.startswith("/wait "):
engine.advance(float(text.split()[1]))
print(json.dumps(engine.levels.as_dict()))
continue
if text == "/state":
print(json.dumps(engine.snapshot(), indent=2))
continue
if text:
print(
"Use /event, /wait or /state in state-only mode."
if args.state_only
else session.respond(text)
)
except (EOFError, KeyboardInterrupt):
break
except (ValueError, KeyError, IndexError) as error:
print(f"Invalid command: {error}")
if __name__ == "__main__":
main()