
    6i>                         d Z ddl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 ddlmZmZ ddlmZ de
d	e
fd
Zde
d	e
fdZde
d	e
fdZded	ee   fdZde
d	e
fdZde
d	e
fdZde
d	e
fdZddedz  fdZy)zl
Zero-Click SERP Optimization Graph
Focused workflow for capturing featured snippets, PAA, and AI Overviews
    )Literal)
StateGraphSTARTEND)BaseCheckpointSaver)SEOCampaignStateCampaignPhaseSERPFeatureTypecreate_initial_statetransition_phase)research_phasedetect_serp_features)serp_optimization_phasestatereturnc                   	K   t        d| d           	 t        |        d{   } | j                  d      i | d<   g }| j                  d      }|r/|j                  dg       D cg c]  }|j                  dd       }}|sC| j                  d	g       }|D cg c]&  }|j                  d
      s|j                  d
d      ( }}|sg d}g g g g g d}|D ]  }|j                         	t	        	fddD              r|d   j                  |       <t	        	fddD              r|d   j                  |       et	        	fddD              r|d   j                  |       t	        	fddD              r|d   j                  |       |d   j                  |        || d   d<   |d   |d   z   |d   z   |d   z   | d   d<   t        dt        |d          dt        |d          dt        |d          dt        |d                 | S 7 c c}w c c}w # t        $ rE}t        d |        | j                  d      i | d<   g g g g g d| d   d<   g | d   d<   Y d}~| S d}~ww xY ww)!a  
    Zero-click focused keyword research

    Prioritizes:
    - Question keywords (What, How, Why, When)
    - Definition keywords (What is, Define, Meaning)
    - Comparison keywords (vs, compared to, difference)
    - List keywords (Best, Top, Types of)
    z7[ZeroClickResearch] Starting keyword research for site site_idNconfiggsc_datatop_queriesquery serp_features_datakeyword)
z%what is sharp money in sports bettingzwhat are player propszwhat is public fade strategyzhow to analyze mlb totalszhow to find value betszhow to read betting oddszmlb moneyline vs spread bettingznba totals vs player propsz best mlb betting analytics toolsz"top sports betting strategies 2026)
definitionhow_to
comparisonlistotherc              3   @   K   | ]  }j                  |        y wN
startswith.0pkw_lowers     :/var/www/html/langgraph-service/graphs/zero_click_graph.py	<genexpr>z#keyword_research.<locals>.<genexpr>R   s     ca8&&q)c   )zwhat iszwhat aredefinez
meaning ofr   c              3   @   K   | ]  }j                  |        y wr!   r"   r$   s     r(   r)   z#keyword_research.<locals>.<genexpr>T   s     bX((+br*   )zhow tozhow dozsteps tozguide tor   c              3   &   K   | ]  }|v  
 y wr!    r$   s     r(   r)   z#keyword_research.<locals>.<genexpr>V   s     dqQ(]ds   )z vs zcompared tozdifference betweenversusr   c              3   @   K   | ]  }j                  |        y wr!   r"   r$   s     r(   r)   z#keyword_research.<locals>.<genexpr>X   s     ^X((+^r*   )best ztop zlist ofztypes ofr   r   keyword_categorieszero_click_keywordsz5[ZeroClickResearch] Categorized keywords: Definition=z	, How-to=z, Comparison=z, List=z3[ZeroClickResearch] Error during keyword research: )printr   getloweranyappendlen	Exception)
r   keywordsr   qserp_featuresfcategorizedkwer'   s
            @r(   keyword_researchrB      s     
CE)DTCU
VWQ4$U++ 99X& E(O 99Z(4<LLPR4STqgr*THT !II&:B?M6CXquuYGWi,XHX H& 
  	0BxxzHc3bccL)004b5abbH%,,R0d,cddL)004^5]^^F#**2.G$++B/	0 1<h,-%!"%&   	h-. 	 L 9:; <K123 4L 9:; <+f-./	1 	2 Lc , U
 Yt  4CA3GH99X& E(O?AR_akmxz0{h,-13h-.L4sd   I1H  HAH  (HH  H2HEH  I1H  
H   	I.):I)#I1)I..I1c           	      |  K   t        d       	 | j                  d      i | d<   | j                  di       j                  di       }g }|j                  dg       dd D ]1  }|j                  |t        j                  j
                  ddd	d
       3 |j                  dg       dd D ]1  }|j                  |t        j                  j
                  ddd	d
       3 |j                  dg       dd D ]1  }|j                  |t        j                  j
                  ddd	d
       3 |j                  dg       dd D ]1  }|j                  |t        j                  j
                  ddd	d
       3 || d   d<   t        dt        |       d       | S # t        $ r!}t        d|        g | d   d<   Y d}~| S d}~ww xY ww)a1  
    Optimize content for featured snippets

    Applies optimization patterns:
    - Definition snippets: 40-60 word direct answers
    - How-to snippets: Numbered lists with clear steps
    - Comparison snippets: Tables with structured data
    - List snippets: Bullet points with consistent format
    z6[SnippetOptimization] Optimizing for featured snippetsr   Nr2   r   
   snippet_definitionz840-60 word direct answer starting with '[Subject] is...'pending)r   feature_typeoptimization_typeformatstatusr   snippet_how_toz)Numbered list with 5-8 clear action stepsr      snippet_comparisonz#Comparison table with clear headersr   snippet_listzBullet list with 5-10 itemssnippet_optimizationsz[SnippetOptimization] Queued z snippet optimizationsz[SnippetOptimization] Error: )r4   r5   r8   r
   FEATURED_SNIPPETvaluer9   r:   )r   
categoriesoptimizationsr@   rA   s        r(   snippet_optimizationrT   w   s     
BD7699X& E(OYYx,001ErJ
  ..r23B7 	B   / @ @ F F%9T#" 	 ..2.s3 	B   / @ @ F F%5E#" 	 ..r22A6 	B   / @ @ F F%9?#" 	 ..,Sb1 	B   / @ @ F F%37#" 	 4Ah/0-c-.@-AAWXY L	  6-aS1235h/0L	6s/   F<E>F F<	F9F4.F<4F99F<c           
        K   t        d       	 | j                  d      i | d<   | j                  di       j                  dg       }g }|dd D ];  }|j                  |t        j                  j
                  t        |      dddd	       = || d   d
<   t        dt        |       d       | S # t        $ r!}t        d|        g | d   d
<   Y d}~| S d}~ww xY ww)z
    Expand content for People Also Ask features

    For each target keyword:
    - Find 3-5 related PAA questions
    - Create FAQ schema with 2-3 sentence answers
    - Add internal links between related questions
    z([PAAExpansion] Expanding content for PAAr   Nr3      z"2-3 sentences, direct answer firstFAQPagerF   )r   rG   related_questionsanswer_formatschema_typerJ   paa_targetsz[PAAExpansion] Queued z PAA expansionsz[PAAExpansion] Error: )	r4   r5   r8   r
   PEOPLE_ALSO_ASKrQ   generate_related_questionsr9   r:   )r   r3   r[   r@   rA   s        r(   paa_expansionr^      s     
46,99X& E(O#ii"599:OQST%cr* 		B / ? ? E E%?%C!E(#  		 *5h&&s;'7&8HI L	  ,&qc*+)+h&L	,s/   CBB. ,C.	C7CCCCr   c                 f   g }| j                         }|j                  dd      j                  dd      j                  dd      }|j                  d| d       |j                  d| d       |j                  d	| d
       |j                  d| d       |j                  d| d       |dd S )z,Generate related PAA questions for a keywordzhow to r   zwhat is r1   zWhat is ?z	How does z work?zWhy is z important?zWhat are the benefits of zHow do you use NrL   )r6   replacer8   )r   	questionsr'   
base_topics       r(   r]   r]      s    I}}H !!)R088RHPPQXZ\]Jx
|1-.yF34wzl+670A>?zl!45Ra=    c           
        K   t        d       	 | j                  d      i | d<   | j                  di       j                  dg       }g }|dd D ]6  }|j                  |t        j                  j
                  dddd	d
ddd       8 || d   d<   t        dt        |       d       | S # t        $ r!}t        d|        g | d   d<   Y d}~| S d}~ww xY ww)z
    Optimize for AI Overview citations

    AI Overviews prefer:
    - Direct answers (40-60 words)
    - Unique data or proprietary insights
    - Clear authority signals
    - Brand mention co-occurrence
    z,[AIOverviewTargeting] Targeting AI Overviewsr   Nr3      z!40-60 words, definitive statementz*Include proprietary EventheOdds data pointzCite sample size or methodologyz"Natural brand reference in context)direct_answerunique_dataauthority_signalbrand_mentionz2Direct Statement -> Data/Evidence -> Context/BrandrF   )r   rG   optimization_strategyrI   rJ   ai_overview_targetsz[AIOverviewTargeting] Queued z AI Overview targetsz[AIOverviewTargeting] Error: )r4   r5   r8   r
   AI_OVERVIEWrQ   r9   r:   )r   r3   rl   r@   rA   s        r(   ai_overview_targetingrn      s     
8:499X& E(O#ii"599:OQST %cr* 	B&& / ; ; A A%H#O(I%I	* O#( 	 2Eh-.-c2E.F-GG[\] L	  4-aS1213h-.L	4s/   CBB) 'C)	C2CCCCc           	        K   t        d       	 | j                  d      i | d<   g }| j                  di       j                  dg       D ]+  }|j                  |d   d|j                  dg       dd	       - | j                  di       j                  d
g       D ]/  }|j                  d      dk(  s|j                  |d   ddd       1 | j                  di       j                  dg       D ]  }|j                  |d   dddd        || d   d<   t        dt        |       d       | S # t        $ r!}t        d|        g | d   d<   Y d}~| S d}~ww xY ww)z
    Generate and queue schema markup for SERP features

    Schema types:
    - FAQPage for PAA targeting
    - HowTo for how-to snippets
    - Article with speakable for AI assistants
    z'[SchemaMarkup] Generating schema markupr   Nr[   r   rW   rX   rF   )r   rZ   rb   rJ   rO   rH   rK   HowTo)r   rZ   rJ   rl   ArticleT)r   rZ   	speakablerJ   schema_queuez[SchemaMarkup] Queued z schema implementationsz[SchemaMarkup] Error: )r4   r5   r8   r9   r:   )r   rs   targetoptrA   s        r(   apply_schema_markuprv   $  s     
35'-99X& E(O ii"-11-D 	F!),(#ZZ(;R@#	! 	 99Xr*../FK 	Cww*+/??##"9~#*'% 	 ii"-112GL 	F!),(!#	! 	 +7h'&s<'8&99PQR L	  -&qc*+*,h'L	-s6   EB!D- 1A:D- +E-	E6EEEEc                   K   t        d       	 | j                  d      i | d<   | j                  di       }dt        |j                  di       j                  dg             t        |j                  di       j                  dg             t        |j                  di       j                  dg             t        |j                  di       j                  d	g             t        |j                  d
g             dt        |j                  dg             t        |j                  dg             t        |j                  dg             t        |j                  dg             dg dd}|| d   d<   t        | t        j                        } t        d      j                  j                         j                         | d<   t        d       | S # t        $ r+}t        d|        dt	        |      i| d   d<   Y d}~d}~ww xY ww)z1
    Generate zero-click optimization report
    z#[ZeroClickReport] Generating reportr   Nzero_click_authorityr2   r   r   r   r   r3   )definition_keywordshow_to_keywordscomparison_keywordslist_keywordstotal_zero_click_keywordsrO   r[   rl   rs   )rO   paa_expansionsrl   schema_implementations)z;Focus on definition keywords with 40-60 word direct answersz/Create numbered step guides for how-to keywordsz&Add comparison tables for vs. keywordsz,Implement FAQPage schema for all PAA targetsz<Add unique EventheOdds data points for AI Overview citations)campaign_typekeyword_analysisoptimizations_queuedrecommendationszero_click_reportz+[ZeroClickReport] Error generating report: errordatetimecompleted_atz$[ZeroClickReport] Campaign completed)r4   r5   r9   r:   strr   r	   	COMPLETED
__import__r   utcnow	isoformat)r   r   reportrA   s       r(   generate_zero_click_reportr   [  s     
/1#A99X& E(O8R( 4'*6::6JB+O+S+ST`bd+e'f#&vzz2F'K'O'OPXZ\']#^'*6::6JB+O+S+ST`bd+e'f!$VZZ0Db%I%M%MfVX%Y!Z-0<QSU1V-W! *-VZZ8OQS-T)U"%fjj&C"D'*6::6KR+P'Q*-fjj.L*M	% 
0 06h+, UM$;$;<E&z2;;BBDNNPE.	02L  A;A3?@07Q/@h+,As0   HE%G 4AH	H!G>9H>HHNcheckpointerc                 \   t        t              }|j                  dt               |j                  dt               |j                  dt
               |j                  dt               |j                  dt               |j                  dt               |j                  t        d       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dt               |j                  |       }|S )a  
    Create the zero-click SERP optimization graph

    Flow:
    1. Keyword Research - Categorize by zero-click intent
    2. Snippet Optimization - Target featured snippets
    3. PAA Expansion - Expand for People Also Ask
    4. AI Overview Targeting - Optimize for AI citations
    5. Schema Markup - Generate structured data
    6. Report - Generate optimization report

    This is a non-interrupt graph focused purely on SERP feature optimization.
    rB   rT   r^   rn   schema_markupr   )r   )r   r   add_noderB   rT   r^   rn   rv   r   add_edger   r   compile)r   graphcompileds      r(   create_zero_click_graphr     s     '(E 
NN%'78	NN)+?@	NN?M2	NN*,AB	NN?$78	NN878 
NN5,-	NN%'=>	NN)?;	NN?$;<	NN*O<	NN?H-	NN8S! }},}7HOrd   r!   )__doc__typingr   langgraph.graphr   r   r   langgraph.checkpoint.baser   state.campaign_stater   r	   r
   r   r   nodes.research_noder   r   nodes.serp_features_noder   rB   rT   r^   r   r   r]   rn   rv   r   r   r.   rd   r(   <module>r      s   
  2 2 9  E <_"2 _7G _DE&6 E;K EP%/ %4D %P S	 ")'7 )<L )X4%5 4:J 4n/,< /AQ /d$*=*D $rd   