o
    uJjV                     @   s  d Z ddlZddlmZmZ ddlmZmZmZm	Z	 ddl
mZmZmZ ddlmZ ddlmZmZmZmZmZmZ dd	d
dddddidgdddddddi dddddddi dddddddddiddiddiddidddgdddddddddiddiddiddid d!gddddd"d#dddidd$iddid%g d%ddddd&d'dd(dd)iid(gddddd*d+dddidg d,d-ddiddiddid.g d/ddddd0d1di ddddd2d3dddidg d4d-ddiddiddid5g d6ddddd7d8dddiddid9d:d;gdddgZeG d<d= d=Zd>ed?efd@dAZdBedCed?efdDdEZdFed>edBed?efdGdHZdBed>ed?efdIdJZdBed>ed?efdKdLZdBed>ed?efdMdNZ dOed?efdPdQZ!dS )Rz?OpenAI-format tool schemas + execution for the Kimi agent loop.    N)	dataclassfield)AnyDictListOptional)
ClaimCheckComplianceLedgerOpportunityRecommendation)	vultr_rag)compute_risk_exposurediscover_claim_opportunitiesforecast_demandmarket_contextproject_marginverify_recycled_contentfunctionr   z?Forecast next-season demand index from real Google Trends data.objectcategorystringz Apparel category, e.g. Outerwear)typedescription)r   
propertiesrequired)namer   
parameters)r   r   r   zKReturn sustainable fashion market size and willingness-to-pay premium band.)r   r   project_line_marginzPProject total line contribution from SKU economics and DataCo margin benchmarks.search_regulationsuZ   Retrieval #1 — search EU regulations (Vultr Turnkey RAG) for the rule governing a claim.r   )claim_idopportunity_id
claim_text
claim_typer    r!   lookup_supplier_certuY   Retrieval #2 — look up supplier Scope/Transaction certificates when evidence is needed.)r   r   sku	attributer#   r   uR   Calc tool — compare claimed recycled % against Transaction Certificate coverage.number)r   claimed_pctr#   r   uI   Compute max fine exposure at ≤4% of annual turnover for blocked claims.blocked_countintegersubmit_claim_verdictzORecord per-claim verdict after retrieval and any calc tools. Citation required.)substantiatedblockedneeds-evidence)r   enum)r   statuscitation
regulationremediation)r   r.   r/   r   zScan rising ethical demand (Google Trends) and match unclaimed line materials to substantiatable marketing claims the brand is not yet making.submit_opportunity_verdictzeRecord verdict for a discovered claim opportunity after regulation retrieval and supplier cert check.)r*   r,   rejected)r   r.   r/   r0   r1   )r   r.   r/   finalize_determinationzISubmit final line-launch recommendation after all claims are adjudicated.)recommendationsummaryr5   r6   c                   @   s   e Zd ZU eed< eed< eed< eed< eedZ	e
eef ed< eedZee ed< dZeed	< dZeed
< dedee fddZdedee fddZdS )ToolContextlineplan_claimsledgerevents)default_factoryclaim_trace
discoveredFdiscovery_calledfinishedr   returnc                 C   s$   | j D ]}|d |kr|  S qd S )Nr   )r9   )selfr   c rD   ,/opt/greenlight/greenlight/agents/tooling.py	claim_row   s
   
zToolContext.claim_rowr   c                 C   s&   | j D ]}|d|kr|  S qd S )Nr   )r>   get)rB   r   orD   rD   rE   opportunity_row   s
   
zToolContext.opportunity_rowN)__name__
__module____qualname__dict__annotations__listr	   r   r   r=   r   strr>   r   r?   boolr@   r   rF   rI   rD   rD   rD   rE   r7      s   
 r7   argsrA   c                 C   s.   |  dr	| d S |  drd| d  S dS )Nr   r   opp: rG   )rR   rD   rD   rE   
_trace_key   s
   

rV   ctxkeyc                 C   s   || j vr
i | j |< | j | S N)r=   )rW   rX   rD   rD   rE   _trace   s   


rZ   r   c                 C   sN  |j }|j}|j}| dkr3t|dd}|jdZdd|d  d|d	  d
i| |d |jd< |S | dkrst }|di }|jddd|di dd d|d d|d dd |d d|d d|jd< |S | dkrd}	|d D ]
}
|	t|
d 7 }	q}|jddd|	dd|	d  |	|jd< d|	iS | d!krt	|}t
|d" |d#d$}|t||d%< |jd&d'|d(|d)d*d+|d,|d-d.|d/d0	 |S | d1krt	|}t
|d2 |d3}|t||d4< |jd&d'|d(|d)d5d6|d/|d7|d,|d-d.d8
 |S | d9kro|d( }||}t||d4}|sIt
|d2 |r?|d3nd }|t||d4< |rQ|d:nd }t|d; |p[i }|t||d<< |jdd9||d= |S | d>krt|j|d? }|j		>d[dd@|dA di| |S | dBkrt||S | dCkrdDdE |jD }t||}dF|_|dGpg |_|jr|jdHdIdJt|j dKdLdMdN |jD  d |jD ]}|jdOdP|d) |d2 |d" |dQ |d |dRdSdT	 q|j		Cd\dt|j dUi| |S | dVkrt||S | dWkr t||S dXdY|  iS )]Nr   r   	Outerweartooltextzdemand index demand_indexz (trend)r   willingness_to_payzmarket $sustainable_fashion_marketvalue_2026_usd_bn?zB; WTP premium_pct_low-premium_pct_high%r]   wtp_premium_pctr   r   skusprojected_contribution_eurr   u   Line contribution €z,.0fu    (6 SKUs · DataCo benchmarks))r]   rl   r   r    r!   rT   r0   	retrievalClaimCheckerr   r      zregulation retrieval #1sourceliveFr/   )r   r   rm   r]   rp   rq   r/   r"   r#   r$   cert   z&supplier cert retrieval #2 (multi-hop)scope_valid)r   r   rm   r]   r/   rt   rp   rq   r   transactionr&   verify)r   resultr   r'   u   ≤4% turnover · up to €max_exposure_eurr)   r   c                 S   s*   g | ]}|d  |d | dpi dqS )r#   r]   meta)r#   r]   ry   rU   .0rC   rD   rD   rE   
<listcomp>4  s    zexecute.<locals>.<listcomp>Topportunitiesagentz	Kimi-K2.6zFound z7 rising-demand claim opportunities the line could add: , c                 s   s    | ]}|d  V  qdS )r   NrD   r{   rH   rD   rD   rE   	<genexpr>A  s    zexecute.<locals>.<genexpr>opportunityClaimDiscoverytrend_keyword
uplift_pct	candidate)r   r#   r]   r   r^   r   r.   u9    opportunities · rising ethical demand × line materialsr2   r4   errorzunknown tool )r\   r   )r\   r   )r\   r   )r;   r8   r:   r   rG   emit
commercialr   r   rV   r   r   rZ   r"   rF   r   r   turnover_eur_submit_verdictr9   r   r?   r>   lenjoin_submit_opportunity_verdict	_finalize)r   rR   rW   evr8   r:   fdmcwtptotalr#   rX   regrr   cidrowtcvriskdeclaredrw   opprD   rD   rE   execute   s  *





 










r   c           
   	      s  |d  |   }|sdd  iS |d }|dpd }t|  }|dkr.|s.ddiS d	|vr:|d
kr:ddiS |d}|r\|ds\|dkr\d}|dpYd|d d|d< |d dkr|dkr|d}|sqddiS |d}|r|ddks|d|d krd
}|dpd|d< |pd}t fdd| jjD d }	|	st |d |d |d |d p|d!}	| jj|	 ||	_	||	_
|d	|	_|d|	_| jjd"d# ||d ||	jd$ d% |d&S )'Nr   r   zunknown claim_id r.   r/   rT   r*   3   citation required — call search_regulations firstr0   r,   z1call search_regulations before submitting verdictrv   passesr+   r1   zCorrect marketing to verified_pctz0% recycled polyester (GRS-certified); attach TC.r   certified_materialrr   zPcall lookup_supplier_cert before submitting verdict for certified_material claimru   VALID	linkedSkur#   zMNo valid Transaction Certificate on file for this named certification scheme.u:   Regulation checked — supplier shipment evidence missing.c                 3       | ]
}|j  kr|V  qd S rY   r   rz   r   rD   rE   r         z"_submit_verdict.<locals>.<genexpr>r]   ry   )r   r#   r]   r!   ry   claimrn   )r   r.   r]   r/   r1   T)okr   r.   )rF   rG   striprZ   nextr:   claimsr   appendr.   r/   r0   r1   r;   r   )
rW   rR   r   r.   r/   tracerv   rr   r   checkrD   r   rE   r   a  sh   





$
	r   c           	         s  |d  |   }|sdd  diS |d }|dpd }t| d  }|d	kr2|s2dd
iS d|vr>|dkr>ddiS |dpDi }|d}|d	kr||r`|ddks`|d|d krld}|dphd|d< n|ds|d}|dpyd|d< t fdd| jjD d }|st |d |d |d |d|d|d|d}| jj| ||_	||_
|d|_|d|_| jjd d! |d |d |d|d|d|||j|d	kd" d# |d$S )%Nr   r   zunknown opportunity_id u,    — call discover_claim_opportunities firstr.   r/   rT   rS   r*   r   r0   r3   zEcall search_regulations with opportunity_id before submitting verdictrr   ru   r   r   r#   r,   r1   z;No valid Transaction Certificate on file for this shipment.rt   z%Scope Certificate missing or expired.c                 3   r   rY   r   r   oidrD   rE   r     r   z._submit_opportunity_verdict.<locals>.<genexpr>r    r!   r   r^   r   )r   r#   r]   r!   r   r^   r   ry   r   r   )
r   r#   r]   r   r^   r   r.   r/   r1   recommend_addT)r   r   r.   )rI   rG   r   rZ   r   r:   r}   r
   r   r.   r/   r0   r1   r;   r   )	rW   rR   r   r.   r/   r   rr   r   recrD   r   rE   r     sh   

$

r   c                    s  | j   fdddD }|r)| jjdddd| d d	d| d
|dS dd  jD }dd | jD }t|| }|rf| jjdddt| dd| d dt| dd| d|dS | jsv| jjdddd ddiS t fdd| j	D }|r| jjdddt| dd| d dd| d|dS t j
}t j} jdd}	 jdd }
t|	d! |
 d} j}d}|D ]}|jpd"d# }|t|	| |jpd  t| jd$  d7 }qt|	| | d}t j|}|d% ||t j j|d& |	|||d'd |D |d( d)d*}| _| jjd2d-|d( i| | jjd.dd/d) j|||d& |d0	 d1| _|S )3Nc                    s    g | ]\}} j |s|qS rD   )r   rG   )r{   r\   rX   r:   rD   rE   r|     s    
z_finalize.<locals>.<listcomp>))r   r^   )r   rj   )r   rl   r~   coordinatoru5   Blocked finalize — commercial analysis incomplete: r   ri   uo   Cannot finalize — the commercial upside must be sized first. Call these tools before finalize_determination: .)r   pending_toolsc                 S      h | ]}|j qS rD   r   rz   rD   rD   rE   	<setcomp>      z_finalize.<locals>.<setcomp>c                 S   s   h | ]}|d  qS r   rD   rz   rD   rD   rE   r     s    u   Blocked finalize — z  claim(s) still need a verdict: u   Cannot finalize — zl. Call search_regulations, then submit_claim_verdict for EACH remaining claim before finalize_determination.)r   pending_claimsuT   Blocked finalize — call discover_claim_opportunities before finalize_determinationr   u   Cannot finalize — call discover_claim_opportunities after adjudicating claims, then vet each returned opportunity (search_regulations, lookup_supplier_cert, submit_opportunity_verdict) before finalize_determination.c                 3   s0    | ]}|d  dd  j D vr|d  V  qdS )r   c                 S   r   rD   r   )r{   xrD   rD   rE   r     r   z&_finalize.<locals>.<genexpr>.<setcomp>N)r}   r   r   rD   rE   r     s    z_finalize.<locals>.<genexpr>z3 discovered opportunity(ies) still need a verdict: u2   Cannot finalize — vet discovered opportunities: zQ. For each: search_regulations, lookup_supplier_cert, submit_opportunity_verdict.)r   pending_opportunitiesrl   r   r^   g      ?gQ?   g      Y@rk   r5   rx   c              
   S   s.   g | ]}|j |j|j|j|j|j|jd qS )r   r#   r]   r   r^   r   r/   r   r   rD   rD   rE   r|   D  s    
r6   d   )r5   clearedr+   total_claims
confidencerx   rl   positioning_uplift_europportunity_uplift_eurnet_upside_eurrecommended_opportunitiesr6   	cited_pct	synthesisDeterminationr]   metriczrun complete)r]   r   r   r+   r   exposure_eurr   T)r   r   )r:   r;   r   r   r   r9   sortedr   r?   r>   r+   r   r   rG   roundr   r   r^   r8   r   r   r   determinationr@   )rW   rR   commercial_missingadjudicatedexpectedmissingpending_oppsr+   r   upside
demand_idxpositioning_upliftrecommended
opp_upliftrH   pct
net_upsider   detrD   r   rE   r     s   
		

,
r   rawc                 C   sB   t | tr| S t | trzt| W S  tjy   i  Y S w i S rY   )
isinstancerM   rP   jsonloadsJSONDecodeError)r   rD   rD   rE   parse_tool_argsd  s   

r   )"__doc__r   dataclassesr   r   typingr   r   r   r   greenlight.engine.ledgerr   r	   r
   greenlight.sourcesr   greenlight.toolsr   r   r   r   r   r   TOOL_SCHEMASr7   rM   rP   rV   rZ   r   r   r   r   r   rD   rD   rD   rE   <module>   s    		
	   @> 