NEXORA / nexora /cli.py
devildasdf's picture
Release validated NEXORA research prototype, tiny weights and evidence
12496fc verified
Raw History Blame Contribute Delete
4.85 kB
import argparse
from dataclasses import asdict
from pathlib import Path
import json
def main():
p = argparse.ArgumentParser(description="NEXORA research and local runtime")
sub = p.add_subparsers(dest="command", required=True)
t = sub.add_parser("train")
t.add_argument("--config", default="configs/tiny.json")
t.add_argument("--data", default="artifacts/data")
t.add_argument("--output", default="artifacts/tiny")
t.add_argument("--resume", action="store_true")
t.add_argument("--stop-after", type=int)
d = sub.add_parser("prepare")
d.add_argument("input")
d.add_argument("--output", default="artifacts/data")
g = sub.add_parser("generate")
g.add_argument("prompt")
g.add_argument("--checkpoint", default="artifacts/tiny")
g.add_argument("--tokens", type=int, default=64)
c = sub.add_parser("chat")
c.add_argument("prompt")
c.add_argument("--model", default=".cache/Qwen3.5-0.8B")
c.add_argument("--tokens", type=int, default=128)
s = sub.add_parser("serve")
s.add_argument("--model", default=".cache/Qwen3.5-0.8B")
s.add_argument("--port", type=int, default=8765)
i = sub.add_parser("index")
i.add_argument("root", nargs="?", default=".")
i.add_argument("--query", default="")
a = sub.add_parser("agent")
a.add_argument("task")
a.add_argument("--policy", required=True)
a.add_argument("--model", default=".cache/Qwen3.5-0.8B")
a.add_argument("--url")
a.add_argument("--allow-network", action="store_true")
a.add_argument("--verify-command", help="Owner-configured command key; should refer to trusted external tests")
a.add_argument("--steps", type=int, default=8)
e = sub.add_parser("estimate")
e.add_argument("--parameters", type=float, default=120e9)
e.add_argument("--active", type=float)
e.add_argument("--tokens", type=float, default=2.4e12)
e.add_argument("--gpus", type=int, default=1024)
e.add_argument("--mfu", type=float, default=.35)
args = p.parse_args()
if args.command == "train":
from .training import train
result = train(args.config, args.data, args.output, resume=args.resume, stop_after=args.stop_after)
elif args.command == "prepare":
from .data import prepare
result = prepare([json.loads(l) for l in Path(args.input).read_text(encoding="utf-8").splitlines() if l.strip()], args.output)
elif args.command == "generate":
from .inference import tiny_generate
result = tiny_generate(args.checkpoint, args.prompt, args.tokens)
elif args.command == "chat":
from .inference import HFBackend
backend = HFBackend(args.model, max_new_tokens=args.tokens)
result = {"answer": backend.complete([{"role": "system", "content": "You are NEXORA, a concise assistant. Be accurate about your limitations."}, {"role": "user", "content": args.prompt}]), "metrics": backend.last_metrics}
elif args.command == "serve":
import os
from .inference import HFBackend
from .server import create_server
token = os.environ.get("NEXORA_LOCAL_TOKEN", "")
if len(token) < 16:
raise ValueError("Set NEXORA_LOCAL_TOKEN to at least 16 random characters")
server = create_server(HFBackend(args.model), token, args.port)
print(f"Local inference listening at http://127.0.0.1:{args.port}; Ctrl+C stops it", flush=True)
try:
server.serve_forever()
except KeyboardInterrupt:
pass
finally:
server.server_close()
return
elif args.command == "estimate":
from .compute import Estimate
result = Estimate(args.parameters, args.active or args.parameters, args.tokens, args.gpus, mfu=args.mfu).calculate()
elif args.command == "index":
from .tools import Policy, Executor
from .coding import index_repository, retrieve
result = index_repository(Executor(Policy(args.root)))
if args.query:
result = retrieve(result, args.query)
else:
from .tools import Policy, Executor
from .inference import HFBackend, HTTPBackend
from .agent import Agent
executor = Executor(Policy(**json.loads(Path(args.policy).read_text(encoding="utf-8"))))
backend = HTTPBackend(args.url, args.model, allow_network=args.allow_network) if args.url else HFBackend(args.model)
verifier = None
if args.verify_command:
def verifier():
r = executor.execute("shell.exec", {"command": args.verify_command})
return r.ok and r.exit_code == 0 and not r.truncated
result = Agent(backend, executor, verifier, max_steps=args.steps).run(args.task)
print(json.dumps(result, indent=2, ensure_ascii=False))
if __name__ == "__main__":
main()