hashan-7 commited on
Commit
f47f67d
·
verified ·
1 Parent(s): 6c33fb1

add the code

Browse files
Files changed (1) hide show
  1. stack_search.py +116 -0
stack_search.py CHANGED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ from typing import List, Optional
3
+
4
+ from config import settings
5
+ from schemas import RetrievedEvidence, SourceType
6
+
7
+
8
+ STACK_API_BASE = "https://api.stackexchange.com/2.3/search/advanced"
9
+ STACK_SITE = "stackoverflow"
10
+
11
+
12
+ def clean_text(text: Optional[str]) -> str:
13
+ if not text:
14
+ return ""
15
+ return str(text).strip()
16
+
17
+
18
+ def build_stack_query(
19
+ message: str,
20
+ error_message: Optional[str] = None,
21
+ language: Optional[str] = None,
22
+ framework: Optional[str] = None,
23
+ ) -> str:
24
+ parts = []
25
+
26
+ if framework:
27
+ parts.append(clean_text(framework))
28
+
29
+ if language:
30
+ parts.append(clean_text(language))
31
+
32
+ if error_message:
33
+ parts.append(clean_text(error_message))
34
+
35
+ if message:
36
+ parts.append(clean_text(message))
37
+
38
+ query = " ".join(part for part in parts if part)
39
+ return query.strip()
40
+
41
+
42
+ def search_stackoverflow(
43
+ message: str,
44
+ error_message: Optional[str] = None,
45
+ language: Optional[str] = None,
46
+ framework: Optional[str] = None,
47
+ max_results: Optional[int] = None,
48
+ ) -> List[RetrievedEvidence]:
49
+ query = build_stack_query(
50
+ message=message,
51
+ error_message=error_message,
52
+ language=language,
53
+ framework=framework,
54
+ )
55
+
56
+ if not query:
57
+ return []
58
+
59
+ params = {
60
+ "order": "desc",
61
+ "sort": "relevance",
62
+ "q": query,
63
+ "site": STACK_SITE,
64
+ "pagesize": max_results or settings.MAX_STACK_RESULTS,
65
+ "filter": "default",
66
+ }
67
+
68
+ if settings.STACKOVERFLOW_KEY:
69
+ params["key"] = settings.STACKOVERFLOW_KEY
70
+
71
+ try:
72
+ response = requests.get(
73
+ STACK_API_BASE,
74
+ params=params,
75
+ timeout=settings.SEARCH_TIMEOUT_SECONDS,
76
+ )
77
+ response.raise_for_status()
78
+ data = response.json()
79
+ except Exception as e:
80
+ print(f"Stack Overflow search failed: {e}")
81
+ return []
82
+
83
+ items = data.get("items", [])
84
+ evidence_list: List[RetrievedEvidence] = []
85
+
86
+ for item in items:
87
+ title = clean_text(item.get("title"))
88
+ link = clean_text(item.get("link"))
89
+ score = item.get("score", 0)
90
+
91
+ tags = item.get("tags", [])
92
+ tag_text = ", ".join(tags) if tags else ""
93
+ is_answered = item.get("is_answered", False)
94
+
95
+ snippet_parts = []
96
+ if tag_text:
97
+ snippet_parts.append(f"Tags: {tag_text}")
98
+ snippet_parts.append(f"Answered: {'yes' if is_answered else 'no'}")
99
+ snippet_parts.append(f"Score: {score}")
100
+
101
+ snippet = " | ".join(snippet_parts)
102
+
103
+ if not title:
104
+ continue
105
+
106
+ evidence_list.append(
107
+ RetrievedEvidence(
108
+ source_type=SourceType.STACKOVERFLOW,
109
+ title=title,
110
+ snippet=snippet,
111
+ url=link or None,
112
+ score=float(score) if score is not None else None,
113
+ )
114
+ )
115
+
116
+ return evidence_list