Spaces:
Paused
Paused
| import requests | |
| import os | |
| from typing import Any, Dict | |
| # from wandbot.wandbot_tool import query_wandbot_api, WANDBOT_TOOL_DESCRIPTION | |
| WANDBOT_TOOL_DESCRIPTION = """Query the Weights & Biases support bot api for help with questions about the | |
| Weights & Biases platform and how to use W&B Models and W&B Weave. | |
| W&B features mentioned could include: | |
| - Experiment tracking with Runs and Sweeps | |
| - Model management with Models | |
| - Model management and Data versioning with Artifacts and Registry | |
| - Collaboration with Teams, Organizations and Reports | |
| - Visualization with Tables and Charts | |
| - Tracing and logging with Weave | |
| - Evaluation and Scorers with Weave Evaluations | |
| - Weave Datasets | |
| FYI: The Weigths & Biases platform is owned by Coreweave. If there are queries related to W&B, wandb \ | |
| or weave and Coreweave, they might be related to W&B products or features that leverage Coreweave's \ | |
| GPU or compute infrastructure. | |
| Parameters | |
| ---------- | |
| question : str | |
| Users question about a Weights & Biases product or feature | |
| Returns | |
| ------- | |
| str | |
| newer to the user's question | |
| """ | |
| def query_wandbot_api(question: str) -> Dict[str, Any]: | |
| wandbot_base_url = os.getenv("WANDBOT_BASE_URL", "https://weightsandbiases-wandbot--wandbot-api-wandbotapi-serve.modal.run") | |
| QUERY_ENDPOINT = f"{wandbot_base_url}/chat/query" | |
| STATUS_ENDPOINT = f"{wandbot_base_url}/status" | |
| QUERY_TIMEOUT_SECONDS = 40 | |
| STATUS_TIMEOUT_SECONDS = 20 | |
| try: | |
| status_response = requests.get( | |
| STATUS_ENDPOINT, | |
| headers={"Accept": "application/json"}, | |
| timeout=STATUS_TIMEOUT_SECONDS, | |
| ) | |
| # Check HTTP status code | |
| status_response.raise_for_status() | |
| # Try to parse JSON, handle potential parsing errors | |
| try: | |
| status_result = status_response.json() | |
| except ValueError: | |
| return { | |
| "answer": "Error: Unable to parse response from support bot.", | |
| "sources": [], | |
| } | |
| # Validate expected response structure | |
| if "initialized" not in status_result: | |
| return { | |
| "answer": "Error: Received unexpected response format from support bot.", | |
| "sources": [], | |
| } | |
| if status_result["initialized"]: | |
| try: | |
| response = requests.post( | |
| QUERY_ENDPOINT, | |
| headers={"Content-Type": "application/json"}, | |
| json={ | |
| "question": question, | |
| "application": "wandb_mcp_server", | |
| }, | |
| timeout=QUERY_TIMEOUT_SECONDS, | |
| ) | |
| # Check HTTP status code | |
| response.raise_for_status() | |
| # Try to parse JSON, handle potential parsing errors | |
| try: | |
| result = response.json() | |
| except ValueError: | |
| return { | |
| "answer": "Error: Unable to parse response data from support bot.", | |
| "sources": [], | |
| } | |
| # Validate expected response structure | |
| if "answer" not in result or "sources" not in result: | |
| return { | |
| "answer": "Error: Received incomplete response from support bot.", | |
| "sources": [], | |
| } | |
| # Ensure sources is a list | |
| sources = ( | |
| result["sources"] | |
| if isinstance(result["sources"], list) | |
| else [result["sources"]] | |
| ) | |
| return {"answer": result["answer"], "sources": sources} | |
| except requests.Timeout: | |
| return { | |
| "answer": "Error: Support bot request timed out. Please try again later.", | |
| "sources": [], | |
| } | |
| except requests.RequestException as e: | |
| return { | |
| "answer": f"Error connecting to support bot: {str(e)}", | |
| "sources": [], | |
| } | |
| else: | |
| return { | |
| "answer": "The support bot is appears to be offline. Please try again later.", | |
| "sources": [], | |
| } | |
| except requests.Timeout: | |
| return { | |
| "answer": "Error: Support bot status check timed out. Please try again later.", | |
| "sources": [], | |
| } | |
| except requests.RequestException as e: | |
| return { | |
| "answer": f"Error connecting to support bot: {str(e)}", | |
| "sources": [], | |
| } | |