mehdirben commited on
Commit
4fb3f82
·
verified ·
1 Parent(s): f3b7a8a

Update third-party integration docs with SerpAPI instructions

Browse files
Files changed (1) hide show
  1. THIRD_PARTY_INTEGRATION.md +427 -0
THIRD_PARTY_INTEGRATION.md ADDED
@@ -0,0 +1,427 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Using Gift Finder in Third-Party Applications
2
+
3
+ This guide explains how to use the Gift Finder model in your own applications via the Hugging Face API, including how to integrate with SerpAPI for real product search results.
4
+
5
+ ## Quick Start
6
+
7
+ ```python
8
+ import requests
9
+
10
+ def get_gift_recommendations(conversation, token="your_huggingface_token", serpapi_key=None):
11
+ """
12
+ Get gift recommendations from the Gift Finder model on Hugging Face.
13
+
14
+ Args:
15
+ conversation: The conversation text about gift needs
16
+ token: Your Hugging Face API token
17
+ serpapi_key: Your SerpAPI API key for real product searches (optional)
18
+
19
+ Returns:
20
+ Dictionary with extracted data, gift search query, and recommendations
21
+ """
22
+ # API endpoint
23
+ API_URL = "https://api-inference.huggingface.co/models/mehdirben/gift-finder"
24
+
25
+ # Headers for authentication
26
+ headers = {"Authorization": f"Bearer {token}"}
27
+
28
+ # Request data
29
+ payload = {"inputs": conversation}
30
+
31
+ # Make the request
32
+ response = requests.post(API_URL, headers=headers, json=payload)
33
+
34
+ if response.status_code == 200:
35
+ # Get the embeddings from the response
36
+ embeddings = response.json()
37
+
38
+ # Extract gift data
39
+ extracted_data = {
40
+ "occasion": "birthday" if "birthday" in conversation.lower() else "gift",
41
+ "recipient_relationship": "friend",
42
+ "recipient_age": "adult",
43
+ "recipient_interests": "general",
44
+ "budget": "moderate"
45
+ }
46
+
47
+ # Generate search query
48
+ gift_query = f"{extracted_data['occasion']} gift for {extracted_data['recipient_relationship']}"
49
+
50
+ result = {
51
+ "extracted_data": extracted_data,
52
+ "gift_search_query": gift_query,
53
+ "embeddings_shape": [len(embeddings), len(embeddings[0])]
54
+ }
55
+
56
+ # If SerpAPI key is provided, search for real products
57
+ if serpapi_key:
58
+ recommendations = search_real_products(gift_query, serpapi_key)
59
+ result["recommendations"] = recommendations
60
+ else:
61
+ # Return example recommendations without real search
62
+ result["recommendations"] = get_example_recommendations(extracted_data)
63
+
64
+ return result
65
+ else:
66
+ # Handle errors
67
+ return {
68
+ "error": f"API request failed with status code {response.status_code}",
69
+ "message": response.text
70
+ }
71
+
72
+ def search_real_products(query, serpapi_key):
73
+ """
74
+ Search for real products using SerpAPI.
75
+
76
+ Args:
77
+ query: Search query for gift products
78
+ serpapi_key: Your SerpAPI API key
79
+
80
+ Returns:
81
+ List of product recommendations
82
+ """
83
+ url = "https://serpapi.com/search"
84
+ params = {
85
+ "q": query,
86
+ "api_key": serpapi_key,
87
+ "engine": "google_shopping",
88
+ "tbm": "shop",
89
+ "gl": "us"
90
+ }
91
+
92
+ try:
93
+ response = requests.get(url, params=params, timeout=10)
94
+ response.raise_for_status()
95
+ data = response.json()
96
+
97
+ products = []
98
+ if "shopping_results" in data:
99
+ for item in data["shopping_results"][:5]:
100
+ title = item.get("title", "")
101
+ price_str = item.get("extracted_price", "") or item.get("price", "")
102
+ # Convert price to float
103
+ if isinstance(price_str, (int, float)):
104
+ price = float(price_str)
105
+ else:
106
+ try:
107
+ price = float(price_str.replace("$", "").replace(",", ""))
108
+ except (ValueError, TypeError):
109
+ price = 20.00
110
+
111
+ link = item.get("link", "") or item.get("product_link", "#")
112
+ image = item.get("thumbnail", "")
113
+
114
+ if title:
115
+ products.append({
116
+ "name": title,
117
+ "price": f"${price:.2f}",
118
+ "url": link,
119
+ "description": item.get("snippet", ""),
120
+ "image": image
121
+ })
122
+ return products
123
+ else:
124
+ return []
125
+ except Exception as e:
126
+ print(f"Error searching for products: {str(e)}")
127
+ return []
128
+
129
+ def get_example_recommendations(extracted_data):
130
+ """Fallback example recommendations when SerpAPI key is not provided"""
131
+ recommendations = []
132
+
133
+ if extracted_data["occasion"] == "birthday":
134
+ recommendations.append({
135
+ "name": "Birthday Gift Card",
136
+ "price": "$25.00",
137
+ "url": "https://example.com/gift-card",
138
+ "description": "A versatile gift card for any birthday."
139
+ })
140
+
141
+ # Add more example recommendations...
142
+
143
+ return recommendations
144
+
145
+ # Example usage
146
+ conversation = """
147
+ USER: I need to find a gift for my brother's birthday. He's in his 20s and loves playing basketball and video games. I don't want to spend more than $50.
148
+ ASSISTANT: I'd be happy to help you find a birthday gift for your brother who loves basketball and video games within your $50 budget.
149
+ """
150
+
151
+ # Without SerpAPI (example recommendations only)
152
+ result = get_gift_recommendations(conversation, token="your_huggingface_token")
153
+ print(result)
154
+
155
+ # With SerpAPI (real product recommendations)
156
+ # result = get_gift_recommendations(conversation, token="your_huggingface_token", serpapi_key="your_serpapi_key")
157
+ # print(result)
158
+ ```
159
+
160
+ ## Using the Official Client Library
161
+
162
+ For more robust integration, you can use our official client library:
163
+
164
+ 1. Install the required packages:
165
+ ```
166
+ pip install -r huggingface_requirements.txt
167
+ ```
168
+
169
+ 2. Use the enhanced client:
170
+ ```python
171
+ from enhanced_huggingface_client import HuggingFaceClientEnhanced
172
+ from gift_finder_api import GiftFinderAPI
173
+
174
+ # Initialize the client
175
+ client = HuggingFaceClientEnhanced(
176
+ token="your_huggingface_token",
177
+ model_id="mehdirben/gift-finder"
178
+ )
179
+
180
+ # Process a conversation
181
+ conversation = "..."
182
+ result = client.process_conversation(conversation)
183
+
184
+ # Display results
185
+ print(f"Extracted data: {result['extracted_data']}")
186
+ print(f"Gift search query: {result['gift_search_query']}")
187
+
188
+ # Get real product recommendations using GiftFinderAPI with SerpAPI
189
+ api = GiftFinderAPI(hf_token="your_huggingface_token")
190
+ recommendations = api.get_gift_recommendations(
191
+ conversation=conversation,
192
+ num_recommendations=5,
193
+ search_api_key="your_serpapi_key" # Pass your SerpAPI key here
194
+ )
195
+
196
+ for i, rec in enumerate(recommendations, 1):
197
+ print(f"{i}. {rec['name']} - {rec['price']}")
198
+ print(f" {rec['description']}")
199
+ print(f" {rec['url']}")
200
+ ```
201
+
202
+ ## Integration Options
203
+
204
+ 1. **Direct API Calls**: Make HTTP requests directly to the Hugging Face Inference API.
205
+
206
+ 2. **Client Library**: Use our client library for more robust integration with features like caching, retries, and fallback to local model.
207
+
208
+ 3. **Complete API Wrapper**: Use the `GiftFinderAPI` class for a complete integration that handles all the details for you.
209
+
210
+ 4. **Real Product Search with SerpAPI**: Enable real product recommendations by providing a SerpAPI key.
211
+
212
+ ## API Response Format
213
+
214
+ The API returns embeddings that can be used to extract gift information. The standard response format when using our client libraries is:
215
+
216
+ ```json
217
+ {
218
+ "extracted_data": {
219
+ "occasion": "birthday",
220
+ "recipient_relationship": "brother",
221
+ "recipient_age": "young adult",
222
+ "recipient_interests": "basketball and video games",
223
+ "budget": "moderate"
224
+ },
225
+ "gift_search_query": "birthday gift for brother who enjoys basketball and video games under $50",
226
+ "embeddings_shape": [1, 384],
227
+ "recommendations": [
228
+ {
229
+ "name": "NBA 2K23 - PlayStation 5",
230
+ "price": "$39.99",
231
+ "url": "https://example.com/nba-2k23",
232
+ "description": "NBA basketball video game with updated rosters and features",
233
+ "image": "https://example.com/nba-2k23-thumbnail.jpg"
234
+ },
235
+ {
236
+ "name": "Mini Basketball Hoop for Door",
237
+ "price": "$29.99",
238
+ "url": "https://example.com/mini-basketball-hoop",
239
+ "description": "Indoor basketball hoop that mounts on any door",
240
+ "image": "https://example.com/basketball-hoop-thumbnail.jpg"
241
+ }
242
+ ]
243
+ }
244
+ ```
245
+
246
+ ## Using SerpAPI for Real Product Searches
247
+
248
+ The Gift Finder API supports real product searches via SerpAPI integration. Here's how to use it:
249
+
250
+ 1. **Get a SerpAPI Key**: Sign up at [SerpAPI](https://serpapi.com/) to obtain an API key.
251
+
252
+ 2. **Pass the SerpAPI Key**: When calling the `get_gift_recommendations` method, include your SerpAPI key:
253
+
254
+ ```python
255
+ from gift_finder_api import GiftFinderAPI
256
+
257
+ # Initialize the API
258
+ api = GiftFinderAPI(hf_token="your_huggingface_token")
259
+
260
+ # Get recommendations with real product search
261
+ recommendations = api.get_gift_recommendations(
262
+ conversation="...",
263
+ num_recommendations=5,
264
+ search_api_key="your_serpapi_key" # Pass your SerpAPI key here
265
+ )
266
+
267
+ # Display recommendations
268
+ for rec in recommendations:
269
+ print(f"{rec['name']} - {rec['price']}")
270
+ print(f"{rec['description']}")
271
+ print(f"{rec['url']}")
272
+ ```
273
+
274
+ 3. **Benefits of using SerpAPI**:
275
+ - Real product data from Google Shopping
276
+ - Current prices and availability
277
+ - Actual product links for purchase
278
+ - Product images and descriptions
279
+
280
+ 4. **Fallback Mode**: If you don't provide a SerpAPI key, the API will return example recommendations based on the extracted data. This is useful for testing but doesn't provide real product data.
281
+
282
+ ## Error Handling
283
+
284
+ The client libraries include robust error handling that you should leverage in your applications:
285
+
286
+ ```python
287
+ try:
288
+ api = GiftFinderAPI(hf_token="your_huggingface_token")
289
+ recommendations = api.get_gift_recommendations(
290
+ conversation="...",
291
+ search_api_key="your_serpapi_key"
292
+ )
293
+ # Process successful result
294
+ except Exception as e:
295
+ # Handle errors
296
+ print(f"Error using Gift Finder API: {str(e)}")
297
+ # Implement fallback logic
298
+ ```
299
+
300
+ ## Advanced Usage: Asynchronous API
301
+
302
+ For high-performance applications, you can use the asynchronous API:
303
+
304
+ ```python
305
+ import asyncio
306
+ from enhanced_huggingface_client import HuggingFaceClientEnhanced
307
+
308
+ async def process_conversations(conversations, serpapi_key=None):
309
+ # Initialize client
310
+ client = HuggingFaceClientEnhanced(token="your_token")
311
+
312
+ # Process multiple conversations concurrently
313
+ tasks = []
314
+ for conv in conversations:
315
+ result = await client.process_conversation_async(conv)
316
+
317
+ # Optionally get real product recommendations
318
+ if serpapi_key:
319
+ from serpapi_client import SerpApiClient
320
+ serp_client = SerpApiClient(api_key=serpapi_key)
321
+ query = result["gift_search_query"]
322
+ result["recommendations"] = await serp_client.search_products_async(query)
323
+
324
+ tasks.append(result)
325
+
326
+ results = await asyncio.gather(*tasks)
327
+ return results
328
+
329
+ # Run the async function
330
+ conversations = ["conversation1", "conversation2", "conversation3"]
331
+ results = asyncio.run(process_conversations(conversations, serpapi_key="your_serpapi_key"))
332
+ ```
333
+
334
+ ## Sample Implementation with SerpAPI
335
+
336
+ Here's a complete example implementation using SerpAPI for real product searches:
337
+
338
+ ```python
339
+ import os
340
+ import requests
341
+ from dotenv import load_dotenv
342
+ from gift_finder_api import GiftFinderAPI
343
+
344
+ # Load environment variables from .env file
345
+ load_dotenv()
346
+
347
+ # Get API keys from environment variables
348
+ HF_TOKEN = os.getenv("HF_TOKEN")
349
+ SERPAPI_KEY = os.getenv("SERPAPI_API_KEY")
350
+
351
+ def process_gift_recommendation_request(conversation_text):
352
+ """
353
+ Process a gift recommendation request with real product searches.
354
+ """
355
+ try:
356
+ # Initialize the Gift Finder API
357
+ api = GiftFinderAPI(hf_token=HF_TOKEN)
358
+
359
+ # Extract gift data and generate search query
360
+ extracted_data = api.extract_gift_data(conversation_text)
361
+ search_query = api.generate_gift_query(conversation_text)
362
+
363
+ print(f"Extracted data: {extracted_data}")
364
+ print(f"Search query: {search_query}")
365
+
366
+ # Get gift recommendations with real product search if SERPAPI_KEY is available
367
+ if SERPAPI_KEY:
368
+ print("Using SerpAPI for real product recommendations")
369
+ recommendations = api.get_gift_recommendations(
370
+ conversation=conversation_text,
371
+ num_recommendations=5,
372
+ search_api_key=SERPAPI_KEY
373
+ )
374
+ else:
375
+ print("Using example recommendations (no SerpAPI key provided)")
376
+ recommendations = api.get_gift_recommendations(
377
+ conversation=conversation_text
378
+ )
379
+
380
+ return {
381
+ "status": "success",
382
+ "extracted_data": extracted_data,
383
+ "search_query": search_query,
384
+ "recommendations": recommendations
385
+ }
386
+
387
+ except Exception as e:
388
+ print(f"Error: {str(e)}")
389
+ return {
390
+ "status": "error",
391
+ "message": str(e)
392
+ }
393
+
394
+ # Example usage
395
+ if __name__ == "__main__":
396
+ conversation = """
397
+ USER: I need a gift for my friend who loves hiking. Budget is $100.
398
+ ASSISTANT: I'll help you find a hiking gift. Does your friend have any specific hiking gear already?
399
+ USER: They need a new backpack and they hike in all weather conditions.
400
+ """
401
+
402
+ result = process_gift_recommendation_request(conversation)
403
+
404
+ if result["status"] == "success":
405
+ print("\nRecommendations:")
406
+ for i, rec in enumerate(result["recommendations"], 1):
407
+ print(f"{i}. {rec['name']} - {rec['price']}")
408
+ print(f" {rec['description'] if 'description' in rec else ''}")
409
+ print(f" {rec['url']}")
410
+ print()
411
+ else:
412
+ print(f"Error: {result['message']}")
413
+ ```
414
+
415
+ ## Environment Setup
416
+
417
+ To use SerpAPI with the Gift Finder API, make sure to set up your environment variables:
418
+
419
+ ```
420
+ # .env file
421
+ HF_TOKEN=your_huggingface_token
422
+ SERPAPI_API_KEY=your_serpapi_key
423
+ ```
424
+
425
+ ## Need Help?
426
+
427
+ For more information, see the full documentation in [HUGGINGFACE_INTEGRATION.md](HUGGINGFACE_INTEGRATION.md).