
    ?i                         d Z ddlZddlZddlZddlmZmZmZmZ ddl	m
Z
 defdZdZd	d
ddZdZ	 	 ddededededededee   deeef   fdZdeeef   deeeef      fdZy)z)xAI API client for X (Twitter) discovery.    N)AnyDictListOptional   )httpmsgc                     t         j                  j                  d|  d       t         j                  j                          y)zLog error to stderr.z
[X ERROR] 
N)sysstderrwriteflush)r	   s    P/home/ubuntu/.openclaw/workspace/skills/last30days-official/scripts/lib/xai_x.py
_log_errorr      s-    JJz#b)*JJ    zhttps://api.x.ai/v1/responses)      )      )(   <   )quickdefaultdeepa  You have access to real-time X (Twitter) data. Search for posts about: {topic}

Focus on posts from {from_date} to {to_date}. Find {min_items}-{max_items} high-quality, relevant posts.

IMPORTANT: Return ONLY valid JSON in this exact format, no other text:
{{
  "items": [
    {{
      "text": "Post text content (truncated if long)",
      "url": "https://x.com/user/status/...",
      "author_handle": "username",
      "date": "YYYY-MM-DD or null if unknown",
      "engagement": {{
        "likes": 100,
        "reposts": 25,
        "replies": 15,
        "quotes": 5
      }},
      "why_relevant": "Brief explanation of relevance",
      "relevance": 0.85
    }}
  ]
}}

Rules:
- relevance is 0.0 to 1.0 (1.0 = highly relevant)
- date must be YYYY-MM-DD format or null
- engagement can be null if unknown
- Include diverse voices/accounts if applicable
- Prefer posts with substantive content, not just linksapi_keymodeltopic	from_dateto_datedepthmock_responsereturnc           
          ||S t         j                  |t         d         \  }}d|  dd}	|dk(  rdn|dk(  rdnd}
|d	d
igdt        j                  |||||      dgd}t	        j
                  t        ||	|
      S )a  Search X for relevant posts using xAI API with live search.

    Args:
        api_key: xAI API key
        model: Model to use
        topic: Search topic
        from_date: Start date (YYYY-MM-DD)
        to_date: End date (YYYY-MM-DD)
        depth: Research depth - "quick", "default", or "deep"
        mock_response: Mock response for testing

    Returns:
        Raw API response
    r   zBearer zapplication/json)AuthorizationzContent-Typer   Z   x      typex_searchuser)r   r   r    	min_items	max_items)rolecontent)r   toolsinput)headerstimeout)DEPTH_CONFIGgetX_SEARCH_PROMPTformatr   postXAI_RESPONSES_URL)r   r   r   r   r    r!   r"   r,   r-   r2   r3   payloads               r   search_xr;   :   s    .  '++E<	3JKIy #7),*G W$b)1C#G Z 

 *11'#'' 2 	
G& 99&'RRr   responsec                 4   g }d| v r| d   r| d   }t        |t              r|j                  dt        |            n
t        |      }t	        d|        t
        j                  r&t	        dt        j                  | d      dd         |S d	}d
| v r| d
   }t        |t              r|}nt        |t              r|D ]  }t        |t              rq|j                  d      dk(  rS|j                  dg       }|D ];  }t        |t              s|j                  d      dk(  s)|j                  dd	      } n nd|v r|d   }nt        |t              r|}|s n |s)d| v r%| d   D ]  }	d|	v s|	d   j                  dd	      } n |s|S t        j                  d|      }
|
r6	 t        j                  |
j                               }|j                  dg       }g }t        |      D ]  \  }}t        |t              s|j                  dd	      }|s-d}|j                  d      }t        |t              r|j                  d      rt!        |j                  dd            nd|j                  d      rt!        |j                  dd            nd|j                  d      rt!        |j                  dd            nd|j                  d      rt!        |j                  dd            ndd}d|dz    t        |j                  dd	            j#                         dd |t        |j                  dd	            j#                         j%                  d      |j                  d      |t        |j                  d d	            j#                         t'        d!t)        d"t+        |j                  d#d$                        d%}|d   r't        j,                  d&t        |d               sd|d<   |j/                  |        |S # t        j                  $ r Y @w xY w)'zParse xAI response to extract X items.

    Args:
        response: Raw API response

    Returns:
        List of item dicts
    errormessagezxAI API error: zFull error response:    )indentNi   outputr)   r/   output_texttextchoicesz\{[\s\S]*"items"[\s\S]*\}itemsurl
engagementlikesr   repostsrepliesquotes)rJ   rK   rL   rM   Xr   i  author_handle@datewhy_relevantg      ?g        	relevanceg      ?)idrE   rH   rO   rQ   rI   rR   rS   z^\d{4}-\d{2}-\d{2}$)
isinstancedictr5   strr   r   DEBUGjsondumpslistresearchloadsgroupJSONDecodeError	enumerateintstriplstripminmaxfloatmatchappend)r<   rG   r>   err_msgrD   rC   itemr/   cchoice
json_matchdataclean_itemsirH   rI   eng_raw
clean_items                     r   parse_x_responsert   u   s    E (x0!6@6M%))Is5z2SVW\S]_WI./::.tzz(1/Met/T.UVW K8(#fc" K% dD)xx'94"&((9b"9!( &A)!T2quuV}7U./eeFB.? %&  4&*6lc*"&K  90y) 	FF"$Y/33IrB	
  7EJ	::j..01DHHWb)E
 KU# #'4$%hhub! 
((<(gt$9@W9MW[[!45SW=D[[=S3w{{9a89Y]=D[[=S3w{{9a89Y];B;;x;P#gkk(A67VZ	J acU),-335ds; /2!>?EEGNNsSHHV$$ <=CCES#c5+s1K+L"MN	

 f882C
68J4KL%)
6":&G#'J U ## 		s   !5P   PP)r   N)__doc__rY   r\   r   typingr   r   r   r   rB   r   rW   r   r9   r4   r6   r;   rt    r   r   <module>rx      s    /  	 
 , , C  4  ;L $(8S8S8S 8S 	8S
 8S 8S D>8S 
#s(^8SvdtCH~ d$tCH~2F dr   