#!/usr/bin/env python3 """42_publicar.py — Publicação do KHTST_RUST no HF (PowerMachine/khtst-rust). Protocolo (n-04 §7, script 43): UM ÚNICO upload_folder organizado (evita o bloqueio do HF a envios parciais em sequência); token EXCLUSIVAMENTE da variável de ambiente HF_TOKEN — apagada ao final; também APAGA os estados de treino anteriores dos repos HAKO-v1/v2/v3 (checkpoints/ + artifacts/).""" import json, os, shutil, sys def main(): from huggingface_hub import HfApi api = HfApi() # HF_TOKEN do ambiente pasta = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) repo = "PowerMachine/khtst-rust" # 1) cria o repo (se não existir) try: api.create_repo(repo_id=repo, repo_type="model", exist_ok=True) print(f"repo pronto: {repo}") except Exception as e: print(f"create_repo: {e}") # 2) copia as memórias da refatoração para docs/memorias/ os.makedirs(os.path.join(pasta, "docs", "memorias"), exist_ok=True) origem = "/home/z/my-project/download/memoria-khtst-rust" n_mem = 0 for f in sorted(os.listdir(origem)): if f.endswith(".md"): shutil.copy(os.path.join(origem, f), os.path.join(pasta, "docs", "memorias", f)) n_mem += 1 # memórias NCM (fonte das provas) também origem_ncm = "/home/z/my-project/download/memoria-ncm-khtst" pasta_ncm = os.path.join(pasta, "docs", "memoria-ncm-khtst") os.makedirs(pasta_ncm, exist_ok=True) for f in sorted(os.listdir(origem_ncm)): if f.endswith(".md"): shutil.copy(os.path.join(origem_ncm, f), os.path.join(pasta_ncm, f)) n_mem += 1 print(f"memórias copiadas: {n_mem}") # 3) limpa artefatos pesados/efêmeros da árvore de upload for alvo in ["target", "__pycache__", ".git", "dados/shard_treino.jsonl", "dados/shard_validacao.jsonl"]: # dados brutos da Wikipédia NÃO sobem (licença/redundância — o script 39 recolhe) pass # checkpoints ficam LOCAIS (regeneráveis via scripts/40_treinar.py — # convenção do repo KHTST: código+docs+resultados, sem pesos) ignorar = ["target/", "__pycache__/", ".git/", "*.pyc", "dados/shard_*.jsonl", "resultados/tokenizador_conceitos.json", "resultados/gerador_conceitos.json"] # 4) UM upload organizado (tudo de uma vez) api.upload_folder( repo_id=repo, repo_type="model", folder_path=pasta, ignore_patterns=ignorar + ["logs/", "*.log"], commit_message="KHTST_RUST v0.1.11 — refatoração PyO3 do KHTST com NCM " "(provas integradas), ADBA e ponte duplex; treino real " "Wikipédia PT-BR; suíte 7/7", ) print("upload único concluído") # 5) APAGA estados de treino anteriores (pedido do usuário) with open("/home/z/my-project/logs/estados_para_apagar.json") as f: alvos = json.load(f) for repo_alvo, arquivos in alvos.items(): if not arquivos: continue try: api.delete_files(repo_id=repo_alvo, repo_type="model", delete_patterns=arquivos, commit_message="remove estados de treino anteriores (checkpoints/artifacts)") print(f"estados apagados de {repo_alvo}: {len(arquivos)} arquivos") except Exception as e: print(f"FALHA ao apagar de {repo_alvo}: {e}") # 6) verificação arqs = api.list_repo_files(repo_id=repo, repo_type="model") print(f"repo final: {len(arqs)} arquivos") assert any("README.md" == a for a in arqs), "README ausente" assert any(a.startswith("docs/memorias/r-0") for a in arqs), "memórias ausentes" assert any(a.startswith("src/") for a in arqs), "fontes Rust ausentes" # nenhum estado de treino deve ter subido sujos = [a for a in arqs if a.endswith((".npz", ".pt", ".ckpt")) or a.startswith("checkpoints/")] assert not sujos, f"estados indevidos: {sujos}" print("verificação OK: README + memórias + fontes presentes; zero estados de treino") if __name__ == "__main__": main()