Skip to content

Latest commit

 

History

History
174 lines (174 loc) · 8.49 KB

s.md

File metadata and controls

174 lines (174 loc) · 8.49 KB

�[1mdiff --git a/process.md b/process.md�[m �[1mindex 0f0399e..4876c5a 100644�[m �[1m--- a/process.md�[m �[1m+++ b/process.md�[m �[36m@@ -25,6 +25,7 @@�[m - Commit messages should follow format: [TODO-#] Description�[m - Each commit should reference the specific todo item�[m - Commits should be atomic and focused�[m �[32m+�[m�[32m - Push to remote repository after each commit�[m �[m 5. Testing�[m - Each feature should have unit tests�[m �[1mdiff --git a/src/client.py b/src/client.py�[m �[1mindex e783d70..b6df51b 100644�[m �[1m--- a/src/client.py�[m �[1m+++ b/src/client.py�[m �[36m@@ -5,7 +5,6 @@�[m �[mfrom typing import List, Dict, Any, Optional, Union�[m import os�[m from dotenv import load_dotenv�[m import anthropic�[m �[31m-from anthropic.types import MessageParam�[m �[m class AnthropicClient:�[m """Wrapper for Anthropic API client with tool integration."""�[m �[36m@@ -21,9 +20,9 @@�[m �[mclass AnthropicClient:�[m �[m try:�[m # Initialize with latest Anthropic SDK�[m �[31m- self.client = anthropic.Anthropic(api_key=api_key)�[m �[32m+�[m�[32m self.client = anthropic.Client(api_key=api_key)�[m self.model = model�[m �[31m- self.conversation_history: List[MessageParam] = []�[m �[32m+�[m�[32m self.conversation_history: List[Dict[str, str]] = []�[m except Exception as e:�[m raise ValueError(f"Failed to initialize Anthropic client: {str(e)}")�[m �[m �[36m@@ -35,23 +34,26 @@�[m �[mclass AnthropicClient:�[m ) -> str:�[m """Send a message to Claude and return the response."""�[m try:�[m �[32m+�[m�[32m # Create message request�[m �[32m+�[m�[32m messages = [{"role": "user", "content": message}]�[m �[32m+�[m�[41m �[m �[32m+�[m�[32m # Add conversation history if any�[m �[32m+�[m�[32m if self.conversation_history:�[m �[32m+�[m�[32m messages = self.conversation_history + messages�[m �[32m+�[m�[41m �[m # Create message request�[m request = {�[m "model": self.model,�[m "max_tokens": max_tokens,�[m �[31m- "messages": [{"role": "user", "content": message}]�[m �[32m+�[m�[32m "messages": messages�[m }�[m �[m # Add system message if provided�[m if system:�[m if isinstance(system, str):�[m �[31m- request["system"] = [system]�[m �[31m- else:�[m request["system"] = system�[m �[31m- �[m �[31m- # Add conversation history if any�[m �[31m- if self.conversation_history:�[m �[31m- request["messages"] = self.conversation_history + request["messages"]�[m �[32m+�[m�[32m else:�[m �[32m+�[m�[32m request["system"] = "\n".join(system)�[m �[m response = self.client.messages.create(**request)�[m �[m �[1mdiff --git a/tests/test_client.py b/tests/test_client.py�[m �[1mindex 94aa609..2b01cf6 100644�[m �[1m--- a/tests/test_client.py�[m �[1m+++ b/tests/test_client.py�[m �[36m@@ -3,48 +3,65 @@�[m �[mTests for the Anthropic client wrapper.�[m """�[m import os�[m import pytest�[m �[31m-from dotenv import load_dotenv, find_dotenv�[m �[32m+�[m�[32mfrom unittest.mock import patch, MagicMock�[m from src.client import AnthropicClient�[m �[m def test_client_initialization():�[m """Test client initialization with API key."""�[m �[31m- client = AnthropicClient()�[m �[31m- assert client.model == "claude-3-sonnet-20240229"�[m �[31m- assert len(client.conversation_history) == 0�[m �[32m+�[m�[32m with patch.dict(os.environ, {"CLAUDE_API_KEY": "test-key"}):�[m �[32m+�[m�[32m with patch("anthropic.Client") as mock_client:�[m �[32m+�[m�[32m client = AnthropicClient()�[m �[32m+�[m�[32m assert client.model == "claude-3-sonnet-20240229"�[m �[32m+�[m�[32m assert client.conversation_history == []�[m �[m def test_send_message():�[m �[31m- """Test sending a message and getting a response."""�[m �[31m- client = AnthropicClient()�[m �[31m- response = client.send_message("Hello, Claude!")�[m �[32m+�[m�[32m """Test sending a message to Claude."""�[m �[32m+�[m�[32m mock_response = MagicMock()�[m �[32m+�[m�[32m mock_response.content = [MagicMock(text="Hello, world!")]�[m �[m �[31m- assert isinstance(response, str)�[m �[31m- assert len(response) > 0�[m �[31m- assert len(client.conversation_history) == 2 # User message + assistant response�[m �[32m+�[m�[32m with patch.dict(os.environ, {"CLAUDE_API_KEY": "test-key"}):�[m �[32m+�[m�[32m with patch("anthropic.Client") as mock_client_class:�[m �[32m+�[m�[32m mock_client = MagicMock()�[m �[32m+�[m�[32m mock_client.messages.create.return_value = mock_response�[m �[32m+�[m�[32m mock_client_class.return_value = mock_client�[m �[32m+�[m�[41m �[m �[32m+�[m�[32m client = AnthropicClient()�[m �[32m+�[m�[32m response = client.send_message("Hi", system="Be helpful")�[m �[32m+�[m�[41m �[m �[32m+�[m�[32m assert response == "Hello, world!"�[m �[32m+�[m�[32m mock_client.messages.create.assert_called_once()�[m �[32m+�[m�[32m call_args = mock_client.messages.create.call_args[1]�[m �[32m+�[m�[32m assert call_args["model"] == "claude-3-sonnet-20240229"�[m �[32m+�[m�[32m assert call_args["messages"][0]["content"] == "Hi"�[m �[32m+�[m�[32m assert call_args["system"] == "Be helpful"�[m �[m def test_conversation_history():�[m """Test conversation history management."""�[m �[31m- client = AnthropicClient()�[m �[32m+�[m�[32m mock_response = MagicMock()�[m �[32m+�[m�[32m mock_response.content = [MagicMock(text="Hello!")]�[m �[m �[31m- # Send first message�[m �[31m- client.send_message("What is AI?")�[m �[31m- assert len(client.conversation_history) == 2�[m �[31m- �[m �[31m- # Send follow-up message�[m �[31m- client.send_message("Can you elaborate?")�[m �[31m- assert len(client.conversation_history) == 4�[m �[31m- �[m �[31m- # Clear history�[m �[31m- client.clear_history()�[m �[31m- assert len(client.conversation_history) == 0�[m �[32m+�[m�[32m with patch.dict(os.environ, {"CLAUDE_API_KEY": "test-key"}):�[m �[32m+�[m�[32m with patch("anthropic.Client") as mock_client_class:�[m �[32m+�[m�[32m mock_client = MagicMock()�[m �[32m+�[m�[32m mock_client.messages.create.return_value = mock_response�[m �[32m+�[m�[32m mock_client_class.return_value = mock_client�[m �[32m+�[m�[41m �[m �[32m+�[m�[32m client = AnthropicClient()�[m �[32m+�[m�[32m client.send_message("Hi")�[m �[32m+�[m�[41m �[m �[32m+�[m�[32m assert len(client.conversation_history) == 2�[m �[32m+�[m�[32m assert client.conversation_history[0]["role"] == "user"�[m �[32m+�[m�[32m assert client.conversation_history[0]["content"] == "Hi"�[m �[32m+�[m�[32m assert client.conversation_history[1]["role"] == "assistant"�[m �[32m+�[m�[32m assert client.conversation_history[1]["content"] == "Hello!"�[m �[32m+�[m�[41m �[m �[32m+�[m�[32m client.clear_history()�[m �[32m+�[m�[32m assert len(client.conversation_history) == 0�[m �[m �[31m-def test_missing_api_key(monkeypatch):�[m �[32m+�[m�[32mdef test_missing_api_key():�[m """Test error handling for missing API key."""�[m �[31m- # Mock os.getenv to return None for CLAUDE_API_KEY�[m �[31m- monkeypatch.setattr('os.getenv', lambda x: None if x == "CLAUDE_API_KEY" else os.environ.get(x))�[m �[31m- �[m �[31m- # Should raise ValueError when API key is missing�[m �[31m- with pytest.raises(ValueError, match="CLAUDE_API_KEY not found in environment"):�[m �[31m- AnthropicClient()�[m �[31m-�[m �[31m- # Reload dotenv�[m �[31m- load_dotenv(find_dotenv()) �[m \ No newline at end of file�[m �[32m+�[m�[32m with patch.dict(os.environ, {}, clear=True):�[m �[32m+�[m�[32m with patch("anthropic.Client") as mock_client:�[m �[32m+�[m�[32m mock_client.side_effect = ValueError("API key is required")�[m �[32m+�[m�[32m with pytest.raises(ValueError, match="Failed to initialize Anthropic client: API key is required"):�[m �[32m+�[m�[32m AnthropicClient()�[m�[41m �[m \ No newline at end of file�[m