Ë
    tPêjÕp  ã                   óŽ  — U d Z ddlZddlmZmZ ddlmZmZmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZmZmZmZ ddlmZmZmZ e	r*ddlmZ dd	lmZ dd
lmZ ddlm Z! ddlm"Z# ddlm$Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZI  edd¬«      ZJeeKd<   e	r G d„ deeJ   «      ZL G d„ de«      ZMede5d d!fd"„«       ZNede7d d#fd$„«       ZNede6d d%fd&„«       ZNede;d d'fd(„«       ZNede9d d)fd*„«       ZNede3d d+fd,„«       ZNde5e7z  e6z  e;z  e9z  e3z  d eOfd-„ZN e«       ZPeeKd.<    eB eAd/d0d1¬2«       eAd3d4d5¬2«       eAd6d7d8¬2«      g eAd/d0d9¬2«       eAd3d4d:¬2«      g¬;«      ZQeeKd<<   ePj¥                  d=d>g ee1«      geB¬?«       ee1«      fd@e/fdA„«       ZSePj¥                  dBd>g ee1«      ge@¬?«      d ee1«      fdCe?dz  d@e/fdD„«       ZTdEeUdz  d edz  fdF„ZV G dG„ dHe«      ZW G dI„ dJe«      ZX eeYeX   «      ZZeeKdK<   ePj¥                  dLd>g ee1«      geG¬?«      	 	 dyd@e
e/ ee1«      f   dMe
eUdz   edN¬O«      f   dPe
eUdz   edQ¬O«      f   fdR„«       Z[ePj¥                  dSd>g ee1«      ge>¬?«       ee1«      fdTeUd@e/fdU„«       Z\e]eUeOf   eYeO   z  eUz  e^z  e_z  e`z  dz  ZaeeKdV<    eea«      Zbeeea      eKdW<    ee]eUeOf   «      ZceeKdX<   dzdYdZd[e^d eUdz  fd\„Zddzd]eOd[e^d eUdz  fd^„ZeePj¥                  d_d>g ee1«      geI¬?«       ed`d`¬a«       edbd`dc¬d«       edde¬O«       edde¬O«       ee1«      fdTeUdfe^dge^dMeUdz  dPeUdz  d@e/fdh„«       ZfePj¥                  did>g ee1«      ge=¬?«       ee1«      fdTeUd@e/fdj„«       ZgdkdldmeUd eUdz  fdn„ZhdkdldoeUd eUdz  fdp„ZiePjÕ                  dqd>g ee1«      geD¬?«       ee1«      fdreCd@e/fds„«       ZkePjÙ                  dtd>g ee1«      g¬u«       eddv¬O«       eddw¬O«       ee1«      fdTeUdoeUdz  dmeUdz  d@e/fdx„«       Zmy){az  
TOOL POLICY MANAGEMENT

All /tool management endpoints

GET  /v1/tool/list              - List all discovered tools and their policies
GET  /v1/tool/policy/options    - List available input/output policy options with descriptions
GET  /v1/tool/{tool_name}       - Get a single tool's details
POST /v1/tool/policy            - Update the input_policy / output_policy for a tool
é    N)ÚMappingÚSequence)ÚdatetimeÚ	timedeltaÚtimezone)ÚTYPE_CHECKINGÚ	AnnotatedÚFinalÚProtocolÚ	TypeAliasÚTypeVarÚoverload)Ú	APIRouterÚDependsÚHTTPExceptionÚQuery)Ú	BaseModelÚFieldÚTypeAdapter)ÚLiteLLM_DailyToolSpend)ÚLiteLLM_ObjectPermissionTable)ÚLiteLLM_SpendLogs)ÚLiteLLM_SpendLogToolIndex)ÚLiteLLM_TeamTable)ÚLiteLLM_VerificationToken)ÚPrismaClient)Úverbose_proxy_logger)ÚTOOL_SPEND_TOP_TOOLS)ÚCommonProxyErrorsÚLitellmUserRolesÚUserAPIKeyAuth)Úuser_api_key_auth)ÚObjectPermissionRepository)ÚDailyToolSpendRepositoryÚSpendLogsRepositoryÚSpendLogToolIndexRepository)ÚTeamRepository)ÚVerificationTokenRepository)ÚLiteLLM_ToolTableRowÚToolDetailResponseÚToolInputPolicyÚToolListResponseÚToolPolicyOptionÚToolPolicyOptionsResponseÚToolPolicyUpdateRequestÚToolPolicyUpdateResponseÚToolSpendDailyEntryÚToolSpendEntryÚToolSpendResponseÚToolUsageLogEntryÚToolUsageLogsResponseÚ_RowT_coT)Ú	covariantc                   ó”  — e Zd Z	 	 	 	 ddeeef   dz  deeef   eeeef      z  dz  dedz  dedz  dee   f
d„Z	deeef   dedz  fd„Z
ddeeef   dz  defd	„Zd
eeef   defd„Zdeeef   d
eeef   defd„Zdeeef   dedz  fd„Z	 	 	 	 ddee   deeef   dz  deeef   dz  deeef   dz  dedz  deeeef      fd„Zy)Ú	_TableOpsNÚwhereÚorderÚskipÚtakeÚreturnc              ƒ   ó   K  — y ­w©N© )Úselfr:   r;   r<   r=   s        ú�/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/management_endpoints/tool_management_endpoints.pyÚ	find_manyz_TableOps.find_manyA   s   è ø€ ð "%ùó   ‚c              ƒ   ó   K  — y ­wr@   rA   ©rB   r:   s     rC   Úfind_uniquez_TableOps.find_uniqueI   ó   è ø� ùrE   c              ƒ   ó   K  — y ­wr@   rA   rG   s     rC   Úcountz_TableOps.countK   rI   rE   Údatac              ƒ   ó   K  — y ­wr@   rA   )rB   rL   s     rC   Úcreatez_TableOps.createM   rI   rE   c              ƒ   ó   K  — y ­wr@   rA   )rB   r:   rL   s      rC   Úupdate_manyz_TableOps.update_manyO   s   è ø€ ð ùrE   c              ƒ   ó   K  — y ­wr@   rA   rG   s     rC   Údeletez_TableOps.deleteU   rI   rE   ÚbyÚsumc              ƒ   ó   K  — y ­wr@   rA   )rB   rS   rT   r:   r;   r=   s         rC   Úgroup_byz_TableOps.group_byW   s   è ø€ ð .1ùrE   )NNNNr@   )Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚobjectr   Úintr6   rD   rH   rK   rN   rP   rR   ÚboolrV   rA   ó    rC   r9   r9   @   s¬  „ ð 26ØRVØ#Ø#ñ	%à˜3 ˜;Ñ'¨$Ñ.ð	%ð ˜3 ˜;Ñ'¨(°7¸3À¸;Ñ3GÑ*HÑHÈ4ÑOð	%ð ˜‘*ð		%ð
 ˜‘*ð	%ð �hÑó	%ð 	Y¨7°3¸°;Ñ+?ÐXÀHÈtÁOÓXáT W¨S°&¨[Ñ%9¸DÑ%@ÐTÈCÓTàK W¨S°&¨[Ñ%9ÐK¸hÓKð	à˜3 ˜;Ñ'ð	ð ˜#˜v˜+Ñ&ð	ð ó		ð 	T g¨c°6¨kÑ&:ÐS¸xÈ$¹ÓSð
 .2Ø15Ø15Ø#ñ	1à˜‘ð	1ð ˜˜d˜Ñ# dÑ*ð	1ð ˜3 ˜;Ñ'¨$Ñ.ð		1ð
 ˜3 ˜;Ñ'¨$Ñ.ð	1ð ˜‘*ð	1ð �g˜c 6˜kÑ*Ñ+ô	1r^   r9   c                   óN   — e Zd Zedefd„«       Zedeeeef   z  dz  fd„«       Zy)Ú_SpendLogRowr>   c                  ó   — y r@   rA   ©rB   s    rC   Úmessagesz_SpendLogRow.messagesa   s   € Ø&)r^   Nc                  ó   — y r@   rA   rb   s    rC   Úproxy_server_requestz!_SpendLogRow.proxy_server_requestc   s   € ØMPr^   )	rW   rX   rY   Úpropertyr[   rc   rZ   r   re   rA   r^   rC   r`   r`   `   s;   „ Ø	Ø)˜fÒ)ó 
Ø)Ø	ØP¨#°¸¸V¸Ñ0DÑ*DÀtÑ*KÒPó 
ÙPr^   r`   Úrepor>   z"_TableOps[PrismaDailyToolSpendRow]c                  ó   — y r@   rA   ©rg   s    rC   Ú_typed_tablerj   g   s   € ØZ]r^   z%_TableOps[PrismaSpendLogToolIndexRow]c                  ó   — y r@   rA   ri   s    rC   rj   rj   i   ó   € Ø`cr^   z_TableOps[PrismaSpendLogRow]c                  ó   — y r@   rA   ri   s    rC   rj   rj   k   s   € ØORr^   z%_TableOps[PrismaVerificationTokenRow]c                  ó   — y r@   rA   ri   s    rC   rj   rj   m   rl   r^   z_TableOps[PrismaTeamRow]c                  ó   — y r@   rA   ri   s    rC   rj   rj   o   s   € ØFIr^   z$_TableOps[PrismaObjectPermissionRow]c                  ó   — y r@   rA   ri   s    rC   rj   rj   q   s   € Ø^ar^   c                 ó   — | j                   S r@   )Útableri   s    rC   rj   rj   s   s   € ð �:‰:Ðr^   ÚrouterÚ	untrustedÚ	UntrustedzgTool accepts any input, including data from untrusted tool outputs. Default for newly discovered tools.)ÚvalueÚlabelÚdescriptionÚtrustedÚTrustedztTool requires trusted input. Blocked if the conversation contains output from any tool with output_policy=untrusted.ÚblockedÚBlockedzBTool is completely prohibited. Any attempt to call it is rejected.z‚Tool output may contain unsafe content (prompt injection, risky code). Downstream tools with input_policy=trusted will be blocked.zVTool output is verified safe. Will not trigger trust-chain blocks on downstream tools.)Úinput_policiesÚoutput_policiesÚTOOL_POLICY_OPTIONSz/v1/tool/policy/optionsztool management)ÚtagsÚdependenciesÚresponse_modelÚuser_api_key_dictc              ƒ   ó   K  — t         S ­w)uq   
    Return the available input and output policy options with descriptions.
    Static data â€” no DB call.
    )r   )rƒ   s    rC   Úget_tool_policy_optionsr…   ¡   s   è ø€ ô Ðùs   ‚	z/v1/tool/listÚinput_policyc              ƒ   ó@  K  — ddl m} ddlm} |€%t	        dt
        j                  j                  ¬«      ‚	  ||| ¬«      ƒ d{  –—† }t        |t        |«      ¬«      S 7 Œ# t        $ r1}t        j                  d	|«       t	        dt        |«      ¬«      ‚d}~ww xY w­w)
už   
    List all auto-discovered tools and their policies.

    Parameters:
    - input_policy: Optional filter â€” one of "trusted", "untrusted", "blocked"
    r   )Ú
list_tools©Úprisma_clientNéô  ©Ústatus_codeÚdetail)rŠ   r†   )ÚtoolsÚtotalzError listing tools: %s)Ú%litellm.proxy.db.tool_registry_writerrˆ   Úlitellm.proxy.proxy_serverrŠ   r   r   Údb_not_connected_errorrv   r,   ÚlenÚ	Exceptionr   Ú	exceptionrZ   )r†   rƒ   Údb_list_toolsrŠ   r�   Úes         rC   rˆ   rˆ   ±   sŒ   è ø€ õ  RÝ8àÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcð<Ù*¸ÐUaÔb×bˆÜ e´3°u³:Ô>Ð>ð cùäò <Ü×&Ñ&Ð'@À!ÔDÜ¨´C¸³FÔ;Ð;ûð<üs:   ‚4B·A! ÁAÁA! ÁBÁA! Á!	BÁ*,BÂBÂBrv   c                 óÊ   — | sy 	 t        j                  | j                  «       d«      j                  t        j
                  ¬«      S # t        $ r t        dd| › d�¬«      ‚w xY w)Nú%Y-%m-%d©Útzinfoé�  zInvalid date format: z. Expected: 'YYYY-MM-DD'rŒ   )r   ÚstrptimeÚstripÚreplacer   ÚutcÚ
ValueErrorr   )rv   s    rC   Ú_parse_day_startr£   Ï   sd   € ÙØð
Ü× Ñ  §¡£°
Ó;×CÑCÌ8Ï<É<ÐCÓXÐXøÜò 
ÜØØ*¨5¨'Ð1IÐJô
ð 	
ð
ús   …AA ÁA"c                   ó8   — e Zd ZU dZeed<   dZeed<   dZeed<   y)Ú_ToolSpendSumsg        Úspendr   Útotal_tokensÚrequest_countN)	rW   rX   rY   r¦   ÚfloatÚ__annotations__r§   r\   r¨   rA   r^   rC   r¥   r¥   Û   s    … Ø€Eˆ5ÓØ€L�#ÓØ€M�3Ôr^   r¥   c                   ó4   — e Zd ZU eed<    ed¬«      Zeed<   y)Ú_TopToolRowÚ	tool_nameÚ_sum)ÚaliasÚsumsN)rW   rX   rY   rZ   rª   r   r°   r¥   rA   r^   rC   r¬   r¬   á   s   … ØƒNÙ  vÔ.€Dˆ.Ô.r^   r¬   Ú_TOP_TOOL_ROWSz/v1/tool/spendÚ
start_datez$YYYY-MM-DD (defaults to 30 days ago))rx   Úend_datezYYYY-MM-DD (defaults to today)c           
   ƒ   óˆ  K  — ddl m} | j                  t        j                  t        j
                  fvrt        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚t        |«      xs# t        j                  t        j                  «      }t        |«      xs |t        d¬	«      z
  }|j!                  d
«      }|j!                  d
«      }d||dœi}t#        t%        |«      «      }	t&        j)                  |	j+                  dgddddœ|dddiit,        ¬«      ƒ d{  –—† xs g «      }
|
D �cg c]W  }t/        |j0                  |j2                  j4                  |j2                  j6                  |j2                  j8                  ¬«      ‘ŒY }}|
rA|	j;                  i |¥dd|
D �cg c]  }|j0                  ‘Œ c}ii¥ddiddig¬«      ƒ d{  –—† ng }|D �cg c]9  }t=        |j>                  |j0                  |j4                  |j6                  ¬«      ‘Œ; }}tA        ||||¬«      S 7 �Œc c}w c c}w 7 Œfc c}w ­w)aÜ  
    Spend attributed to each tool over a date range, for the Cost Optimization dashboard.

    Reads the ``LiteLLM_DailyToolSpend`` rollup, written at request time from invoked
    tools only (MCP tool calls and response tool_calls; declaring a tool without
    invoking it does not count). A request that invoked multiple tools counts its
    full spend toward each of them, so per-tool numbers are attributions and do not
    sum to a deduplicated total.

    ``by_tool`` is the top ``TOOL_SPEND_TOP_TOOLS`` tools by spend, aggregated in
    SQL, and ``daily`` covers only those tools, so the response is bounded by
    days x TOOL_SPEND_TOP_TOOLS regardless of the requested range or how many
    distinct tool names exist.
    r   r‰   i“  z@Only proxy admin roles can view tool spend across the deploymentrŒ   Nr‹   é   )Údaysrš   Údate)ÚgteÚlter­   T)r¦   r§   r¨   r®   r¦   Údesc)rS   rT   r:   r;   r=   )r­   r¦   Ú
call_countr§   ÚinÚasc)r:   r;   )r·   r­   r¦   r»   )Úby_toolÚdailyr²   r³   )!r’   rŠ   Ú	user_roler    ÚPROXY_ADMINÚPROXY_ADMIN_VIEW_ONLYr   r   r“   rv   r£   r   Únowr   r¡   r   Ústrftimerj   r$   r±   Úvalidate_pythonrV   r   r2   r­   r°   r¦   r¨   r§   rD   r1   r·   r3   )rƒ   r²   r³   rŠ   Úend_dayÚ	start_dayÚ	start_strÚend_strÚdate_windowrr   Ú	top_toolsÚrowr¾   Ú
daily_rowsr¿   s                  rC   Úget_tool_spendrÎ   é   sL  è ø€ õ2 9à×"Ñ"Ü×$Ñ$Ü×.Ñ.ð+ñ ô ØØUô
ð 	
ð
 ÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcä% hÓ/ÒM´8·<±<ÄÇÁÓ3M€GÜ'¨
Ó3ÒS°wÄÐPRÔASÑ7S€IØ ×)Ñ)¨*Ó5€IØ×%Ñ% jÓ1€GØ ¨)¸GÑ"DÐE€KäÔ 8¸Ó GÓH€EÜ%×5Ñ5Ø�n‰nØˆ}Ø°ÀtÑLØØ˜G VÐ,Ð-Ü%ð ó 
÷ 	
ò 	ð ó	€Ið" öð ô 	Ø—m‘mØ—(‘(—.‘.Ø—x‘x×-Ñ-ØŸ™×.Ñ.ö		
ð€Gð ñ ð	 �o‰oØ\�[Ð\ +°ÐPYÖ6ZÈ°s·}³}Ò6ZÐ/[Ñ\Ø˜E�? W¨fÐ$5Ð6ð ó 
÷ 	
ð 	
ð
 ð ð öàô 	 §¡°S·]±]È#Ï)É)Ð`c×`qÑ`qÖrð€Eð ô  W°EÀiÐZaÔbÐbð?	
ûòùò 7[ð	
úòùsO   ‚D%IÄ'H.Ä(IÄ8AH1ÆIÆ,H6Æ?IÇH;Ç
IÇ>H=ÈIÈ1IÈ=Iz /v1/tool/{tool_name:path}/detailr­   c              ƒ   óš  K  — ddl m} ddl m} ddlm} |€%t        dt        j                  j                  ¬«      ‚	  ||| ¬«      ƒ d{  –—† }|€t        d	d
| › d�¬«      ‚ ||| ¬«      ƒ d{  –—† }t        ||¬«      S 7 Œ67 Œ# t
        $ r ‚ t        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)zK
    Get a single tool with its policy overrides (for UI detail view).
    r   ©Úget_tool)Úlist_overrides_for_toolr‰   Nr‹   rŒ   ©rŠ   r­   é”  úTool 'ú' not found)ÚtoolÚ	overrideszError getting tool detail: %s)r‘   rÑ   rÒ   r’   rŠ   r   r   r“   rv   r*   r•   r   r–   rZ   )r­   rƒ   Údb_get_toolrÒ   rŠ   r×   rØ   r˜   s           rC   Úget_tool_detailrÚ   :  sÇ   è ø€ õ NÝMÝ8àÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcð
<Ù'°mÈyÔY×YˆØˆ<Ü¨C¸&ÀÀÈ;Ð8WÔXÐXÙ!8À}Ð`iÔ!j×jˆ	Ü! t°yÔAÐAð	 Zøð kùäò ØÜò <Ü×&Ñ&Ð'FÈÔJÜ¨´C¸³FÔ;Ð;ûð<üsL   ‚:C½B Á
BÁ$B Á/BÁ0B Â CÂB ÂB ÂCÂ,CÃCÃCÚ_ParsedJsonÚ_PARSED_JSONÚ_STR_OBJECT_DICTÚslz_SpendLogRow | NoneÚmax_lenc                 ó  — | €y| j                   }|�t        ||«      }|r|S | j                  }|syt        |t        «      r)ddl}	 t        j                  |j                  |«      «      }t        |t        «      rh|j                  d«      }|€E|j                  d«      }t        |t        «      r$t        j                  |«      j                  d«      }t        ||«      }|r|S t        ||«      S # t        $ r t        ||«      cY S w xY w)zKShort snippet from messages or proxy_server_request for tool usage log row.Nr   rc   Úbody)rc   Ú_snippet_strre   Ú
isinstancerZ   ÚjsonrÜ   rÅ   Úloadsr•   ÚdictÚgetrÝ   )rÞ   rß   rc   ÚsÚpsrrä   Úmsgsrá   s           rC   Ú_input_snippet_for_tool_logrë   `  sø   € à	€zØØ—k‘k€HØÐÜ˜ 7Ó+ˆÙØˆHØ
×
!Ñ
!€CÙØÜ�#”sÔÛð	.Ü×.Ñ.¨t¯z©z¸#«Ó?ˆCô �#”tÔØ�w‰w�zÓ"ˆØˆ<ØŸ'™' &›/ˆDÜ˜$¤Ô%Ü'×7Ñ7¸Ó=×AÑAÀ*ÓM�Ü˜˜wÓ'ˆÙØˆHÜ˜˜WÓ%Ð%øô ò 	.Ü  WÓ-Ò-ð	.ús   Á$C. Ã.DÄDÚtextc                 óš  — | €y t        | t        «      r| }n–t        | t        «      r{g }| D ]b  }t        |t        «      r6d|v r2|d   }|j	                  t        |t        «      r|n
t        |«      «       ŒI|j	                  t        |«      «       Œd dj                  |«      }nt        | «      }|r|dk(  ry t        |«      |kD  r|d | dz   S |S )NÚcontentú z{}z...)rã   rZ   Úlistræ   ÚappendÚjoinr”   )rì   rß   rè   ÚpartsÚitemÚcs         rC   râ   râ     sÁ   € Ø€|ØÜ�$œÔØ‰Ü	�Dœ$Ô	ØˆØò 	(ˆDÜ˜$¤Ô%¨)°tÑ*;Ø˜‘O�Ø—‘¤*¨Q´Ô"4™Q¼#¸a»&ÕAà—‘œS ›YÕ'ð	(ð �H‰H�U‹O‰ä�‹IˆÙ��T’	ØÜ$'¨£F¨WÒ$4ˆAˆhˆwˆK˜%ÑÐ;¸!Ð;r^   z/v1/tool/{tool_name:path}/logsé   )Úgeé2   éd   )r÷   Úlez
YYYY-MM-DDÚpageÚ	page_sizec              ƒ   ó  K  — ddl m} |€%t        dt        j                  j
                  ¬«      ‚	 d| i}|s|r�d}d}	|r8	 t        j                  |dz   d«      j                  t        j                  ¬	«      }|r8	 t        j                  |d
z   d«      j                  t        j                  ¬	«      }	|€|	�!d|fd|	ffD �
�ci c]
  \  }
}|�|
|“Œ c}}
|d<   t        t        |«      «      j                  |¬«      ƒ d{  –—† }t        t        |«      «      j                  |ddi|dz
  |z  |¬«      ƒ d{  –—† }|D �cg c]  }|j                   ‘Œ }}|st#        g |||¬«      S t        t%        |«      «      j                  dd|ii¬«      ƒ d{  –—† }|D �ci c]  }|j                   |“Œ }}g }|D ]½  }|j'                  |j                   «      }|sŒ!t)        |j*                  d«      r|j*                  j-                  «       nt/        |j*                  «      }|j1                  t3        |j                   |t5        |dd«      xs dt5        |dd«      t5        |dd«      t7        |«      ¬«      «       Œ¿ t#        ||||¬«      S # t        $ r Y �Œw xY w# t        $ r Y �Œëw xY wc c}}
w 7 �Œ©7 �Œuc c}w 7 �Œ#c c}w # t        $ r ‚ t8        $ r1}t;        j<                  d|«       t        dt/        |«      ¬«      ‚d}~ww xY w­w)zÂ
    Return paginated spend logs for requests that invoked this tool (from SpendLogToolIndex).
    Declaring a tool in a request body without the model invoking it does not create an entry.
    r   r‰   Nr‹   rŒ   r­   z	T00:00:00z%Y-%m-%dT%H:%M:%Sr›   z	T23:59:59r¸   r¹   Ú
start_time©r:   rº   rö   )r:   r;   r<   r=   )Úlogsr�   rû   rü   Ú
request_idr¼   Ú	isoformatÚmodelr¦   r§   )ÚidÚ	timestampr  r¦   r§   Úinput_snippetz!Error getting tool usage logs: %s)r’   rŠ   r   r   r“   rv   r   rž   r    r   r¡   r¢   rj   r&   rK   rD   r  r5   r%   rç   ÚhasattrÚ	startTimer  rZ   rñ   r4   Úgetattrrë   r•   r   r–   )r­   rû   rü   r²   r³   rƒ   rŠ   r:   Ústart_time_filterÚend_time_filterÚkeyrv   r�   Ú
index_rowsÚrÚrequest_idsÚ
spend_logsrè   Ú	log_by_idÚlogs_outrÞ   Útsr˜   s                          rC   Úget_tool_usage_logsr  ”  s/  è ø€ õ$ 9àÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcð@<Ø+6¸	Ð*BˆÙ™Ø15ÐØ/3ˆOÙðÜ(0×(9Ñ(9¸*À{Ñ:RÐTgÓ(h×(pÑ(pÜ'Ÿ|™|ð )qó )Ð%ñ
 ðÜ&.×&7Ñ&7¸À;Ñ8NÐPcÓ&d×&lÑ&lÜ'Ÿ|™|ð 'mó '�Oð
 !Ð,°Ð0Kð ).Ð/@Ð'AÀEÈ?ÐC[Ð&\÷'á"˜˜UØÐ(ð ˜‘Jó'��lÑ#ô *Ô*EÀmÓ*TÓU×[Ñ[ÐbgÐ[Óh×hˆÜ".Ô/JÈ=Ó/YÓ"Z×"dÑ"dØØ Ð(Ø˜‘(˜iÑ'Øð	 #eó #
÷ 
ˆ
ð 5?Ö?¨q˜aŸl›lÐ?ˆÐ?ÙÜ(¨b¸ÀDÐT]Ô^Ð^ä'Ô(;¸MÓ(JÓK×UÑUØ $¨Ð!4Ð5ð Vó 
÷ 
ˆ
ð 6@Ö@°˜AŸL™L¨!™OÐ@ˆ	Ð@à35ˆØò 	ˆAØ—‘˜qŸ|™|Ó,ˆBÙØÜ-4°R·\±\À;Ô-O�—‘×'Ñ'Ô)ÔUXÐY[×YeÑYeÓUfˆBØ�O‰OÜ!Ø—}‘}Ø Ü! " g¨tÓ4Ò<¸Ü! " g¨tÓ4Ü!(¨¨^¸TÓ!BÜ"=¸bÓ"Aôõ	ð	ô  %¨(¸%ÀdÐV_Ô`Ð`øôc "ò Úðûô "ò Úðüó'ð iùð
ûò @ð
ûò Aøô( ò ØÜò <Ü×&Ñ&Ð'JÈAÔNÜ¨´C¸³FÔ;Ð;ûð<üs×   ‚.K?±J9 Á 7J  Á7J9 Á:7J Â1J9 Ã J Ã.J9 Ã=J&Ã>6J9 Ä4J)Ä5J9 Ä=J,ÅJ9 Å"K?Å#+J9 ÆJ1ÆJ9 ÆJ4Æ+CJ9 É?K?Ê 	JÊ	J9 ÊJÊJ9 Ê	JÊJ9 ÊJÊ
J9 Ê)J9 Ê,J9 Ê4J9 Ê9K<Ë,K7Ë7K<Ë<K?z/v1/tool/{tool_name:path}c              ƒ   óP  K  — ddl m} ddlm} |€%t	        dt
        j                  j                  ¬«      ‚	  ||| ¬«      ƒ d{  –—† }|€t	        dd	| › d
�¬«      ‚|S 7 Œ# t        $ r ‚ t        $ r1}t        j                  d|«       t	        dt        |«      ¬«      ‚d}~ww xY w­w)z(
    Get details for a single tool.
    r   rÐ   r‰   Nr‹   rŒ   rÓ   rÔ   rÕ   rÖ   zError getting tool: %s)r‘   rÑ   r’   rŠ   r   r   r“   rv   r•   r   r–   rZ   )r­   rƒ   rÙ   rŠ   r×   r˜   s         rC   rÑ   rÑ   î  s§   è ø€ õ NÝ8àÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcð	<Ù'°mÈyÔY×YˆØˆ<Ü¨C¸&ÀÀÈ;Ð8WÔXÐXØˆð Zùô ò ØÜò <Ü×&Ñ&Ð'?ÀÔCÜ¨´C¸³FÔ;Ð;ûð<üs:   ‚4B&·A  ÁAÁA  ÁB&ÁA  Á B#Á2,BÂB#Â#B&rŠ   r   Úkey_hashc              ƒ   óº  K  — ddl m} d|xs dvr|n ||«      }|syt        t        | «      «      j	                  d|i¬«      ƒ d{  –—† }|€y|j
                  }|r|S t        t        j                  «       «      }t        t        | «      «      j                  |g dœ¬	«      ƒ d{  –—†  t        t        | «      «      j                  |dd
œd|i¬«      ƒ d{  –—† }|dk(  rlt        t        | «      «      j                  d|i¬«      ƒ d{  –—†  t        t        | «      «      j	                  d|i¬«      ƒ d{  –—† }|r|j
                  S dS |S 7 �Œ	7 Œ¬7 Œ|7 ŒK7 Œ­w)zUResolve key (hash or raw) to object_permission_id; create permission if key has none.r   )Ú
hash_tokenzsk-Ú NÚtokenrÿ   ©Úobject_permission_idÚblocked_tools©rL   )r  r  r  ©r:   rL   )r’   r  rj   r(   rH   r  rZ   ÚuuidÚuuid4r#   rN   rP   rR   )rŠ   r  r  ÚhashedrÌ   Úop_idÚnew_idÚupdated_counts           rC   Ú)_resolve_key_hash_to_object_permission_idr&    st  è ø€ õ
 6à %¨hªn¸"Ñ =‘HÁ:ÈhÓCW€FÙØÜÔ8¸ÓGÓH×TÑTÐ\cÐekÐ[lÐTÓm×
m€CØ
€{ØØ×+Ñ+€EÙØˆÜœŸ
™
›Ó%€FÜ
Ô1°-Ó@Ó
A×
HÑ
HØ&,¸rÑBð Ió ÷ ð ô ".Ô.IÈ-Ó.XÓ!Y×!eÑ!eØ¸Ñ=Ø$ fÐ-ð "fó "÷ €Mð ˜ÒÜÔ5°mÓDÓE×LÑLÐTjÐlrÐSsÐLÓt×tÐtÜ Ô!<¸]Ó!KÓL×XÑXÐ`gÐioÐ_pÐXÓq×qˆÙ+.ˆs×'Ñ'Ð8°DÐ8Ø€Mð% nùðøðøð
 	uøØqús[   ‚AEÁEÁAEÂ&EÂ'1EÃEÃ2EÄEÄ-EÄ9EÄ:EÅEÅEÅEÅEÚteam_idc              ƒ   óÊ  K  — |r|j                  «       sy|j                  «       }t        t        | «      «      j                  d|i¬«      ƒ d{  –—† }|€y|j                  }|r|S t        t        j                  «       «      }t        t        | «      «      j                  |g dœ¬«      ƒ d{  –—†  t        t        | «      «      j                  |ddœd|i¬«      ƒ d{  –—† }|d	k(  rlt        t        | «      «      j                  d|i¬«      ƒ d{  –—†  t        t        | «      «      j                  d|i¬«      ƒ d{  –—† }|r|j                  S dS |S 7 �Œ	7 Œ¬7 Œ|7 ŒK7 Œ­w)
zLResolve team_id to object_permission_id; create permission if team has none.Nr'  rÿ   r  r  )r'  r  r  r  r   )rŸ   rj   r'   rH   r  rZ   r   r!  r#   rN   rP   rR   )rŠ   r'  Úteam_id_cleanrÌ   r#  r$  r%  s          rC   Ú(_resolve_team_id_to_object_permission_idr*  ,  si  è ø€ ñ
 ˜'Ÿ-™-œ/ØØ"Ÿ=™=›?€MÜœ^¨MÓ:Ó;×GÑGÈyÐZgÐNhÐGÓi×
i€CØ
€{ØØ×+Ñ+€EÙØˆÜœŸ
™
›Ó%€FÜ
Ô1°-Ó@Ó
A×
HÑ
HØ&,¸rÑBð Ió ÷ ð ô ".¬n¸]Ó.KÓ!L×!XÑ!XØ'ÀÑFØ$ fÐ-ð "Yó "÷ €Mð ˜ÒÜÔ5°mÓDÓE×LÑLÐTjÐlrÐSsÐLÓt×tÐtÜ ¤°Ó!>Ó?×KÑKÐS\Ð^kÐRlÐKÓm×mˆÙ+.ˆs×'Ñ'Ð8°DÐ8Ø€Mð% jùðøðøð
 	uøØmús[   ‚AE#ÁEÁAE#Â.EÂ/1E#Ã EÃ!2E#ÄEÄ-E#ÅE!ÅE#ÅE#ÅE#ÅE#Å!E#z/v1/tool/policyrL   c              ƒ   óÜ  K  — ddl m}m}m} ddl m} ddlm} |€%t        dt        j                  j                  ¬«      ‚	 | j                  €| j                  ��]| j                  �| j                  �t        dd	¬«      ‚| j                  �t        || j                  «      ƒ d{  –—† }n"t        || j                  xs d
«      ƒ d{  –—† }|€t        dd¬«      ‚| j                  dk(  }|r |||| j                   ¬«      ƒ d{  –—† }	n |||| j                   ¬«      ƒ d{  –—† }	|	st        dd| j                   › d�¬«      ‚ |«       }
|
j#                  «       r|
j%                  |«      ƒ d{  –—†  t'        | j                   | j                  | j(                  d| j                  | j                  ¬«      S | j                  €| j(                  €t        dd¬«      ‚ ||| j                   |j*                  | j                  | j(                  ¬«      ƒ d{  –—† }|€t        dd| j                   › d�¬«      ‚ |«       }
|
j#                  «       r|
j%                  |«      ƒ d{  –—†  t'        |j                   |j                  |j(                  d¬«      S 7 �Œï7 �ŒÏ7 �Œ•7 �Œz7 �Œ07 Œ�7 ŒB# t        $ r ‚ t,        $ r1}t/        j0                  d|«       t        dt3        |«      ¬«      ‚d}~ww xY w­w)aÃ  
    Set the input_policy and/or output_policy for a tool (global), or block for a specific team/key (override).

    Parameters:
    - tool_name: str - The tool to update
    - input_policy: optional - "trusted" | "untrusted" | "blocked"
    - output_policy: optional - "trusted" | "untrusted"
    - team_id: optional - if set, create/update override for this team only
    - key_hash: optional - if set, create/update override for this key only
    r   )Ú%add_tool_to_object_permission_blockedÚget_tool_policy_registryÚ*remove_tool_from_object_permission_blocked)Úupdate_tool_policyr‰   Nr‹   rŒ   r�   ú,Provide either team_id or key_hash, not bothr  rÔ   ú.Key or team not found for the given identifierr{   ©rŠ   r  r­   z+Failed to update policy override for tool 'ú'T)r­   r†   Úoutput_policyÚupdatedr'  r  z>At least one of input_policy or output_policy must be provided)rŠ   r­   Ú
updated_byr†   r4  z"Failed to update policy for tool ')r­   r†   r4  r5  zError updating tool policy: %s)r‘   r,  r-  r.  r/  r’   rŠ   r   r   r“   rv   r'  r  r&  r*  r†   r­   Úis_initializedÚsync_tool_policy_from_dbr0   r4  Úuser_idr•   r   r–   rZ   )rL   rƒ   r,  r-  r.  Údb_update_tool_policyrŠ   r#  Úis_blockingÚokÚregistryr5  r˜   s                rC   r/  r/  I  sï  è ø€ ÷(ñ õ
õ 9àÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcðM<Ø�<‰<Ð# t§}¡}Ñ'@Ø�|‰|Ð'¨D¯M©MÐ,EÜ#Ø #ØIôð ð �}‰}Ð(ÜGÈÐW[×WdÑWdÓe×e‘äFÀ}ÐVZ×VbÑVbÒVhÐfhÓi×i�Øˆ}Ü#Ø #ØKôð ð "&×!2Ñ!2°iÑ!?ˆKÙÙ@Ø"/Ø).Ø"Ÿn™nô÷ ‘ñ FØ"/Ø).Ø"Ÿn™nô÷ �ñ
 Ü#Ø #ØHÈÏÉÐHXÐXYÐZôð ñ 0Ó1ˆHØ×&Ñ&Ô(Ø×7Ñ7¸ÓF×FÐFÜ+ØŸ.™.Ø!×.Ñ.Ø"×0Ñ0ØØŸ™ØŸ™ôð ð ×ÑÐ$¨×);Ñ);Ð)CÜØØWôð ñ
  5Ø'Ø—n‘nØ(×0Ñ0Ø×*Ñ*Ø×,Ñ,ô 
÷ 
ˆð ˆ?ÜØØ;¸D¿N¹NÐ;KÈ1ÐMôð ñ ,Ó-ˆØ×"Ñ"Ô$Ø×3Ñ3°MÓB×BÐBÜ'Ø×'Ñ'Ø ×-Ñ-Ø!×/Ñ/Øô	
ð 	
ðw fùàiùðùðùð Gùð 
øð Cùô ò ØÜò <Ü×&Ñ&Ð'GÈÔKÜ¨´C¸³FÔ;Ð;ûð<üs¸   ‚>K,ÁA#J& Â$JÂ%"J& ÃJÃ<J& ÄJÄJ& Ä"JÄ#AJ& Å/JÅ0AJ& Æ6K,Æ7AJ& ÈJ"ÈAJ& É!J$É"0J& ÊK,ÊJ& ÊJ& ÊJ& ÊJ& ÊJ& Ê"J& Ê$J& Ê&K)Ê8,K$Ë$K)Ë)K,z#/v1/tool/{tool_name:path}/overrides)r€   r�   z!Team ID of the override to removez"Key hash of the override to removec              ƒ   óˆ  K  — ddl m}m} ddlm} |€%t        dt        j                  j                  ¬«      ‚|€|€t        dd¬«      ‚|�|�t        dd	¬«      ‚	 |�t        ||«      ƒ d{  –—† }nt        ||xs d
«      ƒ d{  –—† }|€t        dd¬«      ‚ |||| ¬«      ƒ d{  –—† }|st        dd| › d�¬«      ‚ |«       }	|	j                  «       r|	j                  |«      ƒ d{  –—†  d| dœS 7 Œ‡7 Œp7 ŒP7 Œ# t
        $ r ‚ t        $ r1}
t        j                  d|
«       t        dt!        |
«      ¬«      ‚d}
~
ww xY w­w)zv
    Remove a policy override for a tool. Specify the override by team_id or key_hash
    (exactly one required).
    r   )r-  r.  r‰   Nr‹   rŒ   r�   zHAt least one of team_id or key_hash is required to identify the overrider0  r  rÔ   r1  r2  zNo override found for tool 'z' with the given scopeT)Údeletedr­   z'Error deleting tool policy override: %s)r‘   r-  r.  r’   rŠ   r   r   r“   rv   r&  r*  r7  r8  r•   r   r–   rZ   )r­   r'  r  rƒ   r-  r.  rŠ   r#  r?  r=  r˜   s              rC   Údelete_tool_policy_overrider@  º  s|  è ø€ ÷õ 9àÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcØ€˜8Ð+ÜØØ]ô
ð 	
ð Ð˜xÐ3ÜØØAô
ð 	
ð<ØÐÜCÀMÐS[Ó\×\‰EäBÀ=ÐRYÒR_Ð]_Ó`×`ˆEØˆ=ÜØØGôð ñ  JØ'Ø!&Øô 
÷ 
ˆñ
 ÜØØ5°i°[Ð@VÐWôð ñ 3Ó4ˆØ×"Ñ"Ô$Ø×3Ñ3°MÓB×BÐBØ¨iÑ8Ð8ð+ ]øà`øð
øð Cùäò ØÜò <Ü×&Ñ&Ð'PÐRSÔTÜ¨´C¸³FÔ;Ð;ûð<üss   ‚AEÁC< Á,C4Á-C< ÂC6Â!C< Â'C8Â(AC< Ã*C:Ã+C< Ã3EÃ4C< Ã6C< Ã8C< Ã:C< Ã<D?Ä,D:Ä:D?Ä?E)NN)éÈ   )nÚ__doc__r   Úcollections.abcr   r   r   r   r   Útypingr   r	   r
   r   r   r   r   Úfastapir   r   r   r   Úpydanticr   r   r   Úprisma.modelsr   ÚPrismaDailyToolSpendRowr   ÚPrismaObjectPermissionRowr   ÚPrismaSpendLogRowr   ÚPrismaSpendLogToolIndexRowr   ÚPrismaTeamRowr   ÚPrismaVerificationTokenRowÚlitellm.proxy.utilsr   Úlitellm._loggingr   Úlitellm.constantsr   Úlitellm.proxy._typesr   r    r!   Ú$litellm.proxy.auth.user_api_key_authr"   Ú1litellm.repositories.object_permission_repositoryr#   Ú'litellm.repositories.table_repositoriesr$   r%   r&   Ú$litellm.repositories.team_repositoryr'   Ú2litellm.repositories.verification_token_repositoryr(   Úlitellm.types.tool_managementr)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   rª   r9   r`   rj   r[   rs   r   rç   r…   rˆ   rZ   r£   r¥   r¬   rð   r±   rÎ   rÚ   ræ   r\   r©   r]   rÛ   rÜ   rÝ   rë   râ   r  rÑ   r&  r*  Úpostr/  rR   r@  rA   r^   rC   ú<module>rY     sí  ðò	ó ß -ß 2Ñ 2ß Z× ZÑ Zç <Ó <ß 2Ñ 2áÝOÝXÝDÝUÝ@ÝUå0å 1Ý 2ß TÑ TÝ BÝ X÷ñ õ
 @õ÷÷ ÷ õ ñ  ˜*°Ô5€ˆ%Ó 5áô1�H˜XÑ&ô 1ô@Q�xô Qð 
Ø ]Ð/Ð ]Ð4XÒ ]ó 
Ø ]Ø	Ø cÐ2Ð cÐ7^Ò có 
Ø cØ	Ø RÐ*Ð RÐ/MÒ Ró 
Ø RØ	Ø cÐ2Ð cÐ7^Ò có 
Ø cØ	Ø I�~Ð IÐ*DÒ Ió 
Ø IØ	Ø aÐ1Ð aÐ6\Ò aó 
Ø aðØ
"Ø!ñ"àñð "ñ"ð ñ	ð
 !ñ!ðð óñ “€ˆÓ á6áØØð Bô	
ñ
 	ØØð Oô	
ñ
 	ØØØ\ô	
ðñ$ 	ØØð ]ô	
ñ
 	ØØØpô	
ðô%Ð �Uó ðB ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø,ð	 ó ñ )0Ð0AÓ(BñØ%òóðð ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø#ð	 ó ð ,0Ù(/Ð0AÓ(Bñ<Ø! DÑ(ð<à%ò<óð<ð0	
˜C $™Jð 	
¨8°d©?ó 	
ô�Yô ô/�)ô /ñ
 $ D¨Ñ$5Ó6€�Ó 6ð ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø$ð	 ó ð dhØ[_ñHcØ  ±Ð9JÓ1KÐ!KÑLðHcà˜# ™*¡eÐ8^Ô&_Ð_Ñ`ðHcð ˜˜d™
¡EÐ6VÔ$WÐWÑXòHcóðHcðV ‡�Ø&Ø
Ð	ÙÐ+Ó,Ð-Ø%ð	 ó ñ )0Ð0AÓ(Bñ<Øð<à%ò<óð<ð6 ˜c 6˜kÑ*¨T°&©\Ñ9¸CÑ?À#ÑEÈÑMÐPTÑTÐW[Ñ[€ˆYÓ [Ù0;¸KÓ0H€ˆe�K Ñ,Ñ-Ó HÙ% d¨3°¨;Ñ&7Ó8Ð �%Ó 8ñ&Ð$9ð &ÀCð &ÐRUÐX\ÑR\ó &ñ><�vð <¨ð <°c¸D±jó <ð* ‡�Ø$Ø
Ð	ÙÐ+Ó,Ð-Ø(ð	 ó ñ �a˜A”Ù˜2 !¨Ô,Ù" 4°\ÔBÙ  °<Ô@Ù(/Ð0AÓ(BñQ<ØðQ<à
ðQ<ð ðQ<ð �d‘
ð	Q<ð
 �D‰jðQ<ð &òQ<óðQ<ðh ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø'ð	 ó ñ )0Ð0AÓ(Bñ<Øð<à%ò<óð<ð2Ø!ðàðð 	ˆ4�Zóð>Ø!ðàðð 	ˆ4�Zóð: ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø+ð	 ó ñ )0Ð0AÓ(Bñh<Ø
!ðh<à%òh<óðh<ðV ‡�Ø)Ø
Ð	ÙÐ+Ó,Ð-ð ó ñ   Ð2UÔVÙ  Ð3WÔXÙ(/Ð0AÓ(Bñ	8<Øð8<à�4‰Zð8<ð �D‰jð8<ð &ò	8<óñ
8<r^   