{
 "nbformat": 4,
 "nbformat_minor": 5,
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  },
  "colab": {
   "name": "Versatil-Colab-Baslat.ipynb"
  },
  "accelerator": "GPU"
 },
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Aners · Gerçek Versatil başlatıcısı\n",
    "\n",
    "**Çalışma zamanı → Çalışma zamanı türünü değiştir → T4 GPU** seçin. Ardından **Çalışma zamanı → Tümünü çalıştır** deyin ve kendi Drive bağlantınızı onaylayın. Kod yazmanız gerekmez.\n",
    "\n",
    "Bu dosya gerçek Versatil kaynak kodunu, resmî ana sürüm manifestini ve mühür kaydını içerir; model ağırlıkları içermez. Ağırlıkları `/MyDrive/VERSATIL_CHECKPOINTS` içinden okur. Önce `VERSATIL2_427M_MAINLINE_V1_POST_BEHAVIOR/versatil2_427m_mainline_v1_post_behavior.pt` aranır ve resmî SHA-256 kimliği doğrulanır. Bulunamazsa U212077, ardından adı açıkça gösterilen eski V0.2 veya V0.1 denenir. Deneysel VIB/U212804 ya da 553M depth32 sürümü seçilmez. Tam dosya yoksa işlem durur.\n",
    "\n",
    "Resmî ana sürümün ve U212077’nin SHA-256 kimlikleri zorunlu olarak doğrulanır. Ana sürümde kayıtlı state fingerprint de kontrol edilir. Kaynak checkpoint’lerin üzerine yazılmaz ve eğitim başlatılmaz. Yeni geçici çalışma dosyaları yalnızca Colab’ın `/content` alanına yazılır.\n",
    "\n",
    "**Durum:** Başlatıcının kaynak ve biçim kontrolleri tamamlandı. Gerçek checkpoint bu çalışma ortamına aktarılamadığı için tam model yükleme/yanıt testi henüz yapılmadı. Bu notebook, Colab oturumunda gerçek yanıt üretmeyi denemek içindir; Aners sitesini kendiliğinden çalışan bir API’ye bağlamaz.\n"
   ],
   "id": "versatil-1"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "import subprocess, sys, importlib.util\n",
    "missing = [name for name in ('tokenizers', 'ipywidgets') if importlib.util.find_spec(name) is None]\n",
    "if missing:\n",
    "    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-q', *missing])\n",
    "import torch\n",
    "if not hasattr(torch.serialization, 'safe_globals'):\n",
    "    raise RuntimeError('PyTorch 2.6 veya üstü gerekiyor. Güncel bir Colab oturumu açın.')\n",
    "from google.colab import drive, output\n",
    "drive.mount('/content/drive')\n",
    "output.enable_custom_widget_manager()\n",
    "print('Drive bağlandı. Model dosyaları yalnızca okunacak.')\n"
   ],
   "id": "versatil-2"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "import base64, hashlib, io, zipfile, tempfile, pathlib, importlib.util, sys\n",
    "source_zip = base64.b64decode('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')\n",
    "if hashlib.sha256(source_zip).hexdigest() != '99ac749176eccf713280efdf62cfbd498de725ef6ef6869279b6e675617c29db':\n",
    "    raise RuntimeError('Başlatıcı kaynak paketi kimliği eşleşmedi.')\n",
    "runtime_dir = pathlib.Path(tempfile.mkdtemp(prefix='aners_versatil_', dir='/content'))\n",
    "with zipfile.ZipFile(io.BytesIO(source_zip)) as archive:\n",
    "    for item in archive.infolist():\n",
    "        if pathlib.PurePosixPath(item.filename).name != item.filename:\n",
    "            raise RuntimeError('Beklenmeyen paket yolu.')\n",
    "        (runtime_dir / item.filename).write_bytes(archive.read(item))\n",
    "spec = importlib.util.spec_from_file_location('aners_versatil_launch', runtime_dir / 'versatil_inference.py')\n",
    "bridge = importlib.util.module_from_spec(spec)\n",
    "sys.modules[spec.name] = bridge\n",
    "spec.loader.exec_module(bridge)\n",
    "drive_root = pathlib.Path('/content/drive/MyDrive/VERSATIL_CHECKPOINTS')\n",
    "checkpoint = bridge.discover_checkpoint(drive_root)\n",
    "tokenizer_file = drive_root / 'versatil_tokenizer_v0_1.json'\n",
    "print('Seçilen gerçek dosya:', checkpoint.name)\n",
    "print('Dosya kimliği ve model doğrulanıyor. Büyük checkpoint için bu adım birkaç dakika sürebilir.')\n",
    "versatil_engine = bridge.VersatilEngine(checkpoint, tokenizer_file)\n",
    "print('Yüklendi:', versatil_engine.checkpoint_name)\n",
    "print('Parametre:', format(versatil_engine.parameter_count, ','))\n",
    "print('Cihaz:', versatil_engine.device)\n",
    "print('SHA-256:', versatil_engine.checkpoint_sha)\n",
    "if checkpoint.name == bridge.MAINLINE_NAME:\n",
    "    print('Durum: OFFICIAL_MAINLINE — resmî ana sürüm kimliği doğrulandı.')\n",
    "elif checkpoint.name == bridge.PARENT_NAME:\n",
    "    print('Durum: U212077 — korunan temiz parent; resmî ana sürüm değildir.')\n",
    "else:\n",
    "    print('Durum: Eski Versatil sürümü; U212077 veya resmî ana sürüm olarak sunulmaz.')\n",
    "print('83 tokenizer referansı doğrulandı. Eğitim başlatılmadı; checkpoint dosyasına yazılmadı.')\n"
   ],
   "id": "versatil-3"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "import html, time\n",
    "import ipywidgets as widgets\n",
    "from IPython.display import display\n",
    "\n",
    "question = widgets.Textarea(placeholder='Versatil’e bir şey yaz…', layout=widgets.Layout(width='100%', height='100px'))\n",
    "send = widgets.Button(description='Gönder', button_style='primary', icon='arrow-up')\n",
    "status = widgets.HTML(value='Gerçek model yüklendi. Bu alan cevapları Colab oturumunda üretir.')\n",
    "answer = widgets.HTML()\n",
    "\n",
    "def ask_versatil(_):\n",
    "    text = question.value.strip()\n",
    "    if not text:\n",
    "        status.value = 'Önce bir mesaj yazın.'\n",
    "        return\n",
    "    send.disabled = True\n",
    "    status.value = 'Versatil gerçek ağırlıklarla yanıt üretiyor…'\n",
    "    answer.value = ''\n",
    "    begin = time.monotonic()\n",
    "    result = ''\n",
    "    try:\n",
    "        for result in versatil_engine.stream(text, max_tokens=64):\n",
    "            answer.value = '<div style=\"white-space:pre-wrap;font-size:16px;line-height:1.7;padding:18px;border:1px solid #768697;border-radius:14px\">' + html.escape(result) + '</div>'\n",
    "        status.value = ('Yanıt tamamlandı · %.1f saniye' % (time.monotonic()-begin)) if result else 'Model metin üretmeden durdu. Başka bir mesaj deneyin.'\n",
    "    except Exception as error:\n",
    "        status.value = 'İşlem durdu: ' + html.escape(str(error))\n",
    "    finally:\n",
    "        send.disabled = False\n",
    "\n",
    "send.on_click(ask_versatil)\n",
    "display(widgets.VBox([question, send, status, answer]))\n"
   ],
   "id": "versatil-4"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Web sitesindeki durum\n",
    "\n",
    "Aners sitesindeki metin parçalama alanı tarayıcıda çalışır. Bu notebook’un sohbet alanı ise Drive’dan yüklenen gerçek modeli Colab’da çalıştırır. Siteye sürekli sohbet sunmak için bu modelin çalıştığı kalıcı bir inference servisi gerekir; açık bir servis veya herkese açık paylaşım bağlantısı otomatik oluşturulmaz.\n",
    "\n",
    "Colab oturumu kapatılırsa buradaki model de durur. Bulunan resmî ana sürümün geçmiş serbest üretim testlerinde tekrar ve yanlış yanıt sorunları kaydedilmiştir; güçlü bir sohbet kalitesi vaat edilmez.\n"
   ],
   "id": "versatil-5"
  }
 ]
}
