From 98054e4ce4bb7d28f1b15fcc8069886feb62096e Mon Sep 17 00:00:00 2001 From: Yashvardhan Goel Date: Thu, 27 Feb 2025 18:38:56 +0530 Subject: [PATCH 1/3] feat: Add Mira Network provider to closed-source services --- .../services/css_inference_service/src/app.py | 1 + .../src/infernet_ml/utils/codec/css.py | 2 +- .../src/infernet_ml/utils/css_models.py | 7 +++ .../src/infernet_ml/utils/css_mux.py | 45 ++++++++++++++++++- 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/infernet_services/services/css_inference_service/src/app.py b/infernet_services/services/css_inference_service/src/app.py index 425a1c6..ed27993 100644 --- a/infernet_services/services/css_inference_service/src/app.py +++ b/infernet_services/services/css_inference_service/src/app.py @@ -95,6 +95,7 @@ def create_app() -> Quart: CSSProvider.GOOSEAI: os.getenv("GOOSEAI_API_KEY"), CSSProvider.OPENAI: os.getenv("OPENAI_API_KEY"), CSSProvider.PERPLEXITYAI: os.getenv("PERPLEXITYAI_API_KEY"), + CSSProvider.MIRANETWORK: os.getenv("MIRANETWORK_API_KEY"), } providers = sorted(api_keys.keys()) diff --git a/libraries/infernet_ml/src/infernet_ml/utils/codec/css.py b/libraries/infernet_ml/src/infernet_ml/utils/codec/css.py index 47e5bea..7bc6ba8 100644 --- a/libraries/infernet_ml/src/infernet_ml/utils/codec/css.py +++ b/libraries/infernet_ml/src/infernet_ml/utils/codec/css.py @@ -26,7 +26,7 @@ class CSSProvider(IntEnum): OPENAI = 0 GOOSEAI = 1 PERPLEXITYAI = 2 - + MIRANETWORK = 3 def encode_css_completion_request( provider: CSSProvider, diff --git a/libraries/infernet_ml/src/infernet_ml/utils/css_models.py b/libraries/infernet_ml/src/infernet_ml/utils/css_models.py index 680b405..7bc4559 100644 --- a/libraries/infernet_ml/src/infernet_ml/utils/css_models.py +++ b/libraries/infernet_ml/src/infernet_ml/utils/css_models.py @@ -85,4 +85,11 @@ {"id": "GOOSEAI/gpt-neoNone-3b", "name": "GPT-Neo 1.3B", "parameters": "1.3B"}, {"id": "GOOSEAI/gpt-neo-2-7b", "name": "GPT-Neo 2.7B", "parameters": "2.7B"}, ], + CSSProvider.MIRANETWORK: [ + {"id": "MIRANETWORK/gpt-4o", "name": "GPT-4O", "parameters": None}, + {"id": "MIRANETWORK/deepseek-r1", "name": "Deepseek R1", "parameters": None}, + {"id": "MIRANETWORK/gpt-4o-mini", "name": "GPT-4O Mini", "parameters": None}, + {"id": "MIRANETWORK/claude-3.5-sonnet", "name": "Claude 3.5 Sonnet", "parameters": None}, + {"id": "MIRANETWORK/llama-3.3-70b-instruct", "name": "Llama 3.3 70B Instruct", "parameters": "70B"}, + ], } diff --git a/libraries/infernet_ml/src/infernet_ml/utils/css_mux.py b/libraries/infernet_ml/src/infernet_ml/utils/css_mux.py index 003af24..9752450 100644 --- a/libraries/infernet_ml/src/infernet_ml/utils/css_mux.py +++ b/libraries/infernet_ml/src/infernet_ml/utils/css_mux.py @@ -1,7 +1,7 @@ """ Library containing functions for accessing closed source models. -Currently, 3 APIs are supported: OPENAI, PERPLEXITYAI, and GOOSEAI. +Currently, 4 APIs are supported: OPENAI, PERPLEXITYAI, GOOSEAI, and MIRANETWORK. """ @@ -51,7 +51,7 @@ class CSSProvider(StrEnum): OPENAI = "OPENAI" PERPLEXITYAI = "PERPLEXITYAI" GOOSEAI = "GOOSEAI" - + MIRANETWORK = "MIRANETWORK" ApiKeys = Dict[CSSProvider, Optional[str]] @@ -174,6 +174,34 @@ def goose_ai_request_generator(req: CSSRequest) -> tuple[str, dict[str, Any]]: raise InfernetMLException(f"Unsupported request {req}") +def mira_network_request_generator(req: CSSRequest) -> tuple[str, dict[str, Any]]: + """Returns base url & json input for Miran Network API. + + Args: + req: a CSSRequest object, containing provider, endpoint, model, + api keys & params. + + Returns: + base_url: str + processed input: dict[str, Any] + + Raises: + InfernetMLException: if an unsupported model or params specified. + """ + match req: + case CSSRequest(model=model_name, params=CSSCompletionParams(messages=msgs)): + return "https://api.mira.network/v1/", { + "model": model_name, + "messages": [msg.model_dump() for msg in msgs], + } + case CSSRequest(model=model_name, params=CSSEmbeddingParams(input=input)): + return "https://api.mira.network/v1/", { + "model": model_name, + "input": input, + } + case _: + raise InfernetMLException(f"Unsupported request {req}") + def extract_completions(result: Dict[str, Any]) -> str: return cast(str, result["choices"][0]["message"]["content"]) @@ -214,6 +242,15 @@ def extract_completions_gooseai(result: Dict[str, Any]) -> str: } }, }, + CSSProvider.MIRANETWORK: { + "input_func": mira_network_request_generator, + "endpoints": { + "completions": { + "real_endpoint": "chat/completions", + "post_process": extract_completions, + } + }, + }, } @@ -289,6 +326,9 @@ def css_mux(req: CSSRequest) -> str: case CSSProvider.PERPLEXITYAI: if result.status_code == 429: raise RetryableException(result.text) + case CSSProvider.MIRANETWORK: + if result.status_code == 429 or result.status_code == 500: + raise RetryableException(result.text) case _: raise InfernetMLException(result.text) @@ -304,6 +344,7 @@ def css_mux(req: CSSRequest) -> str: "content", "" ), CSSProvider.GOOSEAI: lambda result: result["choices"][0]["text"], + CSSProvider.MIRANETWORK: lambda result: result["choices"][0]["delta"].get("content", ""), } From 565f50b7f9b140a154051f2e1e899572ab6d0480 Mon Sep 17 00:00:00 2001 From: Yashvardhan Goel Date: Tue, 4 Mar 2025 22:04:46 +0530 Subject: [PATCH 2/3] feat: Add Mira Network test and configuration support --- .../css_inference_service/.env.example | 1 + .../tests/css_inference_service/conftest.py | 9 +-- .../css_inference_service/simple_mira_test.py | 65 +++++++++++++++++++ .../src/infernet_ml/utils/css_mux.py | 5 -- 4 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 infernet_services/tests/css_inference_service/simple_mira_test.py diff --git a/infernet_services/services/css_inference_service/.env.example b/infernet_services/services/css_inference_service/.env.example index 15d9c2d..f6d78f1 100644 --- a/infernet_services/services/css_inference_service/.env.example +++ b/infernet_services/services/css_inference_service/.env.example @@ -1,5 +1,6 @@ OPENAI_API_KEY= GOOSEAI_API_KEY= PERPLEXITYAI_API_KEY= +MIRANETWORK_API_KEY=sk-mira-34a4ecb272fa1ee16ab63ec4e6563b145f0418d2bf0aaed3 RETRY_PARAMS={"tries": 3, "delay": 3, "backoff": 2, "max_delay": 10, "jitter": [0.5, 1.5]} diff --git a/infernet_services/tests/css_inference_service/conftest.py b/infernet_services/tests/css_inference_service/conftest.py index e2646bf..c0f42ee 100644 --- a/infernet_services/tests/css_inference_service/conftest.py +++ b/infernet_services/tests/css_inference_service/conftest.py @@ -19,9 +19,10 @@ log = logging.getLogger(__name__) env_vars = { - "PERPLEXITYAI_API_KEY": os.environ["PERPLEXITYAI_API_KEY"], - "GOOSEAI_API_KEY": os.environ["GOOSEAI_API_KEY"], - "OPENAI_API_KEY": os.environ["OPENAI_API_KEY"], + "PERPLEXITYAI_API_KEY": os.environ.get("PERPLEXITYAI_API_KEY", "dummy_key"), + "GOOSEAI_API_KEY": os.environ.get("GOOSEAI_API_KEY", "dummy_key"), + "OPENAI_API_KEY": os.environ.get("OPENAI_API_KEY", "dummy_key"), + "MIRANETWORK_API_KEY": os.environ.get("MIRANETWORK_API_KEY", "sk-mira-34a4ecb272fa1ee16ab63ec4e6563b145f0418d2bf0aaed3"), "CSS_INF_WORKFLOW_POSITIONAL_ARGS": "[]", "CSS_INF_WORKFLOW_KW_ARGS": json.dumps( { @@ -51,7 +52,7 @@ name=CSS_OPENAI_ONLY, image_id=f"ritualnetwork/{SERVICE_NAME}:{SERVICE_VERSION}", env_vars={ - "OPENAI_API_KEY": os.environ["OPENAI_API_KEY"], + "OPENAI_API_KEY": os.environ.get("OPENAI_API_KEY", "dummy_key"), "CSS_INF_WORKFLOW_POSITIONAL_ARGS": "[]", "CSS_INF_WORKFLOW_KW_ARGS": json.dumps( { diff --git a/infernet_services/tests/css_inference_service/simple_mira_test.py b/infernet_services/tests/css_inference_service/simple_mira_test.py new file mode 100644 index 0000000..7128d38 --- /dev/null +++ b/infernet_services/tests/css_inference_service/simple_mira_test.py @@ -0,0 +1,65 @@ +""" +Simple test for Mira Network integration. +This script tests the Mira Network integration by making direct API calls. +""" + +import unittest +import os +import sys +from pathlib import Path +import json +import requests + +# Add the project root to the Python path +project_root = str(Path(__file__).parent.parent.parent.parent) +if project_root not in sys.path: + sys.path.append(project_root) + +# Use the API key from conftest.py +MIRANETWORK_API_KEY = "sk-mira-34a4ecb272fa1ee16ab63ec4e6563b145f0418d2bf0aaed3" + +class TestMiraNetworkAPI(unittest.TestCase): + """Test class for Mira Network API integration""" + + def test_mira_network_api_direct(self): + """Test Mira Network API directly without using the css_mux function""" + # Define the API endpoint + url = "https://api.mira.network/v1/chat/completions" + + # Define the headers + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {MIRANETWORK_API_KEY}" + } + + # Define the payload + payload = { + "model": "gpt-4o", + "messages": [ + { + "role": "user", + "content": "Explain quantum computing in one paragraph." + } + ], + "temperature": 0.7, + "max_tokens": 100 + } + + # Make the API call + response = requests.post(url, headers=headers, json=payload) + + # Print the response for debugging + print(f"Status code: {response.status_code}") + print(f"Response: {response.text}") + + # Verify the response + self.assertEqual(response.status_code, 200) + response_json = response.json() + self.assertIn("choices", response_json) + self.assertGreater(len(response_json["choices"]), 0) + self.assertIn("message", response_json["choices"][0]) + self.assertIn("content", response_json["choices"][0]["message"]) + self.assertGreater(len(response_json["choices"][0]["message"]["content"]), 0) + +if __name__ == "__main__": + unittest.main() diff --git a/libraries/infernet_ml/src/infernet_ml/utils/css_mux.py b/libraries/infernet_ml/src/infernet_ml/utils/css_mux.py index 9752450..4d75396 100644 --- a/libraries/infernet_ml/src/infernet_ml/utils/css_mux.py +++ b/libraries/infernet_ml/src/infernet_ml/utils/css_mux.py @@ -194,11 +194,6 @@ def mira_network_request_generator(req: CSSRequest) -> tuple[str, dict[str, Any] "model": model_name, "messages": [msg.model_dump() for msg in msgs], } - case CSSRequest(model=model_name, params=CSSEmbeddingParams(input=input)): - return "https://api.mira.network/v1/", { - "model": model_name, - "input": input, - } case _: raise InfernetMLException(f"Unsupported request {req}") From 1ded72c1edfcaeb0388fa8e998685d4ba3e998bb Mon Sep 17 00:00:00 2001 From: Yashvardhan Goel Date: Wed, 5 Mar 2025 22:26:12 +0530 Subject: [PATCH 3/3] chore: Remove hardcoded Mira Network API key from test and example files --- infernet_services/services/css_inference_service/.env.example | 2 +- infernet_services/tests/css_inference_service/conftest.py | 2 +- .../tests/css_inference_service/simple_mira_test.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/infernet_services/services/css_inference_service/.env.example b/infernet_services/services/css_inference_service/.env.example index f6d78f1..52b1f27 100644 --- a/infernet_services/services/css_inference_service/.env.example +++ b/infernet_services/services/css_inference_service/.env.example @@ -1,6 +1,6 @@ OPENAI_API_KEY= GOOSEAI_API_KEY= PERPLEXITYAI_API_KEY= -MIRANETWORK_API_KEY=sk-mira-34a4ecb272fa1ee16ab63ec4e6563b145f0418d2bf0aaed3 +MIRANETWORK_API_KEY= RETRY_PARAMS={"tries": 3, "delay": 3, "backoff": 2, "max_delay": 10, "jitter": [0.5, 1.5]} diff --git a/infernet_services/tests/css_inference_service/conftest.py b/infernet_services/tests/css_inference_service/conftest.py index c0f42ee..1ccf3ef 100644 --- a/infernet_services/tests/css_inference_service/conftest.py +++ b/infernet_services/tests/css_inference_service/conftest.py @@ -22,7 +22,7 @@ "PERPLEXITYAI_API_KEY": os.environ.get("PERPLEXITYAI_API_KEY", "dummy_key"), "GOOSEAI_API_KEY": os.environ.get("GOOSEAI_API_KEY", "dummy_key"), "OPENAI_API_KEY": os.environ.get("OPENAI_API_KEY", "dummy_key"), - "MIRANETWORK_API_KEY": os.environ.get("MIRANETWORK_API_KEY", "sk-mira-34a4ecb272fa1ee16ab63ec4e6563b145f0418d2bf0aaed3"), + "MIRANETWORK_API_KEY": os.environ.get("MIRANETWORK_API_KEY"), "CSS_INF_WORKFLOW_POSITIONAL_ARGS": "[]", "CSS_INF_WORKFLOW_KW_ARGS": json.dumps( { diff --git a/infernet_services/tests/css_inference_service/simple_mira_test.py b/infernet_services/tests/css_inference_service/simple_mira_test.py index 7128d38..0673176 100644 --- a/infernet_services/tests/css_inference_service/simple_mira_test.py +++ b/infernet_services/tests/css_inference_service/simple_mira_test.py @@ -16,7 +16,7 @@ sys.path.append(project_root) # Use the API key from conftest.py -MIRANETWORK_API_KEY = "sk-mira-34a4ecb272fa1ee16ab63ec4e6563b145f0418d2bf0aaed3" +MIRANETWORK_API_KEY = "" class TestMiraNetworkAPI(unittest.TestCase): """Test class for Mira Network API integration"""