From b0b4a6a0d0a933323d50d6cef8f134add9f6465c Mon Sep 17 00:00:00 2001 From: Alex-wuhu Date: Thu, 19 Mar 2026 12:11:41 +0800 Subject: [PATCH 1/3] feat: add Novita AI provider example Add novita-basic.py demonstrating how to use Novita AI's OpenAI-compatible endpoint with PraisonAI Agents. Uses NOVITA_API_KEY env var and base_url=https://api.novita.ai/openai following the same pattern as existing ollama and gemini examples. Co-Authored-By: Claude Sonnet 4.6 --- src/praisonai-agents/novita-basic.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/praisonai-agents/novita-basic.py diff --git a/src/praisonai-agents/novita-basic.py b/src/praisonai-agents/novita-basic.py new file mode 100644 index 000000000..544d84bc1 --- /dev/null +++ b/src/praisonai-agents/novita-basic.py @@ -0,0 +1,24 @@ +""" +Novita AI integration example for PraisonAI Agents. + +Novita AI provides an OpenAI-compatible endpoint, allowing you to use +high-quality open-source models (Kimi, DeepSeek, GLM, etc.) via the +standard interface. + +Prerequisites: + Set your Novita AI API key as an environment variable: + export NOVITA_API_KEY="your-api-key-here" + + Get your API key at: https://novita.ai +""" +import os +from praisonaiagents import Agent + +agent = Agent( + instructions="You are a helpful assistant", + llm="openai/moonshotai/kimi-k2.5", + base_url="https://api.novita.ai/openai", + api_key=os.environ.get("NOVITA_API_KEY"), +) + +agent.start("Why is the sky blue?") From 4788333ce0c8ab6cc4670bb9062c6cf2bfdb9bfa Mon Sep 17 00:00:00 2001 From: Alex-wuhu Date: Thu, 19 Mar 2026 12:21:56 +0800 Subject: [PATCH 2/3] feat(novita): add unit tests for Novita AI provider integration Adds tests/unit/test_novita_provider.py with coverage for Novita AI's OpenAI-compatible endpoint (https://api.novita.ai/openai), verifying that Agent correctly accepts base_url, api_key, and Novita model names (Kimi, DeepSeek, GLM). Co-Authored-By: Claude Sonnet 4.6 --- .../tests/unit/test_novita_provider.py | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/praisonai-agents/tests/unit/test_novita_provider.py diff --git a/src/praisonai-agents/tests/unit/test_novita_provider.py b/src/praisonai-agents/tests/unit/test_novita_provider.py new file mode 100644 index 000000000..b94fa1e37 --- /dev/null +++ b/src/praisonai-agents/tests/unit/test_novita_provider.py @@ -0,0 +1,97 @@ +""" +Tests for Novita AI provider integration. + +Novita AI provides an OpenAI-compatible endpoint (https://api.novita.ai/openai), +allowing PraisonAI agents to use Kimi, DeepSeek, GLM, and other models. + +These tests verify that the Agent class correctly accepts Novita configuration +without making real API calls. +""" + +import pytest +from unittest.mock import patch +import os + + +class TestNovitaProviderConfig: + """Test that Agent accepts Novita AI provider configuration.""" + + def test_agent_accepts_novita_base_url(self): + """Agent should accept Novita's OpenAI-compatible base_url.""" + from praisonaiagents import Agent + + agent = Agent( + name="NovitaTest", + instructions="You are a helpful assistant", + llm="openai/moonshotai/kimi-k2.5", + base_url="https://api.novita.ai/openai", + api_key="test-novita-key", + ) + assert agent is not None + assert agent.base_url == "https://api.novita.ai/openai" + + def test_agent_novita_api_key_from_env(self): + """Agent should read NOVITA_API_KEY from environment.""" + from praisonaiagents import Agent + + with patch.dict(os.environ, {"NOVITA_API_KEY": "env-test-key"}): + agent = Agent( + name="NovitaEnvTest", + instructions="You are a helpful assistant", + llm="openai/moonshotai/kimi-k2.5", + base_url="https://api.novita.ai/openai", + api_key=os.environ.get("NOVITA_API_KEY"), + ) + assert agent is not None + + def test_agent_novita_kimi_model(self): + """Agent should accept Novita's Kimi model.""" + from praisonaiagents import Agent + + agent = Agent( + name="KimiTest", + instructions="You are a helpful assistant", + llm="openai/moonshotai/kimi-k2.5", + base_url="https://api.novita.ai/openai", + api_key="test-key", + ) + assert agent is not None + + def test_agent_novita_deepseek_model(self): + """Agent should accept Novita's DeepSeek model.""" + from praisonaiagents import Agent + + agent = Agent( + name="DeepSeekNovitaTest", + instructions="You are a helpful assistant", + llm="openai/deepseek/deepseek-v3.2", + base_url="https://api.novita.ai/openai", + api_key="test-key", + ) + assert agent is not None + + def test_agent_novita_glm_model(self): + """Agent should accept Novita's GLM model.""" + from praisonaiagents import Agent + + agent = Agent( + name="GLMNovitaTest", + instructions="You are a helpful assistant", + llm="openai/zai-org/glm-5", + base_url="https://api.novita.ai/openai", + api_key="test-key", + ) + assert agent is not None + + def test_agent_novita_model_stored(self): + """Agent should store the Novita model name correctly.""" + from praisonaiagents import Agent + + agent = Agent( + name="ModelStoreTest", + instructions="You are a helpful assistant", + llm="openai/moonshotai/kimi-k2.5", + base_url="https://api.novita.ai/openai", + api_key="test-key", + ) + assert "kimi-k2.5" in agent.llm or "moonshotai" in agent.llm From b2dadec4ed12e6cfcf4e0e080aab0961ad5fd345 Mon Sep 17 00:00:00 2001 From: Alex-wuhu Date: Thu, 19 Mar 2026 15:25:54 +0800 Subject: [PATCH 3/3] fix(novita): address PR review feedback - Add API key validation in example before Agent construction - Consolidate duplicate model tests into parametrized test - Use exact equality assertion for model name storage Co-Authored-By: Claude Opus 4.6 --- src/praisonai-agents/novita-basic.py | 9 ++- .../tests/unit/test_novita_provider.py | 56 +++++-------------- 2 files changed, 21 insertions(+), 44 deletions(-) diff --git a/src/praisonai-agents/novita-basic.py b/src/praisonai-agents/novita-basic.py index 544d84bc1..863c7f784 100644 --- a/src/praisonai-agents/novita-basic.py +++ b/src/praisonai-agents/novita-basic.py @@ -14,11 +14,18 @@ import os from praisonaiagents import Agent +api_key = os.environ.get("NOVITA_API_KEY") +if not api_key: + raise ValueError( + "The NOVITA_API_KEY environment variable is not set. " + "Please set it to your Novita AI API key." + ) + agent = Agent( instructions="You are a helpful assistant", llm="openai/moonshotai/kimi-k2.5", base_url="https://api.novita.ai/openai", - api_key=os.environ.get("NOVITA_API_KEY"), + api_key=api_key, ) agent.start("Why is the sky blue?") diff --git a/src/praisonai-agents/tests/unit/test_novita_provider.py b/src/praisonai-agents/tests/unit/test_novita_provider.py index b94fa1e37..f0db45677 100644 --- a/src/praisonai-agents/tests/unit/test_novita_provider.py +++ b/src/praisonai-agents/tests/unit/test_novita_provider.py @@ -44,54 +44,24 @@ def test_agent_novita_api_key_from_env(self): ) assert agent is not None - def test_agent_novita_kimi_model(self): - """Agent should accept Novita's Kimi model.""" + @pytest.mark.parametrize( + "model_name", + [ + "openai/moonshotai/kimi-k2.5", + "openai/deepseek/deepseek-v3.2", + "openai/zai-org/glm-5", + ], + ) + def test_agent_novita_models(self, model_name): + """Agent should accept various Novita models and store them correctly.""" from praisonaiagents import Agent agent = Agent( - name="KimiTest", + name=f"NovitaModelTest-{model_name.split('/')[-1]}", instructions="You are a helpful assistant", - llm="openai/moonshotai/kimi-k2.5", - base_url="https://api.novita.ai/openai", - api_key="test-key", - ) - assert agent is not None - - def test_agent_novita_deepseek_model(self): - """Agent should accept Novita's DeepSeek model.""" - from praisonaiagents import Agent - - agent = Agent( - name="DeepSeekNovitaTest", - instructions="You are a helpful assistant", - llm="openai/deepseek/deepseek-v3.2", - base_url="https://api.novita.ai/openai", - api_key="test-key", - ) - assert agent is not None - - def test_agent_novita_glm_model(self): - """Agent should accept Novita's GLM model.""" - from praisonaiagents import Agent - - agent = Agent( - name="GLMNovitaTest", - instructions="You are a helpful assistant", - llm="openai/zai-org/glm-5", + llm=model_name, base_url="https://api.novita.ai/openai", api_key="test-key", ) assert agent is not None - - def test_agent_novita_model_stored(self): - """Agent should store the Novita model name correctly.""" - from praisonaiagents import Agent - - agent = Agent( - name="ModelStoreTest", - instructions="You are a helpful assistant", - llm="openai/moonshotai/kimi-k2.5", - base_url="https://api.novita.ai/openai", - api_key="test-key", - ) - assert "kimi-k2.5" in agent.llm or "moonshotai" in agent.llm + assert agent.llm == model_name