feat: chat + optmz control panel
This commit is contained in:
@@ -398,13 +398,13 @@ def _model_codegen_body(args):
|
||||
if not model_spec:
|
||||
return None, {"mode": "deterministic", "reason": "provider_unresolved"}
|
||||
pclass = provider.get("class", "local")
|
||||
if pclass == "cloud" and provider.get("requires_key"):
|
||||
if provider.get("requires_key"):
|
||||
key_env = provider.get("key_env", "")
|
||||
if key_env and not os.environ.get(key_env):
|
||||
return None, {"mode": "deterministic", "reason": "cloud_key_unset"}
|
||||
return None, {"mode": "deterministic", "reason": "provider_key_unset"}
|
||||
router = os.environ.get("CASAN_CHAT_MODEL_ROUTER") or MODEL_ROUTER
|
||||
env = os.environ.copy()
|
||||
if pclass == "cloud":
|
||||
if pclass == "cloud" or provider.get("requires_preflight"):
|
||||
env["CASAN_PREFLIGHT"] = "1"
|
||||
prompt = "\n".join([
|
||||
"You are CASAN's governed codegen assistant. Produce a SMALL Python draft",
|
||||
@@ -417,6 +417,16 @@ def _model_codegen_body(args):
|
||||
write_text(pf, prompt)
|
||||
r = subprocess.run(["bash", router, pf, oj, "--role", "generate", "--model", model_spec],
|
||||
cwd=ROOT, capture_output=True, text=True, env=env)
|
||||
fallback_from = ""
|
||||
if (r.returncode != 0 or not os.path.isfile(oj)) and provider_id != "local":
|
||||
fallback = providers.get(os.environ.get("CASAN_CHAT_LOCAL_FALLBACK_PROVIDER", "local"), {})
|
||||
fallback_model = fallback.get("model")
|
||||
if fallback_model and fallback.get("class", "local") == "local":
|
||||
fallback_from = provider_id
|
||||
r = subprocess.run(["bash", router, pf, oj, "--role", "generate", "--model", fallback_model],
|
||||
cwd=ROOT, capture_output=True, text=True, env=os.environ.copy())
|
||||
if r.returncode == 0 and os.path.isfile(oj):
|
||||
provider_id, model_spec = "local", fallback_model
|
||||
if r.returncode != 0 or not os.path.isfile(oj):
|
||||
return None, {"mode": "deterministic", "reason": "model_unavailable"}
|
||||
try:
|
||||
@@ -432,6 +442,7 @@ def _model_codegen_body(args):
|
||||
"model": model_spec,
|
||||
"input_tokens": int(out.get("input_tokens") or 0),
|
||||
"output_tokens": int(out.get("output_tokens") or 0),
|
||||
"fallback_from": fallback_from or None,
|
||||
}
|
||||
|
||||
|
||||
@@ -709,6 +720,13 @@ def verify_audit() -> int:
|
||||
return run_and_passthrough(["python3", READONLY, "verify-audit"])
|
||||
|
||||
|
||||
def history(args) -> int:
|
||||
command = ["python3", READONLY, "history", "--actor", args.actor, "--tenant", args.tenant, "--limit", str(args.limit)]
|
||||
if args.chat_id:
|
||||
command += ["--chat-id", args.chat_id]
|
||||
return run_and_passthrough(command)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
ap = argparse.ArgumentParser()
|
||||
sub = ap.add_subparsers(dest="cmd", required=True)
|
||||
@@ -726,6 +744,12 @@ def main() -> int:
|
||||
askp.add_argument("--stream", action="store_true")
|
||||
askp.set_defaults(func=ask)
|
||||
sub.add_parser("verify-audit").set_defaults(func=lambda _args: verify_audit())
|
||||
hp = sub.add_parser("history")
|
||||
hp.add_argument("--actor", required=True)
|
||||
hp.add_argument("--chat-id", default="")
|
||||
hp.add_argument("--tenant", default="default")
|
||||
hp.add_argument("--limit", type=int, default=50)
|
||||
hp.set_defaults(func=history)
|
||||
args = ap.parse_args()
|
||||
return args.func(args)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user