prabalGaur commited on
Commit
bec26bd
·
verified ·
1 Parent(s): 2a4fa30

Upload community_contributions/damola-adewunmi/agents/valuer.py with huggingface_hub

Browse files
community_contributions/damola-adewunmi/agents/valuer.py ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Valuer Agent: GPT-4o with specialist system prompt (simulates fine-tuned pricing expertise).
3
+ Rule: PlayStation UK cards usually 5–10% discount; >12% = Strong Buy.
4
+ """
5
+
6
+ import json
7
+ import re
8
+ from typing import Any
9
+
10
+ from langchain_core.messages import HumanMessage, SystemMessage
11
+ from langchain_openai import ChatOpenAI
12
+
13
+ # Import from project root (damola-adewunmi)
14
+ import sys
15
+ from pathlib import Path
16
+ _root = Path(__file__).resolve().parent.parent
17
+ if str(_root) not in sys.path:
18
+ sys.path.insert(0, str(_root))
19
+ from prompts import VALUER_SYSTEM_PROMPT, VALUER_USER_TEMPLATE
20
+
21
+
22
+ def _parse_valuer_response(text: str) -> list[dict]:
23
+ """Extract JSON from model output; return list of deals or empty list."""
24
+ text = (text or "").strip()
25
+ # Try to find JSON block
26
+ match = re.search(r"\{[\s\S]*\}", text)
27
+ if not match:
28
+ return []
29
+ try:
30
+ data = json.loads(match.group())
31
+ return data.get("deals", []) if isinstance(data, dict) else []
32
+ except json.JSONDecodeError:
33
+ return []
34
+
35
+
36
+ def valuer_node(state: dict[str, Any]) -> dict[str, Any]:
37
+ """
38
+ Node: run GPT-4o with specialist prompt on raw_search_results.
39
+ Outputs structured valued_deals (retailer, denomination, price, discount_pct, verdict, url).
40
+ """
41
+ raw = state.get("raw_search_results") or ""
42
+ if not raw.strip():
43
+ return {"valued_deals": []}
44
+
45
+ llm = ChatOpenAI(model="gpt-4o", temperature=0)
46
+ messages = [
47
+ SystemMessage(content=VALUER_SYSTEM_PROMPT),
48
+ HumanMessage(content=VALUER_USER_TEMPLATE.format(search_results=raw)),
49
+ ]
50
+ response = llm.invoke(messages)
51
+ content = response.content if hasattr(response, "content") else str(response)
52
+ valued_deals = _parse_valuer_response(content)
53
+ return {"valued_deals": valued_deals}