|
import os |
|
|
|
import requests |
|
|
|
KALEMAT_BASE_URL = "https://api.kalimat.dev/search" |
|
FN_NAME = "search_hadith" |
|
|
|
|
|
class SearchHadith: |
|
|
|
def __init__(self, kalimat_api_key): |
|
self.api_key = kalimat_api_key |
|
self.base_url = KALEMAT_BASE_URL |
|
|
|
def get_function_description(self): |
|
return { |
|
"name": FN_NAME, |
|
"description": "Search the Hadith for relevant narrations. Returns a list of hadith. Multiple hadith may be relevant.", |
|
"parameters": { |
|
"type": "object", |
|
"properties": { |
|
"query": { |
|
"type": "string", |
|
"description": "The topic to search the Hadith for ", |
|
}, |
|
}, |
|
"required": ["query"], |
|
}, |
|
} |
|
|
|
def get_fn_name(self): |
|
return FN_NAME |
|
|
|
def run(self, query: str, numResults: int = 5): |
|
|
|
headers = {"x-api-key": self.api_key} |
|
payload = { |
|
"query": query, |
|
"numResults": numResults, |
|
"indexes": '["sunnah_lk"]', |
|
"getText": 2, |
|
} |
|
|
|
response = requests.get(self.base_url, headers=headers, params=payload) |
|
|
|
if response.status_code != 200: |
|
raise Exception( |
|
f"Request failed with status {response.status_code} {response.text}" |
|
) |
|
|
|
return response.json() |
|
|
|
def pp_hadith(self, h): |
|
en = h["en_text"] |
|
grade = h["grade_en"].strip() |
|
if grade: |
|
grade = f"\nGrade: {grade}\n" |
|
src = f"Collection: {h['source_book']} Chapter: {h['chapter_number']} Hadith: {h['hadith_number']} LK id: {h['id']}" |
|
result = f"{src}\n{en}\n{grade}" |
|
|
|
return result |
|
|
|
def run_as_list(self, query: str, num_results: int = 3): |
|
print(f'Searching hadith for "{query}"') |
|
results = self.run(query, num_results) |
|
return [self.pp_hadith(r) for r in results] |
|
|
|
def run_as_string(self, query: str, num_results: int = 3): |
|
results = self.run(query, num_results) |
|
rstring = "\n".join([self.pp_ayah(r) for r in results]) |
|
return rstring |
|
|