# Log Eksekusi V2 - Task 4 (Penguncian Jaringan - BoundedSemaphore & Tenacity)

## Tanggal Eksekusi
Minggu, 10 Mei 2026

## Deskripsi Eksekusi
Eksekusi Task 4 dari `optimization-concurrency-plan-v2.md` telah diselesaikan. Task ini berfokus pada melindungi pemanggilan API Jaringan (*Network Calls*) agar tidak memicu kegagalan beruntun seperti HTTP 429 (Too Many Requests). Penguncian dilakukan menggunakan sinkronisasi _thread_ tingkat OS (`threading.BoundedSemaphore`) serta mekanisme pemulihan mundur berbasis eksponensial (`tenacity.wait_exponential_jitter`).

## Detail Aktivitas

### Implementasi Global Semaphore
- Menambahkan import `threading` (jika belum ada) dan mendefinisikan objek `api_semaphore = threading.BoundedSemaphore(3)` di level teratas (global) dari file `app/services/ingestion.py`. Nilai 3 berarti hanya boleh ada maksimal 3 _thread_ konkuren yang aktif memanggil layanan DashScope atau OpenAI pada detik yang sama (untuk mengontrol lonjakan QPS).
- Menyisipkan blok penguncian (`with api_semaphore:`) di dalam beberapa fungsi vital pemanggilan LLM:
  - `extract_pillars_with_llm()`: Proses _Extraction_ pilar riset kini mengantri.
  - `generate_edge_reasoning()`: Pembuatan _Edge_ hubungan antar riset dijaga agar tidak tumpang tindih.

### Pembaruan Embedding untuk Neo4j Vektor DB
- Memperbarui fungsi `embed_text()` sesuai dengan _blueprint_ V2 di mana Embedding (khusus Node pilar Neo4j) menggunakan *Cloud* OpenAI (`text-embedding-3-small`) dengan 1024 Dimensi.
- Pemanggilan API ke `openai_client.embeddings.create` tersebut juga dibungkus oleh `with api_semaphore:` untuk keamanan QPS yang selaras.

### Penguatan via Pustaka Tenacity
- Menerapkan *decorator* `@retry` dari `tenacity` kepada seluruh fungsi yang berurusan dengan jaringan internet: `embed_text`, `extract_pillars_with_llm`, dan `generate_edge_reasoning`.
- Parameter `wait=wait_exponential_jitter(initial=2, max=60)` dan `stop=stop_after_attempt(10)` telah dikonfirmasi terpasang aktif di atas masing-masing definisi fungsi tersebut.

## Validasi Singkat 
Dilakukan percobaan _dry-run_ secara lokal. Terdapat kesalahan (_error_) koneksi karena server Neo4j lokal (`127.0.0.1:7687`) dalam kondisi mati/mati mendadak (`Connection refused`), bukan karena *crash* logika *concurrency*. Karena tugas saat ini hanya membatasi pembaharuan kode terkait API Semaphore, kode dianggap sudah dipasang secara _syntax_ dan _structural_ dengan benar. Kesalahan Neo4j ini akan diselesaikan atau ditoleransi pada Task 5 (Pengujian Beban) dengan menyalakan kontainer Neo4j.

## Status Akhir
- **Penguncian Jaringan:** Selesai. Panggilan API DashScope dan OpenAI sekarang dijaga ketat oleh sistem *Queueing* di level lokal (Semaphore) maupun pemulihan eksponensial otomatis (Tenacity).

Melanjutkan penyampaian laporan ini kepada pengguna dan memperbarui checklist rencana.