
    i                        d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZ ddlmZmZ  ej                  e      ZdZd	Z	 d	 	 	 	 	 	 	 	 	 dd
Z	 	 	 	 	 	 	 	 	 	 ddZy)u   
AI Assistant service — orchestrates LLM conversation with tool use.

Flow:
1. User sends message
2. Build system prompt with SPBU context
3. Send to LLM provider (Gemini or Groq)
4. If LLM returns tool_calls → execute tools → send results back to LLM
5. Return final text response
    )annotationsN)Any)AsyncSession)get_fallback_providerget_provider)TOOL_DEFINITIONSexecute_toolu  Kamu adalah asisten AI untuk SPBU Manager, sistem manajemen operasional pompa bensin (SPBU).

Kamu membantu pemilik/pengelola SPBU untuk:
- Melihat data penjualan, stok, expenses, penyetoran
- Memantau status operasional harian
- Mengecek anomali dan masalah
- Menjawab pertanyaan tentang konfigurasi SPBU

Aturan:
- Jawab dalam Bahasa Indonesia yang ramah dan profesional
- Gunakan tools yang tersedia untuk mendapat data terkini — jangan menebak angka
- Jika data tidak tersedia, sampaikan dengan jelas
- Format angka: gunakan pemisah ribuan titik dan desimal koma (contoh: 12.450,5 liter, Rp 187.450.000)
- Jika user bertanya tanpa menyebut tanggal, asumsikan hari ini
- Berikan insight singkat setelah menampilkan data jika ada hal yang perlu diperhatikan
   c                h  K   t               }g }t        |xs g       }|j                  d|d       	 t        | ||||       d{   }|||j                         d
S 7 # t        $ r}t
        j                  d|j                          d|        t        |      }	|	r{t
        j                  d|	j                                 	 t        | ||	||       d{  7  }|	}nD# t        $ r-}
t
        j                  d|
        dg d	d
cY d}
~
cY d}~S d}
~
ww xY wdg d	d
cY d}~S Y d}~d}~ww xY ww)z
    Process a user message and return AI response.

    Returns:
        {
            "response": str,
            "tools_used": [str],
            "provider": str,
        }
    userrolecontentNzPrimary provider (z
) failed: z Switching to fallback provider: zFallback provider also failed: z=Maaf, asisten sedang tidak tersedia. Silakan coba lagi nanti.none)response
tools_usedprovider)r   listappend_run_conversation	Exceptionloggerwarningnamer   infoerror)dbspbu_iduser_messageconversation_historyr   r   messagesresultefallbacke2s              7/var/www/html/spbu.com/backend/app/assistant/service.pychatr'   -   sP      ~HJ(.B/HOOV=>(8Z
 
:  MMO 9
  +HMMO+<JqcJK(2KK:8==?:KLM08Z    $ >rdCD _"$ &   \ "  s   0D2A  AA  
D2A   	D/)AD*C!CC! D*!	D*DDD*D/D2DD*D/ 
D2*D//D2c                r  K   t        t        dz         D ]  }|j                  |t        t               d{   }|j                  dd      }|j                  dg       }|s|c S g }	|D ]U  }
|
d   }|
j                  di       }|j                  |       	 t        | |||       d{   }|	j                  ||d
       W |r|j                  d|d       dj                  d |	D              }|j                  dd| dd        xs dS 7 7 j# t        $ r}d	t        |      i}Y d}~d}~ww xY ww)z.Run the conversation loop with tool execution.   )r!   toolssystem_promptNr    
tool_callsr   	argumentsr   )toolr"   	assistantr   
c           	   3  l   K   | ],  }d |d    dt        j                  |d   dt                . yw)z[Hasil r/   z]: r"   F)ensure_asciidefaultN)jsondumpsstr).0trs     r&   	<genexpr>z$_run_conversation.<locals>.<genexpr>   s<      !
" bj\TZZ85Z]%^$_`"s   24r   z,Berikut hasil dari tools yang kamu panggil:
z+

Berikan jawaban berdasarkan data di atas.z3Maaf, terjadi kesalahan dalam memproses permintaan.)rangeMAX_TOOL_ROUNDSr'   r   SYSTEM_PROMPTgetr   r	   r   r7   join)r   r   r   r!   r   	round_numllm_responser   r-   tool_resultstc	tool_name	tool_argsr"   r#   results_texts                   r&   r   r   g   sm     ?Q./	%]]"' + 
 
 ""9b1!%%lB7
N B6
I{B/Ii(++BINN ! !    OO[WEF yy !
"!
 
 	F|n  UB  C
 	O 0Z KKKY
( O +!3q6*+sM   5D7DAD7D'D(D,A%D7D	D4D/*D7/D44D7)N)
r   r   r   intr   r7   r    zlist[dict[str, str]] | Nonereturnzdict[str, Any])
r   r   r   rG   r!   zlist[dict[str, str]]r   z	list[str]rH   r7   )__doc__
__future__r   r5   loggingtypingr   sqlalchemy.ext.asyncior   app.assistant.providersr   r   app.assistant.toolsr   r	   	getLogger__name__r   r=   r<   r'   r        r&   <module>rT      s   	 #    / G >			8	$"  9=	777 7 6	7
 7t6L6L6L #	6L
 6L 	6LrS   