diff --git a/.gitignore b/.gitignore index 049603f1..eb1bf88b 100644 --- a/.gitignore +++ b/.gitignore @@ -171,6 +171,9 @@ examples/mcp_root_test/test_data/*.png #.idea/ uv.lock +# MacOS +.DS_Store + # File generated from promptify script (to create an LLM-friendly prompt for the repo) project_contents.md diff --git a/examples/deepinfra/example.py b/examples/deepinfra/example.py new file mode 100644 index 00000000..3faf321c --- /dev/null +++ b/examples/deepinfra/example.py @@ -0,0 +1,21 @@ +from dotenv import load_dotenv, find_dotenv +from mcp_agent.core.fastagent import FastAgent +from mcp_agent.core.prompt import Prompt + +_ = load_dotenv(find_dotenv()) + +fast = FastAgent("deepinfra example") + + +# Define the agent +@fast.agent(instruction="You are a helpful AI Agent", servers=["filesystem", "fetch"]) +async def main(): + # use the --model command line switch or agent arguments to change model + async with fast.run() as agent: + await agent.default.generate( + [ + Prompt.user( + "Write a beautiful poem about the ocean", + ) + ] + ) diff --git a/examples/deepinfra/fastagent.config.yaml b/examples/deepinfra/fastagent.config.yaml new file mode 100644 index 00000000..84d08026 --- /dev/null +++ b/examples/deepinfra/fastagent.config.yaml @@ -0,0 +1,43 @@ +# FastAgent Configuration File + +# DeepInfra Model Configuration: +# +# Takes format: +# deepinfra. (e.g. deepinfra.Qwen/Qwen3-30B-A3B or deepinfra.meta-llama/Llama-4-Scout-17B-16E-Instruct) +# Accepts all models from https://deepinfra.com/models + +default_model: deepinfra.Qwen/Qwen3-14B + +# Logging and Console Configuration: +logger: + # level: "debug" | "info" | "warning" | "error" + # type: "none" | "console" | "file" | "http" + # path: "/path/to/logfile.jsonl" + + + # Switch the progress display on or off + progress_display: true + + # Show chat User/Assistant messages on the console + show_chat: true + # Show tool calls on the console + show_tools: true + # Truncate long tool responses on the console + truncate_tools: true + +# MCP Servers +mcp: + servers: + fetch: + command: "uvx" + args: ["mcp-server-fetch"] + filesystem: + command: "npx" + args: ["-y", "@modelcontextprotocol/server-filesystem", "."] + webcam: + command: "npx" + args: ["-y","@llmindset/mcp-webcam"] + hfspace: + command: "npx" + args: ["-y","@llmindset/mcp-hfspace"] + diff --git a/src/mcp_agent/llm/model_factory.py b/src/mcp_agent/llm/model_factory.py index 44d13561..f658b43b 100644 --- a/src/mcp_agent/llm/model_factory.py +++ b/src/mcp_agent/llm/model_factory.py @@ -11,6 +11,7 @@ from mcp_agent.llm.provider_types import Provider from mcp_agent.llm.providers.augmented_llm_anthropic import AnthropicAugmentedLLM from mcp_agent.llm.providers.augmented_llm_azure import AzureOpenAIAugmentedLLM +from mcp_agent.llm.providers.augmented_llm_deepinfra import DeepInfraAugmentedLLM from mcp_agent.llm.providers.augmented_llm_deepseek import DeepSeekAugmentedLLM from mcp_agent.llm.providers.augmented_llm_generic import GenericAugmentedLLM from mcp_agent.llm.providers.augmented_llm_google import GoogleAugmentedLLM @@ -18,7 +19,6 @@ from mcp_agent.llm.providers.augmented_llm_openrouter import OpenRouterAugmentedLLM from mcp_agent.llm.providers.augmented_llm_tensorzero import TensorZeroAugmentedLLM from mcp_agent.mcp.interfaces import AugmentedLLMProtocol - # from mcp_agent.workflows.llm.augmented_llm_deepseek import DeekSeekAugmentedLLM @@ -29,6 +29,7 @@ Type[PassthroughLLM], Type[PlaybackLLM], Type[DeepSeekAugmentedLLM], + Type[DeepInfraAugmentedLLM], Type[OpenRouterAugmentedLLM], Type[TensorZeroAugmentedLLM], ] @@ -115,6 +116,7 @@ class ModelFactory: Provider.OPENROUTER: OpenRouterAugmentedLLM, Provider.TENSORZERO: TensorZeroAugmentedLLM, Provider.AZURE: AzureOpenAIAugmentedLLM, + Provider.DEEPINFRA: DeepInfraAugmentedLLM, } # Mapping of special model names to their specific LLM classes diff --git a/src/mcp_agent/llm/provider_types.py b/src/mcp_agent/llm/provider_types.py index 0e8b94d1..9d74910c 100644 --- a/src/mcp_agent/llm/provider_types.py +++ b/src/mcp_agent/llm/provider_types.py @@ -17,3 +17,4 @@ class Provider(Enum): OPENROUTER = "openrouter" TENSORZERO = "tensorzero" # For TensorZero Gateway AZURE = "azure" # Azure OpenAI Service + DEEPINFRA = "deepinfra" # DeepInfra diff --git a/src/mcp_agent/llm/providers/augmented_llm_deepinfra.py b/src/mcp_agent/llm/providers/augmented_llm_deepinfra.py new file mode 100644 index 00000000..9e149233 --- /dev/null +++ b/src/mcp_agent/llm/providers/augmented_llm_deepinfra.py @@ -0,0 +1,34 @@ +from mcp_agent.llm.provider_types import Provider +from mcp_agent.llm.providers.augmented_llm_openai import OpenAIAugmentedLLM +from mcp_agent.llm.augmented_llm import RequestParams + + +DEFAULT_DEEP_INFRA_MODEL = "deepseek-ai/DeepSeek-V3-0324" + +class DeepInfraAugmentedLLM(OpenAIAugmentedLLM): + + def __init__(self, provider: Provider = Provider.DEEPINFRA, *args, **kwargs) -> None: + super().__init__(provider, *args, **kwargs) + + + def _initialize_default_params(self, kwargs: dict) -> RequestParams: + """Initialize OpenAI-specific default parameters""" + chosen_model = kwargs.get("model", DEFAULT_DEEP_INFRA_MODEL) + + return RequestParams( + model=chosen_model, + systemPrompt=self.instruction, + parallel_tool_calls=True, + max_iterations=10, + use_history=True, + ) + + def _base_url(self) -> str: + return "https://api.deepinfra.com/v1/openai" + + + def _api_key(self): + from mcp_agent.llm.provider_key_manager import ProviderKeyManager + + assert self.provider + return ProviderKeyManager.get_api_key(self.provider.value, self.context.config) \ No newline at end of file