30 Commits

Author SHA1 Message Date
kennethreitz 7c8f22bef1 Update version to v0.1.6 and add sm.Plugin syntax sugar 2024-10-31 16:35:24 -04:00
kennethreitz 9c3f2a6df3 Refactor Anthropic provider and add tests for structured response and llm_model in structured_response 2024-10-31 16:33:44 -04:00
kennethreitz febf5473d5 Refactor message parameter in Anthropic provider 2024-10-31 16:33:01 -04:00
kennethreitz 48ac97f070 Refactor messages parameter in Anthropic provider 2024-10-31 16:29:58 -04:00
kennethreitz c41a3f00fb Add test for generating text with different providers 2024-10-31 16:22:05 -04:00
kennethreitz 25ee4ae32c Add test for basic math 2024-10-31 16:21:59 -04:00
kennethreitz 984721f02b Add conftest.py with fixture for simplemind Session 2024-10-31 16:21:54 -04:00
kennethreitz 69c8723770 Refactor DEFAULT_LLM_MODEL parameter in Settings class 2024-10-31 16:21:43 -04:00
kennethreitz 0c10d5676a Refactor max_tokens parameter in Anthropic provider 2024-10-31 16:21:36 -04:00
kennethreitz e0ddf41e15 Refactor llm_model parameter in Session class 2024-10-31 16:21:31 -04:00
kennethreitz f940ae2dfd the irony is not lost 2024-10-31 16:08:18 -04:00
kennethreitz 85fa4f5879 Add Plugin syntax sugar and improve Anthropic provider for max tokens 2024-10-31 16:08:07 -04:00
kennethreitz 44581e8fe3 Merge pull request #23 from barisozmen/issue_15
Add default kwargs logic into Anthropic provider, which is superseded by user entered kwargs
2024-10-31 16:00:46 -04:00
Barış Özmen 9503ec7fd3 Remove duplicate max_tokens parameter 2024-10-31 22:58:13 +03:00
Barış Özmen 418f36dcc0 kwargs supersede default kwargs for Anthropic provider methods 2024-10-31 22:46:17 +03:00
kennethreitz bf9683cfd0 Refactor code to use syntax sugar for Plugin class 2024-10-31 15:38:58 -04:00
kennethreitz 3909588f3e chore: Update CHANGELOG to include support for Python 3.10 2024-10-31 14:54:51 -04:00
kennethreitz 33d8f18bff refactor: Update Gemini provider to handle conversation-based completions and add structured response 2024-10-31 13:54:33 -04:00
kennethreitz d7388ef0d5 Update README.md 2024-10-31 13:54:17 -04:00
kennethreitz 02d10bfda9 Update README.md 2024-10-31 13:53:24 -04:00
kennethreitz 5dc6e7b006 Update README.md 2024-10-31 13:53:11 -04:00
kennethreitz 62933c8553 Update README.md 2024-10-31 13:52:55 -04:00
kennethreitz f0a6be73f8 Update README.md 2024-10-31 13:52:34 -04:00
kennethreitz 9257a04f34 Update README.md 2024-10-31 13:43:35 -04:00
kennethreitz 64dbe9a2e7 Update README.md 2024-10-31 13:42:20 -04:00
kennethreitz ccb8311089 Update README.md 2024-10-31 13:42:07 -04:00
kennethreitz 0c29380501 Update README.md 2024-10-31 13:20:26 -04:00
kennethreitz 7b43208a03 Update README.md 2024-10-31 13:20:04 -04:00
kennethreitz e931fd0eae Update README.md 2024-10-31 13:19:22 -04:00
kennethreitz 736d942527 Update README.md 2024-10-31 13:18:35 -04:00
14 changed files with 117 additions and 18 deletions
+1
View File
@@ -167,3 +167,4 @@ cython_debug/
src/**
requirements.txt
Pipfile
+9
View File
@@ -1,10 +1,19 @@
Release History
===============
## 0.1.6 (2024-10-31)
- Add `sm.Plugin` syntax sugar.
- Improvements to Anthropic provider, related to max tokens.
- General improvements.
- Add tests for structured response.
- Add `llm_model` to `structured_response`.
## 0.1.5 (2024-10-31)
- Add Gemini provider.
- Add structured response to Gemini provider.
- Support for Python 3.10.
## 0.1.4 (2024-10-30)
+4 -5
View File
@@ -6,8 +6,6 @@ Simplemind is AI library designed to simplify your experience with AI APIs in Py
![simplemind](https://github.com/user-attachments/assets/36df2103-2583-4958-ad5e-19cda7740256)
[![Auto Wiki](https://img.shields.io/badge/Auto_Wiki-Mutable.ai-blue)](https://mutable.ai/kennethreitz/simplemind)
## Features
With Simplemind, tapping into AI is as easy as a friendly conversation.
@@ -18,7 +16,7 @@ With Simplemind, tapping into AI is as easy as a friendly conversation.
## Supported APIs
To specify a specific provider or model, you can use the `llm_provider` and `llm_model` parameters when calling: `generate_text`, `generate_data`, or `create_conversation`.
To specify a specific provider or model, you can use the `llm_provider` and `llm_model` parameters when calling: `generate_text`, `generate_data`, or `create_conversation`. The APIs remain identital between all supported providers/models.
- [**Anthropic's Claude**](https://www.anthropic.com/claude)
- [**Google's Gemini**](https://gemini.google/)
@@ -27,7 +25,7 @@ To specify a specific provider or model, you can use the `llm_provider` and `llm
- [**OpenAI's GPT**](https://openai.com/gpt)
- [**xAI's Grok**](https://x.ai/)
If you want to see Simplemind support, additional providers or models, please request a pull!
If you want to see Simplemind support, additional providers or models, please send a pull request!
## Why SimpleMind?
- **Intuitive**: Built with Pythonic simplicity and readability in mind.
@@ -50,7 +48,7 @@ First, authenticate your API keys by setting them in the environment variables:
$ export OPENAI_API_KEY="sk-..."
```
This pattern allows you to keep your API keys private and out of your codebase. Other supported environment variables: `ANTHROPIC_API_KEY`, `XAI_API_KEY`, and `GROQ_API_KEY`.
This pattern allows you to keep your API keys private and out of your codebase. Other supported environment variables: `ANTHROPIC_API_KEY`, `XAI_API_KEY`, `GROQ_API_KEY`, and `GEMINI_API_KEY`.
Next, import Simplemind and start using it:
@@ -219,3 +217,4 @@ Simplemind is licensed under the Apache 2.0 License.
## Acknowledgements
Simplemind is inspired by the philosophy of "code for humans" and aims to make working with AI models accessible to all. Special thanks to the open-source community for their contributions and inspiration.
+1 -1
View File
@@ -16,7 +16,7 @@ import simplemind
project = "simplemind"
copyright = "2024 Kenneth Reitz"
author = "Kenneth Reitz"
release = "v0.1.5"
release = "v0.1.6"
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "simplemind"
version = "0.1.5"
version = "0.1.6"
description = "An experimental client for AI providers that intends to replace LangChain and LangGraph for most common use cases."
readme = "README.md"
requires-python = ">=3.10"
+5 -1
View File
@@ -16,7 +16,7 @@ class Session:
self,
*,
llm_provider: str = settings.DEFAULT_LLM_PROVIDER,
llm_model: str = settings.DEFAULT_LLM_MODEL,
llm_model: str | None = None,
**kwargs,
):
self.llm_provider = llm_provider
@@ -113,6 +113,9 @@ def generate_text(
return provider.generate_text(prompt=prompt, llm_model=llm_model, **kwargs)
# Syntax sugar.
Plugin = BasePlugin
__all__ = [
"create_conversation",
"find_provider",
@@ -121,4 +124,5 @@ __all__ = [
"settings",
"BasePlugin",
"Session",
"Plugin",
]
+20 -7
View File
@@ -13,12 +13,14 @@ T = TypeVar("T", bound=BaseModel)
PROVIDER_NAME = "anthropic"
DEFAULT_MODEL = "claude-3-5-sonnet-20241022"
DEFAULT_MAX_TOKENS = 1000
DEFAULT_MAX_TOKENS = 1_000
DEFAULT_KWARGS = {"max_tokens": DEFAULT_MAX_TOKENS}
class Anthropic(BaseProvider):
NAME = PROVIDER_NAME
DEFAULT_MODEL = DEFAULT_MODEL
DEFAULT_KWARGS = DEFAULT_KWARGS
def __init__(self, api_key: str | None = None):
self.api_key = api_key or settings.get_api_key(PROVIDER_NAME)
@@ -46,8 +48,7 @@ class Anthropic(BaseProvider):
response = self.client.messages.create(
model=conversation.llm_model or self.DEFAULT_MODEL,
messages=messages,
max_tokens=DEFAULT_MAX_TOKENS,
**kwargs,
**{**self.DEFAULT_KWARGS, **kwargs},
)
# Get the response content from the Anthropic response
@@ -62,9 +63,22 @@ class Anthropic(BaseProvider):
llm_provider=PROVIDER_NAME,
)
def structured_response(self, model: str, response_model: Type[T], **kwargs) -> T:
def structured_response(
self, response_model: Type[T], *, llm_model: str | None = None, **kwargs
) -> T:
model = llm_model or self.DEFAULT_MODEL
# Extract the prompt from kwargs if it exists
prompt = kwargs.pop("prompt", kwargs.pop("messages", ""))
# Format the messages properly
messages = [{"role": "user", "content": prompt}]
response = self.structured_client.messages.create(
model=model or self.DEFAULT_MODEL, response_model=response_model, **kwargs
model=model,
messages=messages, # Add the messages parameter
response_model=response_model,
**{**self.DEFAULT_KWARGS, **kwargs},
)
return response
@@ -76,8 +90,7 @@ class Anthropic(BaseProvider):
response = self.client.messages.create(
model=llm_model or self.DEFAULT_MODEL,
messages=messages,
max_tokens=DEFAULT_MAX_TOKENS,
**kwargs,
**{**self.DEFAULT_KWARGS, **kwargs},
)
return response.content[0].text
+1
View File
@@ -72,6 +72,7 @@ class Groq(BaseProvider):
response = self.structured_client.chat.completions.create(
messages=messages,
response_model=response_model,
model=kwargs.pop("llm_model", self.DEFAULT_MODEL),
**kwargs,
)
return response
+7 -2
View File
@@ -65,7 +65,12 @@ class Ollama(BaseProvider):
)
def structured_response(
self, prompt: str, response_model: Type[T], *, llm_model: str, **kwargs
self,
prompt: str,
response_model: Type[T],
*,
llm_model: str | None = None,
**kwargs,
) -> T:
"""Get a structured response from the Ollama API."""
messages = [
@@ -80,7 +85,7 @@ class Ollama(BaseProvider):
)
return response
def generate_text(self, prompt: str, *, llm_model: str) -> str:
def generate_text(self, prompt: str, *, llm_model: str | None = None) -> str:
"""Generate text using the Ollama API."""
messages = [
{"role": "user", "content": prompt},
-1
View File
@@ -29,7 +29,6 @@ class Settings(BaseSettings):
)
XAI_API_KEY: Optional[SecretStr] = Field(None, description="API key for xAI")
DEFAULT_LLM_PROVIDER: str = Field("openai", description="The default LLM provider")
DEFAULT_LLM_MODEL: str = Field("gpt-4o-mini", description="The default LLM model")
model_config = SettingsConfigDict(
env_file=".env", env_file_encoding="utf-8", case_sensitive=True, extra="ignore"
+15
View File
@@ -0,0 +1,15 @@
import pytest
import os
import sys
# Add the project root to the Python path.
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from simplemind import Session
@pytest.fixture
def sm():
"""Fixture that provides a simplemind Session instance with default settings."""
return Session()
+2
View File
@@ -0,0 +1,2 @@
def test_basic_math():
assert 1 + 1 == 2
+28
View File
@@ -0,0 +1,28 @@
import pytest
from simplemind.providers import Anthropic, Gemini, OpenAI, Groq, Ollama
from pydantic import BaseModel
class ResponseModel(BaseModel):
result: int
@pytest.mark.parametrize(
"provider_cls",
[
Anthropic,
Gemini,
OpenAI,
Groq,
Ollama,
],
)
def test_generate_data(provider_cls):
provider = provider_cls()
prompt = "What is 2+2?"
data = provider.structured_response(prompt=prompt, response_model=ResponseModel)
assert isinstance(data, ResponseModel)
assert type(data.result) == int
+23
View File
@@ -0,0 +1,23 @@
import pytest
from simplemind.providers import Anthropic, Gemini, OpenAI, Groq, Ollama
@pytest.mark.parametrize(
"provider_cls",
[
Anthropic,
Gemini,
OpenAI,
Groq,
Ollama,
],
)
def test_generate_text(provider_cls):
provider = provider_cls()
prompt = "What is 2+2?"
response = provider.generate_text(prompt=prompt, llm_model=provider.DEFAULT_MODEL)
assert isinstance(response, str)
assert len(response) > 0