File size: 4,156 Bytes
97df2ae
 
 
e26f4cc
 
 
 
97df2ae
 
 
 
e26f4cc
97df2ae
 
 
 
e26f4cc
97df2ae
 
 
 
 
 
e26f4cc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97df2ae
 
 
 
e26f4cc
 
 
 
97df2ae
 
 
e26f4cc
 
 
 
 
97df2ae
 
e26f4cc
 
 
 
97df2ae
e26f4cc
97df2ae
e26f4cc
97df2ae
 
e26f4cc
97df2ae
 
e26f4cc
 
 
 
97df2ae
 
e26f4cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/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()