From 8935d8d4b3b1504b04f99cc55a98e6d7a15a7c9a Mon Sep 17 00:00:00 2001 From: Iris Florencio Date: Tue, 7 Jul 2026 00:05:57 -0300 Subject: [PATCH] feat(nvidia): 5 skills NVIDIA + helper CLI para build.nvidia.com MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instala 5 skills baseadas no pacote NVIDIA/skills (filtradas para M5): - nvidia-nemotron-speech (169 linhas) ASR/TTS/NMT cloud Riva NIM - nvidia-nemo-retriever (243 linhas) RAG multi-formato com NV-Embed-v2 - nvidia-data-designer (184 linhas) Dados sinteticos para popular motor - nvidia-aiq-deploy (194 linhas) Agente autonomo multi-step - nvidia-policy-generator (241 linhas) Moderacao de conteudo + LGPD Total: 1031 linhas de documentacao pratica com: - Endpoints curl prontos - Codigo Python helper - Casos de uso M5 especificos (OpenWA→CRM, Saleor, Twenty, Chatwoot) - Schema PostgreSQL (pgvector) para RAG - YAML de configuracao para AI-Q - Limites e custos do free tier skills/ nao commitada (sua em ~/.hermes/skills/) — ja' instaladas e ativas. Adiciona scripts/nvidia-apis.py (CLI wrapper): - chat PROMPT chat completion qualquer modelo - models lista 121 modelos free - status verifica se NVIDIA_API_KEY funciona Acao para amanha: 1. Obter NVIDIA_API_KEY gratis em https://build.nvidia.com/ 2. echo "NVIDIA_API_KEY=nvapi-..." >> /root/ecommerce/scripts/.env 3. python3 scripts/nvidia-apis.py status 4. Habilitar pgvector: docker exec m5_postgres psql ... -c 'CREATE EXTENSION vector;' 5. Testar skill nvidia-nemotron-speech (transcrever audio WhatsApp) --- scripts/nvidia-apis.py | 119 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100755 scripts/nvidia-apis.py diff --git a/scripts/nvidia-apis.py b/scripts/nvidia-apis.py new file mode 100755 index 0000000..f9423c6 --- /dev/null +++ b/scripts/nvidia-apis.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +""" +NVIDIA APIs Helper — wrapper unificado para build.nvidia.com +Carrega NVIDIA_API_KEY de scripts/.env +""" +import os +import sys +import json +import argparse +import urllib.request +import urllib.error +from pathlib import Path + +ENV_FILE = Path(__file__).parent / ".env" +if ENV_FILE.exists(): + for line in ENV_FILE.read_text().splitlines(): + line = line.strip() + if not line or line.startswith("#"): + continue + if "=" in line: + k, v = line.split("=", 1) + v = v.strip().strip('"').strip("'") + os.environ.setdefault(k, v) + +API_KEY = os.environ.get("NVIDIA_API_KEY", "") +BASE = "https://integrate.api.nvidia.com/v1" + + +def call_chat(model: str, prompt: str, max_tokens: int = 200, json_mode: bool = False) -> dict: + payload = { + "model": model, + "messages": [{"role": "user", "content": prompt}], + "max_tokens": max_tokens, + } + if json_mode: + payload["response_format"] = {"type": "json_object"} + + req = urllib.request.Request( + f"{BASE}/chat/completions", + data=json.dumps(payload).encode(), + headers={ + "Content-Type": "application/json", + "Authorization": f"Bearer {API_KEY}", + }, + ) + try: + with urllib.request.urlopen(req, timeout=60) as resp: + return json.loads(resp.read().decode()) + except urllib.error.HTTPError as e: + raw = e.read().decode() + try: + return json.loads(raw) + except Exception: + return {"_error": e.code, "_raw": raw[:500]} + + +def cmd_chat(args): + if not API_KEY: + print("ERRO: NVIDIA_API_KEY nao definida em scripts/.env", file=sys.stderr) + print("Obtenha gratis em: https://build.nvidia.com/", file=sys.stderr) + sys.exit(1) + r = call_chat(args.model, args.prompt, args.max_tokens, args.json) + if "_error" in r: + print(f"ERRO {r['_error']}: {r['_raw']}") + sys.exit(1) + print(r["choices"][0]["message"]["content"]) + + +def cmd_models(args): + """Lista modelos disponiveis (sem auth).""" + req = urllib.request.Request(f"{BASE}/models") + try: + with urllib.request.urlopen(req, timeout=30) as resp: + data = json.loads(resp.read().decode()) + models = [m["id"] for m in data.get("data", [])] + print(f"{len(models)} modelos:") + for m in sorted(models): + if any(k in m.lower() for k in ["nemotron", "parakeet", "magpie", "nv-embed", "cosmos", "deepseek", "kimi", "mistral", "llama"]): + print(f" - {m}") + except urllib.error.HTTPError as e: + print(f"HTTP {e.code}: {e.read().decode()[:300]}") + + +def cmd_status(args): + """Verifica se a key funciona.""" + if not API_KEY: + print("NVIDIA_API_KEY: NAO configurada") + print("Acao: obter gratis em https://build.nvidia.com/") + return + print(f"NVIDIA_API_KEY: configurada (prefixo: {API_KEY[:12]}...)") + r = call_chat("nvidia/nemotron-mini-4b-instruct", "Diga 'ok' em portugues", 20) + if "_error" in r: + print(f"ERRO {r['_error']}: {r['_raw'][:200]}") + else: + print(f"Status: OK") + print(f"Teste: {r['choices'][0]['message']['content']}") + + +def main(): + parser = argparse.ArgumentParser(description="NVIDIA APIs Helper (build.nvidia.com)") + sub = parser.add_subparsers(dest="cmd", required=True) + + p = sub.add_parser("chat", help="chat completion") + p.add_argument("prompt") + p.add_argument("--model", default="nvidia/nemotron-mini-4b-instruct") + p.add_argument("--max-tokens", type=int, default=200) + p.add_argument("--json", action="store_true", help="force JSON output") + p.set_defaults(func=cmd_chat) + + sub.add_parser("models", help="lista modelos disponiveis").set_defaults(func=cmd_models) + + sub.add_parser("status", help="verifica se key funciona").set_defaults(func=cmd_status) + + args = parser.parse_args() + args.func(args) + + +if __name__ == "__main__": + main()