Spaces:
Running
Running
import gradio as gr | |
import apiCall | |
import json | |
def api_call( | |
base_url=None, | |
auth_token=None, | |
endpoint=None, | |
param_keys_values=None, | |
additional_params=None, | |
method="GET", | |
): | |
""" | |
Make an API call to fetch data with dynamic parameters. | |
Parameters: | |
- base_url: The base URL of the API (e.g., "https://api.example.com") | |
- auth_token: Optional authentication token for APIs requiring authorization | |
- endpoint: The specific API endpoint to call (e.g., "search", "users/profile") | |
- param_keys_values: String containing parameter key-value pairs, one per line in format "key: value" | |
- additional_params: Optional JSON string for complex parameters | |
- method: HTTP method to use (GET, POST, PUT, DELETE) | |
Instructions: | |
- Format param_keys_values as a multi-line string with each parameter on a new line | |
- For numeric values, simply use numbers without quotes | |
- For boolean values, use "true" or "false" (lowercase) | |
- For string values, just provide the string without additional quotes | |
""" | |
# Build params dictionary from key-value pairs | |
params = {} | |
# Process param_keys_values | |
if param_keys_values: | |
lines = param_keys_values.strip().split("\n") | |
for line in lines: | |
if ":" in line: | |
key, value = line.split(":", 1) | |
key = key.strip() | |
value = value.strip() | |
if key: # Only add non-empty keys | |
# Try to parse numeric values | |
if value.isdigit(): | |
params[key] = int(value) | |
elif value.lower() == "true": | |
params[key] = True | |
elif value.lower() == "false": | |
params[key] = False | |
else: | |
params[key] = value | |
# Handle additional parameters | |
if additional_params and additional_params.strip(): | |
try: | |
# Parse additional JSON parameters | |
extra_params = json.loads(additional_params) | |
if isinstance(extra_params, dict): | |
params.update(extra_params) | |
else: | |
return "Error: Additional parameters must be a valid JSON object" | |
except json.JSONDecodeError as e: | |
return f"Error parsing additional parameters: {str(e)}" | |
try: | |
client = apiCall.APIClient(base_url, auth_token) | |
result = client.make_request( | |
endpoint=endpoint, | |
params=params, | |
method=method, | |
) | |
return result | |
except Exception as e: | |
return f"Error making API call: {str(e)}" | |
demo = gr.Interface( | |
fn=api_call, | |
inputs=[ | |
gr.Textbox( | |
label="Base URL", | |
placeholder="Enter base URL", | |
value="https://v2.xivapi.com/api", | |
), | |
gr.Textbox(label="Auth Token", placeholder="Enter auth token (optional)"), | |
gr.Textbox(label="Endpoint", placeholder="Enter endpoint", value="search"), | |
gr.Textbox( | |
label="Parameter Key-Value Pairs", | |
placeholder="Enter one parameter per line in format 'key: value'", | |
value='query: Name~"popoto"\nsheets: Item\nfields: Name,Description\nlanguage: en\nlimit: 1', | |
lines=5, | |
), | |
gr.Textbox( | |
label="Additional Parameters (JSON)", | |
placeholder="Enter any additional parameters as JSON", | |
value="{}", | |
lines=3, | |
), | |
gr.Radio(choices=["GET", "POST", "PUT", "DELETE"], label="Method", value="GET"), | |
], | |
outputs=gr.Textbox(label="API Response", lines=10), | |
title="Universal API Client", | |
description="Make API calls to any endpoint with custom parameters. \n\n" | |
+ "- **Base URL**: Enter the full API base URL (e.g., 'https://api.example.com') \n" | |
+ "- **Auth Token**: Provide if the API requires authentication \n" | |
+ "- **Endpoint**: The specific endpoint to call (without leading slash) \n" | |
+ "- **Parameter Key-Value Pairs**: Format as 'key: value' with each pair on a new line \n" | |
+ " Example: \n```\nquery: search term\nlimit: 10\nfilter: active\n``` \n" | |
+ "- **Additional Parameters**: Use valid JSON format for nested or complex parameters \n" | |
+ "- **Method**: Choose the appropriate HTTP method for your request", | |
examples=[ | |
[ | |
"https://v2.xivapi.com/api", | |
"", | |
"search", | |
'query: Name~"popoto"\nsheets: Item\nfields: Name,Description\nlanguage: en\nlimit: 1', | |
"{}", | |
"GET", | |
], | |
[ | |
"https://api.github.com", | |
"", | |
"repos/microsoft/TypeScript/issues", | |
"state: open\nper_page: 5", | |
"{}", | |
"GET", | |
], | |
], | |
flagging_mode="manual", | |
flagging_options=["Invalid Request", "API Error", "Other"], | |
) | |
if __name__ == "__main__": | |
demo.launch(mcp_server=True) | |