Ë
    tPêjq  ã                   ó  — U d Z ddlmZmZmZ ddlmZmZ ddlm	Z	 ddl
mZ erddlmZ neZddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ dZeed<   dedefd„Zdedefd„Z G d„ d«      Z G d„ d«      Z  G d„ de«      Z! G d„ d«      Z"y)z9
GitLab prompt manager with configurable prompts folder.
é    )ÚTYPE_CHECKINGÚAnyÚFinal)Ú
DictLoaderÚselect_autoescape)ÚImmutableSandboxedEnvironment)ÚCustomPromptManagement)ÚLogging)ÚGitLabClient)ÚPromptManagementBaseÚPromptManagementClient)ÚAllMessageValues)Ú
PromptSpec)ÚStandardCallbackDynamicParamszgitlab::ÚGITLAB_PREFIXÚraw_idÚreturnc                 ód   — | j                  t        «      r| S t        › | j                  dd«      › �S )uM   Convert GitLab path IDs like 'invoice/extract' â†’ 'gitlab::invoice::extract'ú/ú::)Ú
startswithr   Úreplace)r   s    úv/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/gitlab/gitlab_prompt_manager.pyÚencode_prompt_idr      s0   € à×ÑœÔ'ØˆÜˆ_˜VŸ^™^¨C°Ó6Ð7Ð8Ð8ó    Ú
encoded_idc                 ót   — | j                  t        «      s| S | t        t        «      d j                  dd«      S )u8   Convert 'gitlab::invoice::extract' â†’ 'invoice/extract'Nr   r   )r   r   Úlenr   )r   s    r   Údecode_prompt_idr   #   s6   € à× Ñ ¤Ô/ØÐØ”cœ-Ó(Ð*Ð+×3Ñ3°D¸#Ó>Ð>r   c            
       ó>   — e Zd Z	 ddededeeef   dedz  fd„Zd„ Zy)	ÚGitLabPromptTemplateNÚtemplate_idÚcontentÚmetadataÚmodelc                 óp  — || _         || _        || _        |xs |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        |j                  di «      j                  di «      | _        |j                  «       D ��ci c]  \  }}|dvsŒ||“Œ c}}| _	        y c c}}w )Nr%   ÚtemperatureÚ
max_tokensÚinputÚschema)r%   r)   r#   )
r"   r#   r$   Úgetr%   r'   r(   Úinput_schemaÚitemsÚoptional_params)Úselfr"   r#   r$   r%   ÚkÚvs          r   Ú__init__zGitLabPromptTemplate.__init__+   s�   € ð 'ˆÔØˆŒØ ˆŒØÒ3˜hŸl™l¨7Ó3ˆŒ
Ø#Ÿ<™<¨Ó6ˆÔØ"Ÿ,™, |Ó4ˆŒØ$ŸL™L¨°"Ó5×9Ñ9¸(ÀBÓGˆÔØ19·±Ó1A×l©¨¨AÀQÐNkÒEk  1¡ÓlˆÕùÓls   ÂB2Â#B2c                 ó<   — d| j                   › d| j                  › d�S )NzGitLabPromptTemplate(id='z
', model='z'))r"   r%   ©r/   s    r   Ú__repr__zGitLabPromptTemplate.__repr__;   s#   € Ø*¨4×+;Ñ+;Ð*<¸JÀtÇzÁzÀlÐRTÐUÐUr   ©N)Ú__name__Ú
__module__Ú__qualname__ÚstrÚdictr   r2   r5   © r   r   r!   r!   *   sI   „ ð !ñmàðmð ðmð �s˜C�x‘.ð	mð
 �T‰zómó Vr   r!   c            
       ó.  — e Zd ZdZ	 	 	 ddeeef   dedz  dedz  dedz  fd„Zdedefd	„Z	d
edefd„Z
ddœdededz  ddfd„Zddœdedee   fd„Zdededefd„Zdedeeef   fd„Zddedeeef   dz  defd„Zdededz  fd„Zddœdedee   fd„Zy)ÚGitLabTemplateManagerz±
    Manager for loading and rendering .prompt files from GitLab repositories.

    New: supports `prompts_path` (or `folder`) in gitlab_config to scope where prompts live.
    NÚgitlab_configÚ	prompt_idÚrefÚgitlab_clientc           
      óþ  — t        |«      | _        || _        i | _        |xs t	        | j                  «      | _        |r| j
                  j                  |«       | j                  j                  d«      xs | j                  j                  d«      xs dj                  d«      | _	        t        t        i «      t        ddg«      ddd	d
dd¬«      | _        | j                  r| j                  | j                  «       y y )NÚprompts_pathÚfolderÚ r   ÚhtmlÚxmlz{{z}}z{%z%}z{#z#})ÚloaderÚ
autoescapeÚvariable_start_stringÚvariable_end_stringÚblock_start_stringÚblock_end_stringÚcomment_start_stringÚcomment_end_string)r;   r?   r@   Úpromptsr   rB   Úset_refr+   ÚstriprD   r   r   r   Ú	jinja_envÚ_load_prompt_from_gitlab©r/   r?   r@   rA   rB   s        r   r2   zGitLabTemplateManager.__init__F   sä   € ô " -Ó0ˆÔØ"ˆŒØ8:ˆŒØ*ÒN¬l¸4×;MÑ;MÓ.NˆÔáØ×Ñ×&Ñ& sÔ+ð ×Ñ×"Ñ" >Ó2Ò\°d×6HÑ6H×6LÑ6LÈXÓ6VÒ\ÐZ\ß
‰%�‹*ð 	Ôô 7Ü˜b“>Ü(¨&°%¨Ó9Ø"&Ø $Ø#Ø!Ø!%Ø#ô	
ˆŒð �>Š>Ø×)Ñ)¨$¯.©.Õ9ð r   r   c                 ó^   — t        |«      }| j                  r| j                  › d|› d�S |› d�S )zHMap a prompt_id to a repo path (respects prompts_path and adds .prompt).r   ú.prompt)r   rD   )r/   r@   s     r   Ú_id_to_repo_pathz&GitLabTemplateManager._id_to_repo_pathp   s<   € ä$ YÓ/ˆ	Ø×ÒØ×'Ñ'Ð(¨¨)¨°GÐ<Ð<Ø�˜GÐ$Ð$r   Ú	repo_pathc                 ó"  — |j                  d«      }| j                  rW|j                  | j                  j                  d«      dz   «      r*|t        | j                  j                  d«      «      dz   d }|j	                  d«      }t        |«      S )zž
        Map a repo path like 'prompts/chat/greeting.prompt' to an ID relative
        to prompts_path without the extension (e.g., 'chat/greeting').
        r   é   NrX   )rS   rD   r   r   Úremovesuffixr   )r/   rZ   Úpaths      r   Ú_repo_path_to_idz&GitLabTemplateManager._repo_path_to_idw   s€   € ð
 �‰˜sÓ#ˆØ×Ò §¡°×1BÑ1B×1HÑ1HÈÓ1MÐPSÑ1SÔ!TØœ˜D×-Ñ-×3Ñ3°CÓ8Ó9¸AÑ=Ð?Ð@ˆDØ× Ñ  Ó+ˆÜ Ó%Ð%r   ©rA   c                ó   — 	 | j                  |«      }| j                  j                  ||¬«      }|r"| j                  ||«      }|| j                  |<   yy# t
        $ r}t        dt        |«      › d|› �«      ‚d}~ww xY w)zLLoad a specific .prompt file from GitLab (scoped under prompts_path if set).r`   zFailed to load prompt 'z' from GitLab: N)rY   rB   Úget_file_contentÚ_parse_prompt_filerQ   Ú	Exceptionr   )r/   r@   rA   Ú	file_pathÚprompt_contentÚtemplateÚes          r   rU   z.GitLabTemplateManager._load_prompt_from_gitlab„   s“   € ð	gà#×4Ñ4°YÓ?ˆIØ$(×$6Ñ$6×$GÑ$GÈ	ÐWZÐ$GÓ$[ˆNÙØ"&×"9Ñ"9¸.È)Ó"T�Ø*2�—‘˜YÒ'ð øô ò 	gÜÐ5Ô6FÀyÓ6QÐ5RÐRaÐbcÐadÐeÓfÐfûð	gús   ‚AA Á	A=ÁA8Á8A=T©Ú	recursiverj   c                óœ   — | j                  |¬«      }g }|D ]2  }|| j                  vr| j                  |«       |j                  |«       Œ4 |S )zW
        Eagerly load all .prompt files from prompts_path. Returns loaded IDs.
        ri   )Úlist_templatesrQ   rU   Úappend)r/   rj   ÚfilesÚloadedÚpids        r   Úload_all_promptsz&GitLabTemplateManager.load_all_prompts�   sX   € ð ×*Ñ*°YÐ*Ó?ˆØ#%ˆØò 	ˆCØ˜$Ÿ,™,Ñ&Ø×-Ñ-¨cÔ2Ø�M‰M˜#Õð	ð ˆr   r#   c                 ót  — |j                  d«      rL|j                  dd«      }t        |«      dk\  r'|d   j                  «       }|d   j                  «       }n	d}|}nd}|}i }|r	 dd l}|j                  |«      xs i }t        |||¬«      S # t        $ r | j                  |«      }Y Œ*t        $ r i }Y Œ6w xY w)Nz---é   é   r\   rF   r   )r"   r#   r$   )
r   Úsplitr   rS   ÚyamlÚ	safe_loadÚImportErrorÚ_parse_yaml_basicrd   r!   )r/   r#   r@   ÚpartsÚfrontmatter_strÚtemplate_contentr$   rv   s           r   rc   z(GitLabTemplateManager._parse_prompt_filež   sÌ   € Ø×Ñ˜eÔ$Ø"Ÿ=™=¨°Ó2ˆEÜ�5‹z˜QŠØ"'¨¡(§.¡.Ó"2�Ø#(¨¡8§>¡>Ó#3Ñ à"$�Ø#*Ñ à ˆOØ&Ðà#%ˆÙðÛàŸ>™>¨/Ó:Ò@¸b�ô $Ø!Ø$Øô
ð 	
øô ò CØ×1Ñ1°/ÓB’Üò Ø’ðús   Á'B ÂB7Â*
B7Â6B7Úyaml_strc                 ó.  — i }|j                  d«      D ]ê  }|j                  «       }d|v sŒ|j                  d«      rŒ*|j                  dd«      \  }}|j                  «       }|j                  «       }|j                  «       dv r|j                  «       dk(  ||<   Œˆ|j	                  «       rt        |«      ||<   Œ§|j                  dd«      j	                  «       r	 t        |«      ||<   Œ×|j                  d	«      ||<   Œì |S # t        $ r |||<   Y Œÿw xY w)
Nú
ú:ú#r\   )ÚtrueÚfalser‚   ú.rF   z"')	ru   rS   r   ÚlowerÚisdigitÚintr   Úfloatrd   )r/   r}   ÚresultÚlineÚkeyÚvalues         r   ry   z'GitLabTemplateManager._parse_yaml_basic¼   sý   € Ø(*ˆØ—N‘N 4Ó(ò 	5ˆDØ—:‘:“<ˆDØ�dŠ{ 4§?¡?°3Õ#7Ø!ŸZ™Z¨¨QÓ/‘
��UØ—i‘i“k�ØŸ™›�Ø—;‘;“=Ð$5Ñ5Ø"'§+¡+£-°6Ñ"9�F˜3’KØ—]‘]”_Ü"% e£*�F˜3’KØ—]‘] 3¨Ó+×3Ñ3Ô5ð,Ü&+¨E£l˜˜sšð #(§+¡+¨eÓ"4�F˜3’Kð!	5ð" ˆøô	 %ò ,Ø&+˜˜s›ð,ús   ÃDÄDÄDr"   Ú	variablesc                 óÐ   — || j                   vrt        d|› d�«      ‚| j                   |   }| j                  j                  |j                  «      } |j
                  di |xs i ¤ŽS )Nz
Template 'ú' not foundr<   )rQ   Ú
ValueErrorrT   Úfrom_stringr#   Úrender)r/   r"   r�   rg   Újinja_templates        r   Úrender_templatez%GitLabTemplateManager.render_templateÑ   sd   € Ø˜dŸl™lÑ*Ü˜z¨+¨°kÐBÓCÐCØŸ,™, {Ñ3ˆØ $§¡× :Ñ :¸8×;KÑ;KÓ LˆØ$ˆ~×$Ñ$Ñ9¨	ª°RÑ9Ð9r   c                 ó8   — | j                   j                  |«      S r6   )rQ   r+   )r/   r"   s     r   Úget_templatez"GitLabTemplateManager.get_templateØ   s   € Ø�|‰|×Ñ Ó,Ð,r   c                ó  — 	 | j                   j                  | j                  d|¬«      }| j                  j                  d«      }g }|xs g D ]e  }t	        |«      j                  d«      }|r|j                  |dz   «      sŒ4|j                  d«      sŒF|j                  | j                  |«      «       Œg |S # t        $ rË | j                   j                  | j                  xs dd|¬«      }g }|xs g D ]l  }t        |t        «      sŒ|j                  d«      dk(  sŒ)t	        |j                  d	d«      «      j                  d«      sŒTd	|v sŒY|j                  |d	   «       Œn |D �cg c]  }| j                  |«      ‘Œ nc c}w c}cY S w xY w)
a  
        List available prompt IDs under prompts_path (no extension).
        Compatible with both list_files signatures:
        - list_files(directory_path=..., file_extension=..., recursive=...)
        - list_files(path=..., ref=None, recursive=...)
        rX   )Údirectory_pathÚfile_extensionrj   r   rF   N)r˜   rA   rj   ÚtypeÚblobr^   )rB   Ú
list_filesrD   rS   r:   r   Úendswithrm   r_   Ú	TypeErrorÚ
isinstancer;   r+   )	r/   rj   rn   ÚbaseÚoutÚpr^   ÚrawÚfs	            r   rl   z$GitLabTemplateManager.list_templatesÛ   s}  € ð#	=Ø×&Ñ&×1Ñ1Ø#×0Ñ0Ø(Ø#ð 2ó ˆEð
 ×+Ñ+×1Ñ1°#Ó6ˆDØ$&ˆCØ’[˜bò 8�Ü˜1“v—|‘| CÓ(�Ù §¡°°s±
Ô ;àØ—}‘} YÔ/ØØ—
‘
˜4×0Ñ0°Ó6Õ7ð8ð ˆJøÜò 	=à×+Ñ+×6Ñ6Ø#×0Ñ0Ò6°BØØ#ð 7ó ˆCð ˆEØ’Y˜Bò ,�ä˜q¤$Õ'ØŸ™˜f›¨Ó/Ü˜AŸE™E &¨"Ó-Ó.×7Ñ7¸	ÕBØ !šà—L‘L  6¡Õ+ð,ð 7<Ö<°�D×)Ñ)¨!Õ,Ñ<ùÔ<Ò<ð%	=ús7   ‚B4B7 Â7AFÄFÄ*FÅFÅFÅ'F Å?	FÆ
F©NNNr6   )r7   r8   r9   Ú__doc__r;   r:   r   r   r2   rY   r_   rU   ÚboolÚlistrq   r!   rc   ry   r”   r–   rl   r<   r   r   r>   r>   ?   sR  „ ñð !%ØØ-1ñ&:à˜C ˜H‘~ð&:ð ˜‘:ð&:ð �4‰Zð	&:ð
 $ dÑ*ó&:ðT%¨#ð %°#ó %ð	&¨#ð 	&°#ó 	&ð MQò 
g°#ð 
g¸sÀT¹zð 
gÐUYó 
gð 59ò 
¨Tð 
¸TÀ#¹Yó 
ð
¨#ð 
¸#ð 
ÐBVó 
ð<¨#ð °$°s¸C°x±.ó ñ*:¨3ð :¸4ÀÀSÀ¹>ÈDÑ;Pð :Ð\_ó :ð-¨ð -Ð0DÀtÑ0Kó -ð 37ò +=¨4ð +=¸4À¹9ô +=r   r>   c                    óè  — e Zd ZdZ	 	 	 d)deeef   dedz  dedz  dedz  fd„Ze	defd	„«       Z
e	defd
„«       Z	 d*ddœdedeeef   dz  dedz  deeeeef   f   fd„Z	 	 	 	 	 d+dedz  dee   deeef   ez  dz  deeef   dz  dedz  deeef   dz  dedz  deee   eeef   dz  f   fd„Zdedee   fd„Z	 	 	 	 d,dedz  dedee   deeef   ez  dz  deeef   dz  dedz  deeef   dz  defd„Zdee   fd„Zd-d„Zdedz  dedz  dedefd„Z	 	 d.dedz  dedz  dedz  dededz  dedz  defd„Z	 	 	 d)dedz  dedz  dededz  dedz  dedz  defd „Z	 	 	 	 	 d/d!edee   d"ededz  dedz  dededz  dedz  dedz  d#edz  d$edz  deeee   ef   fd%„Z	 	 	 	 	 	 d0d!edee   d"ededz  dedz  ded&ededz  d'ee   dz  dedz  dedz  d#edz  d$edz  deeee   ef   fd(„Z y)1ÚGitLabPromptManagerak  
    GitLab prompt manager with folder support.

    Example config:
        gitlab_config = {
            "project": "group/subgroup/repo",
            "access_token": "glpat_***",
            "tag": "v1.2.3",          # optional; takes precedence
            "branch": "main",         # default fallback
            "prompts_path": "prompts/chat"
        }
    Nr?   r@   rA   rB   c                 óÆ   — || _         || _        d | _        || _        || _        | j                  r2t        | j                   | j                  | j                  ¬«      | _        y y )N)r?   r@   rA   )r?   r@   Ú_prompt_managerÚ_ref_overrideÚ_injected_gitlab_clientr>   rV   s        r   r2   zGitLabPromptManager.__init__  s]   € ð +ˆÔØ"ˆŒØ=AˆÔØ ˆÔØ'4ˆÔ$Ø�>Š>Ü#8Ø"×0Ñ0ØŸ.™.Ø×&Ñ&ô$ˆDÕ ð r   r   c                  ó   — y)NÚgitlabr<   r4   s    r   Úintegration_namez$GitLabPromptManager.integration_name*  s   € àr   c                 óª   — | j                   €<t        | j                  | j                  | j                  | j
                  ¬«      | _         | j                   S ©N)r?   r@   rA   rB   )r¬   r>   r?   r@   r­   r®   r4   s    r   Úprompt_managerz"GitLabPromptManager.prompt_manager.  sK   € à×ÑÐ'Ü#8Ø"×0Ñ0ØŸ.™.Ø×&Ñ&Ø"×:Ñ:ô	$ˆDÔ ð ×#Ñ#Ð#r   r`   Úprompt_variablesc                ól  — || j                   j                  vr| j                   j                  ||¬«       | j                   j                  |«      }|st	        d|› d�«      ‚| j                   j                  ||xs i «      }|j                  |j                  |j                  dœ|j                  ¥}||fS )Nr`   zPrompt template 'r�   )r%   r'   r(   )
r´   rQ   rU   r–   r�   r”   r%   r'   r(   r.   )r/   r@   rµ   rA   rg   Úrendered_promptr$   s          r   Úget_prompt_templatez'GitLabPromptManager.get_prompt_template9  s½   € ð ˜D×/Ñ/×7Ñ7Ñ7Ø×Ñ×8Ñ8¸ÈÐ8ÔLà×-Ñ-×:Ñ:¸9ÓEˆÙÜÐ0°°¸;ÐGÓHÐHà!%×!4Ñ!4×!DÑ!DÀYÐP`ÒPfÐdfÓ!gˆð —^‘^Ø#×/Ñ/Ø"×-Ñ-ñ
ð ×&Ñ&ð	
ˆð  Ð(Ð(r   Úuser_idÚmessagesÚfunction_callÚlitellm_paramsÚprompt_versionc                 ó´  — |s||fS 	 |xs |j                  d«      xs | j                  }	| j                  |||	¬«      \  }
}| j                  |
«      }|r|}n	d|
dœg|z   }|€i }|j                  d«      r|d   |d<   dD ]  }||v sŒ||   ||<   Œ ||fS # t        $ r8}dd l}|j                  j                  j                  d|«       ||fcY d }~S d }~ww xY w)	NÚgit_refr`   Úuser©Úroler#   r%   ©r'   r(   Útop_pÚfrequency_penaltyÚpresence_penaltyr   z(Error in GitLab prompt pre_call_hook: %s)	r+   r­   r¸   Ú_parse_prompt_to_messagesrd   ÚlitellmÚ_loggingÚverbose_proxy_loggerÚerror)r/   r¹   rº   r»   r¼   r@   rµ   r½   Úkwargsr¿   r·   Úprompt_metadataÚparsed_messagesÚfinal_messagesÚparamrh   rÈ   s                    r   Úpre_call_hookz!GitLabPromptManager.pre_call_hookQ  s  € ñ Ø˜^Ð+Ð+ð!	,à+ÒZ¨v¯z©z¸)Ó/DÒZÈ×HZÑHZˆGà/3×/GÑ/GÈ	ÐScÐipÐ/GÓ/qÑ,ˆO˜_Ø%)×%CÑ%CÀOÓ%TˆOáØ9H‘à+1¸oÑ"NÐ!OÐRZÑ!Z�àÐ%Ø!#�à×"Ñ" 7Ô+Ø*9¸'Ñ*B�˜wÑ'ðò C�ð ˜OÒ+Ø,;¸EÑ,B�N 5Ò)ðCð " >Ð1Ð1øÜò 	,Ûà×Ñ×1Ñ1×7Ñ7Ð8bÐdeÔfØ˜^Ð+Õ+ûð		,ús$   ˆA?B ÂB Â	CÂ-CÃCÃCrf   c                 ó°  — g }|j                  «       j                  d«      }d }g }|D �]O  }|j                  «       }|sŒ|j                  «       }|j                  d«      rL|r3|r1|j	                  |dj                  |«      j                  «       dœ«       d}|dd  j                  «       g}Œ„|j                  d«      rL|r3|r1|j	                  |dj                  |«      j                  «       dœ«       d}|dd  j                  «       g}Œá|j                  d	«      rM|r3|r1|j	                  |dj                  |«      j                  «       dœ«       d
}|dd  j                  «       g}�Œ?|j	                  |«       �ŒR |r3|r1|j	                  |dj                  |«      j                  «       dœ«       |s$|j                  «       rd|j                  «       dœg}|S )Nr   zsystem:rÁ   Úsystemé   zuser:rÀ   é   z
assistant:Ú	assistanté
   )rS   ru   r…   r   rm   Újoin)	r/   rf   rº   ÚlinesÚcurrent_roleÚcurrent_contentr£   rŠ   Úlows	            r   rÇ   z-GitLabPromptManager._parse_prompt_to_messages�  sº  € Ø+-ˆØ%×+Ñ+Ó-×3Ñ3°DÓ9ˆØ#'ˆØ%'ˆàó $	-ˆCØ—9‘9“;ˆDÙØØ—*‘*“,ˆCØ�~‰~˜iÔ(Ù¡OØ—O‘Oà$0Ø'+§y¡y°Ó'A×'GÑ'GÓ'Iñôð  (�Ø#'¨¨ 8§>¡>Ó#3Ð"4‘Ø—‘ Ô(Ù¡OØ—O‘Oà$0Ø'+§y¡y°Ó'A×'GÑ'GÓ'Iñôð  &�Ø#'¨¨ 8§>¡>Ó#3Ð"4‘Ø—‘ Ô-Ù¡OØ—O‘Oà$0Ø'+§y¡y°Ó'A×'GÑ'GÓ'Iñôð  +�Ø#'¨¨ 9§?¡?Ó#4Ð"5’à×&Ñ& tÖ,ðI$	-ñL ™OØ�O‰O \¸d¿i¹iÈÓ>X×>^Ñ>^Ó>`ÑaÔbÙ˜N×0Ñ0Ô2Ø!'°N×4HÑ4HÓ4JÑKÐLˆHØˆr   ÚresponseÚinput_messagesc                 ó   — |S r6   r<   )	r/   r¹   rÝ   rÞ   r»   r¼   r@   rµ   rÌ   s	            r   Úpost_call_hookz"GitLabPromptManager.post_call_hook³  s	   € ð ˆr   c                 óø   — t        | j                  j                  j                  «       «      }	 |j	                  | j                  j                  «       «       t        |«      S # t        $ r Y t        |«      S w xY w)zœ
        Return prompt IDs. Prefer already-loaded templates in memory to avoid
        unnecessary network calls (and to make tests deterministic).
        )Úsetr´   rQ   ÚkeysÚupdaterl   rd   Úsorted)r/   Úidss     r   Úget_available_promptsz)GitLabPromptManager.get_available_promptsÀ  sm   € ô
 ˜×,Ñ,×4Ñ4×9Ñ9Ó;Ó<ˆð	Ø�J‰J�t×*Ñ*×9Ñ9Ó;Ô<ô �c‹{Ðøô ò 	àÜ�c‹{Ðð	ús   ¯)A# Á#	A9Á8A9c                 óD   — | j                   rd | _        | j                  }y y r6   )r@   r¬   r´   )r/   Ú_s     r   Úreload_promptsz"GitLabPromptManager.reload_promptsÍ  s!   € Ø�>Š>Ø#'ˆDÔ Ø×#Ñ#‰Að r   Úprompt_specÚdynamic_callback_paramsc                 ó
   — |d uS r6   r<   )r/   r@   rë   rì   s       r   Úshould_run_prompt_managementz0GitLabPromptManager.should_run_prompt_managementÒ  s   € ð  Ð$Ð$r   Úprompt_labelc                 óð  — |€t        d«      ‚	 t        |«      }|| j                  j                  vrGt	        |d«      rt        |di «      j                  d«      nd }| j                  j                  ||¬«       | j                  ||«      \  }	}
| j                  |	«      }|
j                  d«      }i }dD ]  }||
v sŒ|
|   ||<   Œ t        ||||d ¬«      S # t        $ r}t        d|› d	|› �«      ‚d }~ww xY w)
Nú/prompt_id is required for GitLab prompt managerÚextrar¿   r`   r%   rÃ   )r@   Úprompt_templateÚprompt_template_modelÚprompt_template_optional_paramsÚcompleted_messageszError compiling prompt 'z': )r�   r   r´   rQ   ÚhasattrÚgetattrr+   rU   r¸   rÇ   r   rd   )r/   r@   rë   rµ   rì   rï   r½   Ú
decoded_idr¿   r·   rÍ   rº   Útemplate_modelr.   rÐ   rh   s                   r   Ú_compile_prompt_helperz*GitLabPromptManager._compile_prompt_helperÚ  s8  € ð ÐÜÐNÓOÐOð"	KÜ 0°Ó ;ˆJØ ×!4Ñ!4×!<Ñ!<Ñ<ô Ð6¸Ô@ô Ð3°W¸bÓA×EÑEÀiÔPàð ð
 ×#Ñ#×<Ñ<¸ZÈWÐ<ÔUà/3×/GÑ/GÈ	ÐScÓ/dÑ,ˆO˜_à"×<Ñ<¸_ÓMˆHØ$3×$7Ñ$7¸Ó$@ˆNà57ˆOðò D�ð ˜OÒ+Ø-<¸UÑ-C�O EÒ*ðDô *Ø#Ø (Ø&4Ø0?Ø#'ôð øô ò 	KÜÐ7¸	°{À#ÀaÀSÐIÓJÐJûð	Kús   �B,C Â<C Ã	C5ÃC0Ã0C5c              ƒ   óR   K  — |€t        d«      ‚| j                  ||||||¬«      S ­w)z•
        Async version of compile prompt helper. Since GitLab operations use sync client,
        this simply delegates to the sync version.
        rñ   )r@   rë   rµ   rì   rï   r½   )r�   rû   )r/   r@   rµ   rì   rë   rï   r½   s          r   Úasync_compile_prompt_helperz/GitLabPromptManager.async_compile_prompt_helper
  sD   è ø€ ð ÐÜÐNÓOÐOà×*Ñ*ØØ#Ø-Ø$;Ø%Ø)ð +ó 
ð 	
ùs   ‚%'r%   Únon_default_paramsÚignore_prompt_manager_modelÚ%ignore_prompt_manager_optional_paramsc                 ó@   — t        j                  | |||||||||	¬«
      S )N)rë   rï   r½   )r   Úget_chat_completion_prompt)r/   r%   rº   rþ   r@   rµ   rì   rë   rï   r½   rÿ   r   s               r   r  z.GitLabPromptManager.get_chat_completion_prompt#  s5   € ô $×>Ñ>ØØØØØØØ#Ø#Ø%Ø)ô
ð 	
r   Úlitellm_logging_objÚtoolsc              ƒ   ód   K  — t        j                  | |||||||||	|
|||¬«      ƒ d{  –—† S 7 Œ­w)zY
        Async version - delegates to PromptManagementBase async implementation.
        )
r@   rµ   r  rì   rë   r  rï   r½   rÿ   r   N)r   Ú async_get_chat_completion_prompt)r/   r%   rº   rþ   r@   rµ   rì   r  rë   r  rï   r½   rÿ   r   s                 r   r  z4GitLabPromptManager.async_get_chat_completion_prompt>  sO   è ø€ ô& *×JÑJØØØØØØ-Ø 3Ø$;Ø#ØØ%Ø)Ø(CØ2Wô
÷ 
ð 	
ð 
ús   ‚'0©.ª0r¥   r6   )NNNNN)NNNN)r   N)NN)NNNFF)NNNNFF)!r7   r8   r9   r¦   r;   r:   r   r   r2   Úpropertyr±   r>   r´   Útupler¸   r¨   r   rÑ   rÇ   rà   rç   rê   r   r   r§   rî   r‡   r   rû   rý   r  ÚLiteLLMLoggingObjr  r<   r   r   rª   rª   	  s   „ ñð  !%ØØ-1ñà˜C ˜H‘~ðð ˜‘:ðð �4‰Zð	ð
 $ dÑ*óð& ð #ò ó ðð ð$Ð 5ò $ó ð$ð 37ð)ð
 ò)àð)ð ˜s C˜x™.¨4Ñ/ð)ð
 �4‰Zð)ð 
ˆs�D˜˜c˜‘NÐ"Ñ	#ó)ð8 6:Ø04Ø $Ø26Ø%)ñ.,à�t‘ð.,ð Ð'Ñ(ð.,ð ˜C ˜H‘~¨Ñ+¨dÑ2ð	.,ð
 ˜S #˜X™¨Ñ-ð.,ð ˜‘:ð.,ð ˜s C˜x™.¨4Ñ/ð.,ð ˜d™
ð.,ð 
ˆtÐ$Ñ% t¨C°¨H¡~¸Ñ'<Ð<Ñ	=ó.,ð`0¸ð 0ÀÐEUÑ@Vó 0ðn 6:Ø04Ø $Ø26ñà�t‘ðð ðð Ð-Ñ.ð	ð
 ˜C ˜H‘~¨Ñ+¨dÑ2ðð ˜S #˜X™¨Ñ-ðð ˜‘:ðð ˜s C˜x™.¨4Ñ/ðð 
óð t¨C¡yó ó$ð
%à˜‘:ð%ð   $Ñ&ð%ð "?ð	%ð
 
ó%ð $(Ø%)ñ.Kà˜‘:ð.Kð   $Ñ&ð.Kð  ™+ð	.Kð
 "?ð.Kð ˜D‘jð.Kð ˜d™
ð.Kð 
 ó.Kðj *.Ø#'Ø%)ñ
à˜‘:ð
ð  ™+ð
ð "?ð	
ð
   $Ñ&ð
ð ˜D‘jð
ð ˜d™
ð
ð 
 ó
ðB *.Ø#'Ø%)Ø38Ø=Bñ
àð
ð Ð'Ñ(ð
ð !ð	
ð
 ˜‘:ð
ð  ™+ð
ð "?ð
ð   $Ñ&ð
ð ˜D‘jð
ð ˜d™
ð
ð &*¨D¡[ð
ð 04°d©{ð
ð 
ˆs�DÐ)Ñ*¨DÐ0Ñ	1ó
ðH *.Ø#'Ø#'Ø%)Ø38Ø=Bñ"
àð"
ð Ð'Ñ(ð"
ð !ð	"
ð
 ˜‘:ð"
ð  ™+ð"
ð "?ð"
ð /ð"
ð   $Ñ&ð"
ð �D‰z˜DÑ ð"
ð ˜D‘jð"
ð ˜d™
ð"
ð &*¨D¡[ð"
ð 04°d©{ð"
ð 
ˆs�DÐ)Ñ*¨DÐ0Ñ	1ô"
r   rª   c            	       ó  — e Zd ZdZdddœdeeef   dedz  dedz  ddfd„Zd	d
œde	deeeeef   f   fd„Z
d	d
œde	deeeeef   f   fd„Zdee   fd„Zdee   fd„Zdedeeef   dz  fd„Zdedeeef   dz  fd„Zdededeeef   fd„Zy)ÚGitLabPromptCachea­  
    Cache all .prompt files from a GitLab repo into memory.

    - Keys are the *repo file paths* (e.g. "prompts/chat/greet/hi.prompt")
      mapped to JSON-like dicts containing content + metadata.
    - Also exposes a by-ID view (ID == path relative to prompts_path without ".prompt",
      e.g. "greet/hi").

    Usage:

        cfg = {
            "project": "group/subgroup/repo",
            "access_token": "glpat_***",
            "prompts_path": "prompts/chat",  # optional, can be empty for repo root
            # "branch": "main",              # default is "main"
            # "tag": "v1.2.3",               # takes precedence over branch
            # "base_url": "https://gitlab.com/api/v4"  # default
        }

        cache = GitLabPromptCache(cfg)
        cache.load_all()  # fetch + parse all .prompt files

        print(cache.list_files())  # repo file paths
        print(cache.list_ids())    # template IDs relative to prompts_path

        prompt_json = cache.get_by_file("prompts/chat/greet/hi.prompt")
        prompt_json2 = cache.get_by_id("greet/hi")

        # If GitLab content changes and you want to refresh:
        cache.reload()  # re-scan and refresh all
    N)rA   rB   r?   rA   rB   r   c                ó~   — t        |d ||¬«      | _        | j                  j                  | _        i | _        i | _        y r³   )rª   r´   Útemplate_managerÚ_by_fileÚ_by_id)r/   r?   rA   rB   s       r   r2   zGitLabPromptCache.__init__„  sC   € ô 2Ø'ØØØ'ô	
ˆÔð 8<×7JÑ7J×7YÑ7YˆÔð 46ˆŒØ13ˆ�r   Tri   rj   c                ó  — | j                   j                  |¬«      }|D ]á  }|| j                   j                  vr| j                   j                  |«       | j                   j	                  |«      }|€6| j                   j                  |«       | j                   j	                  |«      }|€ŒŒ| j                   j                  |«      }| j                  ||«      }|| j                  |<   t        |«      }|| j                  |<   Œã | j                  S )z 
        Scan GitLab for all .prompt files under prompts_path, load and parse each,
        and return the mapping of repo file path -> JSON-like dict.
        ri   )
r  rl   rQ   rU   r–   rY   Ú_template_to_jsonr  r   r  )r/   rj   ræ   rp   Útmplre   Úentryr   s           r   Úload_allzGitLabPromptCache.load_allœ  sû   € ð
 ×*Ñ*×9Ñ9ÀIÐ9ÓNˆØò 	,ˆCà˜$×/Ñ/×7Ñ7Ñ7Ø×%Ñ%×>Ñ>¸sÔCà×(Ñ(×5Ñ5°cÓ:ˆDØˆ|à×%Ñ%×>Ñ>¸sÔCØ×,Ñ,×9Ñ9¸#Ó>�Øˆ|Øà×-Ñ-×>Ñ>¸sÓCˆIØ×*Ñ*¨3°Ó5ˆEà',ˆD�M‰M˜)Ñ$ä)¨#Ó.ˆJØ&+ˆD�K‰K˜
Ò#ð'	,ð, �{‰{Ðr   c                óŽ   — | j                   j                  «        | j                  j                  «        | j                  |¬«      S )z(Clear the cache and re-load from GitLab.ri   )r  Úclearr  r  )r/   rj   s     r   ÚreloadzGitLabPromptCache.reloadº  s3   € à�‰×ÑÔØ�‰×ÑÔØ�}‰} yˆ}Ó1Ð1r   c                 óH   — t        | j                  j                  «       «      S )z,Return the repo file paths currently cached.)r¨   r  rã   r4   s    r   rœ   zGitLabPromptCache.list_filesÀ  s   € ä�D—M‘M×&Ñ&Ó(Ó)Ð)r   c                 óH   — t        | j                  j                  «       «      S )zWReturn the template IDs (relative to prompts_path, without extension) currently cached.)r¨   r  rã   r4   s    r   Úlist_idszGitLabPromptCache.list_idsÄ  s   € ä�D—K‘K×$Ñ$Ó&Ó'Ð'r   re   c                 ó8   — | j                   j                  |«      S )z+Get a cached prompt JSON by repo file path.)r  r+   )r/   re   s     r   Úget_by_filezGitLabPromptCache.get_by_fileÈ  s   € à�}‰}× Ñ  Ó+Ð+r   r@   c                 óØ   — || j                   v r| j                   |   S t        |«      }t        |«      }| j                   j                  |«      xs | j                   j                  |«      S )zAGet a cached prompt JSON by prompt ID (relative to prompts_path).)r  r   r   r+   )r/   r@   ÚdecodedÚencodeds       r   Ú	get_by_idzGitLabPromptCache.get_by_idÌ  sX   € à˜Ÿ™Ñ#Ø—;‘;˜yÑ)Ð)ô *¨)Ó4ˆÜ)¨'Ó2ˆà�{‰{�‰˜wÓ'ÒC¨4¯;©;¯?©?¸7Ó+CÐCr   r  c           	      ó
  — t        |j                  xs i «      }|j                  }|j                  }|j                  }t        |j
                  xs i «      }|| j                  j                  |«      |j                  |||||dœS )zc
        Normalize a GitLabPromptTemplate into a JSON-like dict that is easy to serialize.
        )Úidr^   r#   r$   r%   r'   r(   r.   )	r;   r$   r%   r'   r(   r.   r  rY   r#   )r/   r@   r  Úmdr%   r'   r(   r.   s           r   r  z#GitLabPromptCache._template_to_jsonÛ  s„   € ô
 ˜Ÿ™Ò,¨"Ó-ˆð —z‘zˆØ!×-Ñ-ˆØ ŸO™Oˆ
Ü!% d×&:Ñ&:Ò&@¸bÓ!Aˆð Ø×)Ñ)×:Ñ:¸9ÓEØ—|‘|ØØØ&Ø$Ø.ñ	
ð 		
r   )r7   r8   r9   r¦   r;   r:   r   r   r2   r§   r  r  r¨   rœ   r  r  r   r!   r  r<   r   r   r  r  c  s)  „ ñðH Ø-1ò4à˜C ˜H‘~ð4ð �4‰Zð	4ð
 $ dÑ*ð4ð 
ó4ð0 -1ò  Tð °T¸#¸tÀCÈÀH¹~Ð:MÑ5Nó ð< +/ò 2 4ð 2°4¸¸TÀ#ÀsÀ(¹^Ð8KÑ3Ló 2ð*˜D ™Ió *ð(˜$˜s™)ó (ð, Sð ,¨T°#°s°(©^¸dÑ-Bó ,ð	D 3ð 	D¨4°°S°©>¸DÑ+@ó 	Dð
¨3ð 
Ð6Jð 
ÈtÐTWÐY\ÐT\É~ô 
r   r  N)#r¦   Útypingr   r   r   Újinja2r   r   Újinja2.sandboxr   Ú-litellm.integrations.custom_prompt_managementr	   Ú*litellm.litellm_core_utils.litellm_loggingr
   r	  Ú)litellm.integrations.gitlab.gitlab_clientr   Ú+litellm.integrations.prompt_management_baser   r   Úlitellm.types.llms.openair   Ú"litellm.types.prompts.init_promptsr   Úlitellm.types.utilsr   r   Ú__annotations__r:   r   r   r!   r>   rª   r  r<   r   r   ú<module>r/     sŸ   ðò÷ -Ñ ,ç 0Ý 8å PáÞWàÐÝ B÷õ 7Ý 9Ý =à!€ˆuÓ !ð9˜Sð 9 Só 9ð? ð ?¨ó ?÷Vñ V÷*G=ñ G=ôTW
Ð0ô W
÷t
N
ò N
r   