diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..d7d3358ae --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# PR #1 Ali 11/18/2025 +## Features +- added groq provider +## Added Files +- CHANGELOG.md +## Fixes +changed the submit button from ctrl+j to enter diff --git a/codebase_rag/main.py b/codebase_rag/main.py index 0586a9f3c..debc8e756 100644 --- a/codebase_rag/main.py +++ b/codebase_rag/main.py @@ -490,15 +490,15 @@ def get_multiline_input(prompt_text: str = "Ask a question") -> str: """Get multiline input from user with Ctrl+J to submit.""" bindings = KeyBindings() - @bindings.add("c-j") + @bindings.add("enter") def submit(event: Any) -> None: """Submit the current input.""" event.app.exit(result=event.app.current_buffer.text) - @bindings.add("enter") - def new_line(event: Any) -> None: - """Insert a new line instead of submitting.""" - event.current_buffer.insert_text("\n") + # @bindings.add("enter") + # def new_line(event: Any) -> None: + # """Insert a new line instead of submitting.""" + # event.current_buffer.insert_text("\n") @bindings.add("c-c") def keyboard_interrupt(event: Any) -> None: diff --git a/codebase_rag/providers/base.py b/codebase_rag/providers/base.py index d525c1e27..d7b581512 100644 --- a/codebase_rag/providers/base.py +++ b/codebase_rag/providers/base.py @@ -11,6 +11,8 @@ from pydantic_ai.providers.google_gla import GoogleGLAProvider from pydantic_ai.providers.google_vertex import GoogleVertexProvider, VertexAiRegion from pydantic_ai.providers.openai import OpenAIProvider as PydanticOpenAIProvider +from pydantic_ai.models.groq import GroqModel +from pydantic_ai.providers.groq import GroqProvider as PydanticGroqProvider class ModelProvider(ABC): @@ -125,6 +127,26 @@ def create_model(self, model_id: str, **kwargs: Any) -> OpenAIResponsesModel: return OpenAIResponsesModel(model_id, provider=provider, **kwargs) +class GroqProvider(ModelProvider): + """Groq provider – uses Groq’s ultra‑fast inference API.""" + def __init__(self, api_key: str | None = None, **kwargs: Any) -> None: + super().__init__(**kwargs) + self.api_key = api_key + + @property + def provider_name(self) -> str: + return "groq" + + def validate_config(self) -> None: + if not self.api_key: + raise ValueError("Groq provider requires api_key.") + + def create_model(self, model_id: str, **kwargs: Any) -> GroqModel: + self.validate_config() + provider = PydanticGroqProvider(api_key=self.api_key) + return GroqModel(model_id, provider=provider, **kwargs) + + class OllamaProvider(ModelProvider): """Ollama local provider.""" @@ -163,6 +185,7 @@ def create_model(self, model_id: str, **kwargs: Any) -> OpenAIModel: PROVIDER_REGISTRY: dict[str, type[ModelProvider]] = { "google": GoogleProvider, "openai": OpenAIProvider, + "groq": GroqProvider, "ollama": OllamaProvider, } @@ -198,4 +221,4 @@ def check_ollama_running(endpoint: str = "http://localhost:11434") -> bool: response = client.get(health_url) return bool(response.status_code == 200) except (httpx.RequestError, httpx.TimeoutException): - return False + return False \ No newline at end of file