SimplerLLM 0.1.8__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/PKG-INFO +21 -22
- SimplerLLM-0.2.0/SimplerLLM/language/embeddings.py +251 -0
- SimplerLLM-0.2.0/SimplerLLM/language/llm.py +206 -0
- SimplerLLM-0.2.0/SimplerLLM/language/llm_providers/anthropic_llm.py +156 -0
- SimplerLLM-0.2.0/SimplerLLM/language/llm_providers/gemini_llm.py +214 -0
- SimplerLLM-0.2.0/SimplerLLM/language/llm_providers/llm_response_models.py +9 -0
- SimplerLLM-0.2.0/SimplerLLM/language/llm_providers/openai_llm.py +199 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/tools/json_helpers.py +44 -8
- SimplerLLM-0.2.0/SimplerLLM/tools/text_chunker.py +228 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM.egg-info/PKG-INFO +21 -22
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM.egg-info/SOURCES.txt +3 -1
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM.egg-info/requires.txt +1 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/setup.py +1 -1
- SimplerLLM-0.1.8/SimplerLLM/language/llm.py +0 -336
- SimplerLLM-0.1.8/SimplerLLM/language/llm_providers/claude_llm.py +0 -301
- SimplerLLM-0.1.8/SimplerLLM/language/llm_providers/gemini_llm.py +0 -338
- SimplerLLM-0.1.8/SimplerLLM/language/llm_providers/openai_llm.py +0 -165
- SimplerLLM-0.1.8/SimplerLLM/tools/text_chunker.py +0 -106
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/__init__.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/image/__init__.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/image/img_helper_funcs.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/image/stability_ai.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/language/__init__.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/language/llm_addons.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/language/llm_providers/__init__.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/prompts/__init__.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/prompts/prompt_builder.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/tools/__init__.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/tools/file_loader.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/tools/generic_loader.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/tools/rapid_api.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM/tools/serp.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM.egg-info/dependency_links.txt +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/SimplerLLM.egg-info/top_level.txt +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/my_tests/__init__.py +0 -0
- {SimplerLLM-0.1.8 → SimplerLLM-0.2.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: SimplerLLM
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: An easy-to-use Library for interacting with language models.
|
|
5
5
|
Home-page: https://github.com/hassancs91/SimplerLLM
|
|
6
6
|
Author: Hasan Aboul Hasan
|
|
@@ -19,25 +19,24 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
19
19
|
Requires-Python: >=3.6
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
|
|
22
|
-
|
|
23
22
|
# ⚪ SimplerLLM (Beta)
|
|
24
23
|
|
|
25
24
|
⚡ Your Easy Pass to Advanced AI ⚡
|
|
26
25
|
|
|
27
26
|
[](https://opensource.org/licenses/MIT)
|
|
28
27
|
|
|
29
|
-
|
|
30
28
|
## 🤔 What is SimplerLLM?
|
|
31
29
|
|
|
32
30
|
SimplerLLM is an open-source Python library designed to simplify interactions with Large Language Models (LLMs) for researchers and beginners. It offers a unified interface for different LLM providers and a suite of tools to enhance language model capabilities and make it Super easy for anyone to develop AI-powered tools and apps.
|
|
33
31
|
|
|
34
32
|
## Easy Installation
|
|
33
|
+
|
|
35
34
|
With pip:
|
|
35
|
+
|
|
36
36
|
```bash
|
|
37
37
|
pip install simplerllm
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
|
|
41
40
|
## Features
|
|
42
41
|
|
|
43
42
|
- **Unified LLM Interface**: Define an LLM instance in one line for providers like OpenAI and Google Gemini. Future versions will support more APIs and LLM providers.
|
|
@@ -45,17 +44,17 @@ pip install simplerllm
|
|
|
45
44
|
- **RapidAPI Connector**: Connect with AI services on RapidAPI.
|
|
46
45
|
- **SERP Integration**: Perform searches using DuckDuckGo, with more search engines coming soon.
|
|
47
46
|
- **Prompt Template Builder**: Easily create and manage prompt templates.
|
|
48
|
-
And Much More Coming Soon!
|
|
49
|
-
|
|
47
|
+
And Much More Coming Soon!
|
|
50
48
|
|
|
51
49
|
### Setting Up Environment Variables
|
|
52
|
-
|
|
50
|
+
|
|
51
|
+
To use this library, you need to set several API keys in your environment. Start by creating a .env file in the root directory of your project and adding your API keys there.
|
|
53
52
|
|
|
54
53
|
🔴 This file should be kept private and not committed to version control to protect your keys.
|
|
55
54
|
|
|
56
55
|
Here is an example of what your .env file should look like:
|
|
57
56
|
|
|
58
|
-
```
|
|
57
|
+
```
|
|
59
58
|
OPENAI_API_KEY="your_openai_api_key_here"
|
|
60
59
|
GEMENI_API_KEY="your_gemeni_api_key_here"
|
|
61
60
|
CLAUDE_API_KEY="your_claude_api_key_here"
|
|
@@ -66,32 +65,28 @@ STABILITY_API_KEY="your_stability_api_key_here" #for image generation
|
|
|
66
65
|
|
|
67
66
|
```
|
|
68
67
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
68
|
### Creating an LLM Instance
|
|
73
69
|
|
|
74
70
|
```python
|
|
75
71
|
from SimplerLLM.language.llm import LLM, LLMProvider
|
|
76
72
|
|
|
77
73
|
# For OpenAI
|
|
78
|
-
llm_instance = LLM.create(provider=LLMProvider.OPENAI)
|
|
74
|
+
llm_instance = LLM.create(provider=LLMProvider.OPENAI, model_name="gpt-3.5-turbo")
|
|
79
75
|
|
|
80
76
|
# For Google Gemini
|
|
81
77
|
#llm_instance = LLM.create(provider=LLMProvider.GEMINI,model_name="gemini-pro")
|
|
82
78
|
|
|
83
|
-
# For Claude
|
|
84
|
-
#llm_instance = LLM.create(LLMProvider.
|
|
85
|
-
|
|
79
|
+
# For Anthropic Claude
|
|
80
|
+
#llm_instance = LLM.create(LLMProvider.ANTHROPIC, model_name="claude-3-opus-20240229")
|
|
86
81
|
|
|
87
|
-
|
|
88
|
-
response = llm_instance.generate_text(user_prompt="generate a 5 words sentence")
|
|
82
|
+
response = llm_instance.generate_response(prompt="generate a 5 words sentence")
|
|
89
83
|
|
|
90
84
|
```
|
|
91
85
|
|
|
92
86
|
### Using Tools
|
|
93
87
|
|
|
94
88
|
#### SERP
|
|
89
|
+
|
|
95
90
|
```python
|
|
96
91
|
from SimplerLLM.tools.serp import search_with_serper_api
|
|
97
92
|
|
|
@@ -102,6 +97,7 @@ search_results = search_with_serper_api("your search query", num_results=3)
|
|
|
102
97
|
```
|
|
103
98
|
|
|
104
99
|
#### Generic Text Loader
|
|
100
|
+
|
|
105
101
|
```python
|
|
106
102
|
from SimplerLLM.tools.generic_loader import load_content
|
|
107
103
|
|
|
@@ -112,6 +108,7 @@ print(text_file.content)
|
|
|
112
108
|
```
|
|
113
109
|
|
|
114
110
|
#### Calling any RapidAPI API
|
|
111
|
+
|
|
115
112
|
```python
|
|
116
113
|
from SimplerLLM.tools.rapid_api import RapidAPIClient
|
|
117
114
|
|
|
@@ -126,7 +123,6 @@ response = api_client.call_api(api_url, method='GET', params=api_params)
|
|
|
126
123
|
|
|
127
124
|
```
|
|
128
125
|
|
|
129
|
-
|
|
130
126
|
#### Prompt Template Builder
|
|
131
127
|
|
|
132
128
|
```python
|
|
@@ -148,7 +144,7 @@ multi_value_prompt_template = """Hello {name}, your next meeting is on {date}.
|
|
|
148
144
|
params_list = [
|
|
149
145
|
{"name": "Alice", "date": "January 10th", "object" : "dog"},
|
|
150
146
|
{"name": "Bob", "date": "January 12th", "object" : "bag"},
|
|
151
|
-
{"name": "Charlie", "date": "January 15th", "object" : "pen"}
|
|
147
|
+
{"name": "Charlie", "date": "January 15th", "object" : "pen"}
|
|
152
148
|
]
|
|
153
149
|
|
|
154
150
|
|
|
@@ -159,17 +155,20 @@ print(generated_prompts[0])
|
|
|
159
155
|
|
|
160
156
|
```
|
|
161
157
|
|
|
162
|
-
|
|
163
158
|
## Chunking Functions
|
|
159
|
+
|
|
164
160
|
We have introduced new functions to help you split texts into manageable chunks based on different criteria. These functions are part of the chunker tool.
|
|
165
161
|
|
|
166
162
|
### chunk_by_max_chunk_size
|
|
163
|
+
|
|
167
164
|
This function splits text into chunks with a maximum size, optionally preserving sentence structure.
|
|
168
165
|
|
|
169
166
|
### chunk_by_sentences
|
|
167
|
+
|
|
170
168
|
This function splits the text into chunks based on sentences.
|
|
171
169
|
|
|
172
170
|
### chunk_by_paragraphs
|
|
171
|
+
|
|
173
172
|
This function splits text into chunks based on paragraphs.
|
|
174
173
|
|
|
175
174
|
Example
|
|
@@ -188,8 +187,8 @@ chunks = chunker.chunk_by_max_chunk_size(text, 100, True)
|
|
|
188
187
|
|
|
189
188
|
```
|
|
190
189
|
|
|
191
|
-
|
|
192
190
|
### Next Updates
|
|
191
|
+
|
|
193
192
|
- Adding More Tools
|
|
194
193
|
- Interacting With Local LLMs
|
|
195
194
|
- Prompt Optimization
|
|
@@ -197,4 +196,4 @@ chunks = chunker.chunk_by_max_chunk_size(text, 100, True)
|
|
|
197
196
|
- GPT Trainer
|
|
198
197
|
- Document Chunker
|
|
199
198
|
- Advanced Document Loader
|
|
200
|
-
- Integration With More Providers
|
|
199
|
+
- Integration With More Providers
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# import SimplerLLM.language.llm_providers.openai_llm as openai_llm
|
|
2
|
+
# import SimplerLLM.language.llm_providers.gemini_llm as gemini_llm
|
|
3
|
+
# import SimplerLLM.language.llm_providers.anthropic_llm as anthropic_llm
|
|
4
|
+
# from enum import Enum
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# class EmbeddingsProvider(Enum):
|
|
8
|
+
# OPENAI = 1
|
|
9
|
+
# GEMINI = 2
|
|
10
|
+
# ANTHROPIC = 3
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# class LLM:
|
|
14
|
+
# def __init__(
|
|
15
|
+
# self, provider=EmbeddingsProvider.OPENAI, model_name="text-embedding-3-small"
|
|
16
|
+
# ):
|
|
17
|
+
# self.provider = provider
|
|
18
|
+
# self.model_name = model_name
|
|
19
|
+
|
|
20
|
+
# @staticmethod
|
|
21
|
+
# def create(
|
|
22
|
+
# provider=None,
|
|
23
|
+
# model_name=None,
|
|
24
|
+
# ):
|
|
25
|
+
# if provider == EmbeddingsProvider.OPENAI:
|
|
26
|
+
# return OpenAILLM(provider, model_name)
|
|
27
|
+
# if provider == EmbeddingsProvider.GEMINI:
|
|
28
|
+
# return GeminiLLM(provider, model_name)
|
|
29
|
+
# if provider == EmbeddingsProvider.ANTHROPIC:
|
|
30
|
+
# return AnthropicLLM(provider, model_name)
|
|
31
|
+
# else:
|
|
32
|
+
# return None
|
|
33
|
+
|
|
34
|
+
# def set_model(self, provider):
|
|
35
|
+
# if not isinstance(provider, EmbeddingsProvider):
|
|
36
|
+
# raise ValueError("Provider must be an instance of EmbeddingsProvider Enum")
|
|
37
|
+
# self.provider = provider
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# class OpenAILLM(LLM):
|
|
41
|
+
# def __init__(self, model, model_name):
|
|
42
|
+
# super().__init__(model, model_name)
|
|
43
|
+
|
|
44
|
+
# def generate_embeddings(
|
|
45
|
+
# self,
|
|
46
|
+
# user_input,
|
|
47
|
+
# model_name=None,
|
|
48
|
+
# ):
|
|
49
|
+
# # Use instance values as defaults if not provided
|
|
50
|
+
# model_name = model_name if model_name is not None else self.model_name
|
|
51
|
+
# temperature = temperature if temperature is not None else self.temperature
|
|
52
|
+
# top_p = top_p if top_p is not None else self.top_p
|
|
53
|
+
|
|
54
|
+
# return openai_llm.generate_text(
|
|
55
|
+
# user_input=user_input,
|
|
56
|
+
# model_name=model_name,
|
|
57
|
+
# )
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# class GeminiLLM(LLM):
|
|
61
|
+
# def __init__(self, model, model_name, temperature, top_p):
|
|
62
|
+
# super().__init__(model, model_name, temperature, top_p)
|
|
63
|
+
|
|
64
|
+
# def generate_text(
|
|
65
|
+
# self,
|
|
66
|
+
# user_prompt,
|
|
67
|
+
# system_prompt=None,
|
|
68
|
+
# model_name=None,
|
|
69
|
+
# temperature=None,
|
|
70
|
+
# top_p=None,
|
|
71
|
+
# max_tokens=2024,
|
|
72
|
+
# ):
|
|
73
|
+
# # Use instance values as defaults if not provided
|
|
74
|
+
# model_name = model_name if model_name is not None else self.model_name
|
|
75
|
+
# temperature = temperature if temperature is not None else self.temperature
|
|
76
|
+
# top_p = top_p if top_p is not None else self.top_p
|
|
77
|
+
|
|
78
|
+
# return gemini_llm.generate_text(
|
|
79
|
+
# user_prompt=user_prompt,
|
|
80
|
+
# system_prompt=system_prompt,
|
|
81
|
+
# model_name=model_name,
|
|
82
|
+
# temperature=temperature,
|
|
83
|
+
# top_p=top_p,
|
|
84
|
+
# max_tokens=max_tokens,
|
|
85
|
+
# )
|
|
86
|
+
|
|
87
|
+
# def generate_full_response(
|
|
88
|
+
# self,
|
|
89
|
+
# user_prompt,
|
|
90
|
+
# system_prompt,
|
|
91
|
+
# model_name=None,
|
|
92
|
+
# temperature=None,
|
|
93
|
+
# top_p=None,
|
|
94
|
+
# max_tokens=2024,
|
|
95
|
+
# ):
|
|
96
|
+
# # Use instance values as defaults if not provided
|
|
97
|
+
# model_name = model_name if model_name is not None else self.model_name
|
|
98
|
+
# temperature = temperature if temperature is not None else self.temperature
|
|
99
|
+
# top_p = top_p if top_p is not None else self.top_p
|
|
100
|
+
|
|
101
|
+
# return gemini_llm.generate_full_response(
|
|
102
|
+
# user_prompt=user_prompt,
|
|
103
|
+
# system_prompt=system_prompt,
|
|
104
|
+
# model_name=model_name,
|
|
105
|
+
# temperature=temperature,
|
|
106
|
+
# top_p=top_p,
|
|
107
|
+
# max_tokens=max_tokens,
|
|
108
|
+
# )
|
|
109
|
+
|
|
110
|
+
# async def generate_text_async(
|
|
111
|
+
# self,
|
|
112
|
+
# user_prompt,
|
|
113
|
+
# system_prompt=None,
|
|
114
|
+
# model_name=None,
|
|
115
|
+
# temperature=None,
|
|
116
|
+
# top_p=None,
|
|
117
|
+
# max_tokens=2024,
|
|
118
|
+
# ):
|
|
119
|
+
# # Use instance values as defaults if not provided
|
|
120
|
+
# model_name = model_name if model_name is not None else self.model_name
|
|
121
|
+
# temperature = temperature if temperature is not None else self.temperature
|
|
122
|
+
# top_p = top_p if top_p is not None else self.top_p
|
|
123
|
+
|
|
124
|
+
# return await gemini_llm.generate_text_async(
|
|
125
|
+
# user_prompt=user_prompt,
|
|
126
|
+
# system_prompt=system_prompt,
|
|
127
|
+
# model_name=model_name,
|
|
128
|
+
# temperature=temperature,
|
|
129
|
+
# top_p=top_p,
|
|
130
|
+
# max_tokens=max_tokens,
|
|
131
|
+
# )
|
|
132
|
+
|
|
133
|
+
# async def generate_full_response_async(
|
|
134
|
+
# self,
|
|
135
|
+
# user_prompt,
|
|
136
|
+
# system_prompt,
|
|
137
|
+
# model_name=None,
|
|
138
|
+
# temperature=None,
|
|
139
|
+
# top_p=None,
|
|
140
|
+
# max_tokens=2024,
|
|
141
|
+
# ):
|
|
142
|
+
# # Use instance values as defaults if not provided
|
|
143
|
+
# model_name = model_name if model_name is not None else self.model_name
|
|
144
|
+
# temperature = temperature if temperature is not None else self.temperature
|
|
145
|
+
# top_p = top_p if top_p is not None else self.top_p
|
|
146
|
+
|
|
147
|
+
# return await gemini_llm.generate_full_response_async(
|
|
148
|
+
# user_prompt=user_prompt,
|
|
149
|
+
# system_prompt=system_prompt,
|
|
150
|
+
# model_name=model_name,
|
|
151
|
+
# temperature=temperature,
|
|
152
|
+
# top_p=top_p,
|
|
153
|
+
# max_tokens=max_tokens,
|
|
154
|
+
# )
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
# class AnthropicLLM(LLM):
|
|
158
|
+
# def __init__(self, model, model_name, temperature, top_p):
|
|
159
|
+
# super().__init__(model, model_name, temperature, top_p)
|
|
160
|
+
|
|
161
|
+
# def generate_text(
|
|
162
|
+
# self,
|
|
163
|
+
# user_prompt,
|
|
164
|
+
# system_prompt=None,
|
|
165
|
+
# model_name=None,
|
|
166
|
+
# temperature=None,
|
|
167
|
+
# top_p=None,
|
|
168
|
+
# max_tokens=2024,
|
|
169
|
+
# ):
|
|
170
|
+
# # Use instance values as defaults if not provided
|
|
171
|
+
# model_name = model_name if model_name is not None else self.model_name
|
|
172
|
+
# temperature = temperature if temperature is not None else self.temperature
|
|
173
|
+
# top_p = top_p if top_p is not None else self.top_p
|
|
174
|
+
|
|
175
|
+
# return anthropic_llm.generate_text(
|
|
176
|
+
# user_prompt=user_prompt,
|
|
177
|
+
# system_prompt=system_prompt,
|
|
178
|
+
# model_name=model_name,
|
|
179
|
+
# temperature=temperature,
|
|
180
|
+
# top_p=top_p,
|
|
181
|
+
# max_tokens=max_tokens,
|
|
182
|
+
# )
|
|
183
|
+
|
|
184
|
+
# def generate_full_response(
|
|
185
|
+
# self,
|
|
186
|
+
# user_prompt,
|
|
187
|
+
# system_prompt,
|
|
188
|
+
# model_name=None,
|
|
189
|
+
# temperature=None,
|
|
190
|
+
# top_p=None,
|
|
191
|
+
# max_tokens=2024,
|
|
192
|
+
# ):
|
|
193
|
+
# # Use instance values as defaults if not provided
|
|
194
|
+
# model_name = model_name if model_name is not None else self.model_name
|
|
195
|
+
# temperature = temperature if temperature is not None else self.temperature
|
|
196
|
+
# top_p = top_p if top_p is not None else self.top_p
|
|
197
|
+
|
|
198
|
+
# return anthropic_llm.generate_full_response(
|
|
199
|
+
# user_prompt=user_prompt,
|
|
200
|
+
# system_prompt=system_prompt,
|
|
201
|
+
# model_name=model_name,
|
|
202
|
+
# temperature=temperature,
|
|
203
|
+
# top_p=top_p,
|
|
204
|
+
# max_tokens=max_tokens,
|
|
205
|
+
# )
|
|
206
|
+
|
|
207
|
+
# async def generate_text_async(
|
|
208
|
+
# self,
|
|
209
|
+
# user_prompt,
|
|
210
|
+
# system_prompt=None,
|
|
211
|
+
# model_name=None,
|
|
212
|
+
# temperature=None,
|
|
213
|
+
# top_p=None,
|
|
214
|
+
# max_tokens=2024,
|
|
215
|
+
# ):
|
|
216
|
+
# # Use instance values as defaults if not provided
|
|
217
|
+
# model_name = model_name if model_name is not None else self.model_name
|
|
218
|
+
# temperature = temperature if temperature is not None else self.temperature
|
|
219
|
+
# top_p = top_p if top_p is not None else self.top_p
|
|
220
|
+
|
|
221
|
+
# return await anthropic_llm.generate_text_async(
|
|
222
|
+
# user_prompt=user_prompt,
|
|
223
|
+
# system_prompt=system_prompt,
|
|
224
|
+
# model_name=model_name,
|
|
225
|
+
# temperature=temperature,
|
|
226
|
+
# top_p=top_p,
|
|
227
|
+
# max_tokens=max_tokens,
|
|
228
|
+
# )
|
|
229
|
+
|
|
230
|
+
# async def generate_full_response_async(
|
|
231
|
+
# self,
|
|
232
|
+
# user_prompt,
|
|
233
|
+
# system_prompt,
|
|
234
|
+
# model_name=None,
|
|
235
|
+
# temperature=None,
|
|
236
|
+
# top_p=None,
|
|
237
|
+
# max_tokens=2024,
|
|
238
|
+
# ):
|
|
239
|
+
# # Use instance values as defaults if not provided
|
|
240
|
+
# model_name = model_name if model_name is not None else self.model_name
|
|
241
|
+
# temperature = temperature if temperature is not None else self.temperature
|
|
242
|
+
# top_p = top_p if top_p is not None else self.top_p
|
|
243
|
+
|
|
244
|
+
# return await anthropic_llm.generate_full_response_async(
|
|
245
|
+
# user_prompt=user_prompt,
|
|
246
|
+
# system_prompt=system_prompt,
|
|
247
|
+
# model_name=model_name,
|
|
248
|
+
# temperature=temperature,
|
|
249
|
+
# top_p=top_p,
|
|
250
|
+
# max_tokens=max_tokens,
|
|
251
|
+
# )
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import SimplerLLM.language.llm_providers.openai_llm as openai_llm
|
|
2
|
+
import SimplerLLM.language.llm_providers.gemini_llm as gemini_llm
|
|
3
|
+
import SimplerLLM.language.llm_providers.anthropic_llm as anthropic_llm
|
|
4
|
+
from enum import Enum
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class LLMProvider(Enum):
|
|
8
|
+
OPENAI = 1
|
|
9
|
+
GEMINI = 2
|
|
10
|
+
ANTHROPIC = 3
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class LLM:
|
|
14
|
+
def __init__(
|
|
15
|
+
self,
|
|
16
|
+
provider=LLMProvider.OPENAI,
|
|
17
|
+
model_name="gpt-3.5-turbo",
|
|
18
|
+
temperature=0.7,
|
|
19
|
+
top_p=1.0,
|
|
20
|
+
):
|
|
21
|
+
self.provider = provider
|
|
22
|
+
self.model_name = model_name
|
|
23
|
+
self.temperature = temperature
|
|
24
|
+
self.top_p = top_p
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def create(
|
|
28
|
+
provider=None,
|
|
29
|
+
model_name=None,
|
|
30
|
+
temperature=0.7,
|
|
31
|
+
top_p=1.0,
|
|
32
|
+
):
|
|
33
|
+
if provider == LLMProvider.OPENAI:
|
|
34
|
+
return OpenAILLM(provider, model_name, temperature, top_p)
|
|
35
|
+
if provider == LLMProvider.GEMINI:
|
|
36
|
+
return GeminiLLM(provider, model_name, temperature, top_p)
|
|
37
|
+
if provider == LLMProvider.ANTHROPIC:
|
|
38
|
+
return AnthropicLLM(provider, model_name, temperature, top_p)
|
|
39
|
+
else:
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
def set_model(self, provider):
|
|
43
|
+
if not isinstance(provider, LLMProvider):
|
|
44
|
+
raise ValueError("Provider must be an instance of LLMProvider Enum")
|
|
45
|
+
self.provider = provider
|
|
46
|
+
|
|
47
|
+
def prepare_params(self, model_name, temperature, top_p):
|
|
48
|
+
# Use instance values as defaults if parameters are not provided
|
|
49
|
+
return {
|
|
50
|
+
"model_name": model_name if model_name else self.model_name,
|
|
51
|
+
"temperature": temperature if temperature else self.temperature,
|
|
52
|
+
"top_p": top_p if top_p else self.top_p,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class OpenAILLM(LLM):
|
|
57
|
+
def __init__(self, model, model_name, temperature, top_p):
|
|
58
|
+
super().__init__(model, model_name, temperature, top_p)
|
|
59
|
+
|
|
60
|
+
def generate_response(
|
|
61
|
+
self,
|
|
62
|
+
model_name=None,
|
|
63
|
+
prompt=None,
|
|
64
|
+
messages=None,
|
|
65
|
+
system_prompt="You are a helpful AI Assistant",
|
|
66
|
+
temperature=0.7,
|
|
67
|
+
max_tokens=300,
|
|
68
|
+
top_p=1.0,
|
|
69
|
+
full_response=False,
|
|
70
|
+
):
|
|
71
|
+
params = self.prepare_params(model_name, temperature, top_p)
|
|
72
|
+
params.update(
|
|
73
|
+
{
|
|
74
|
+
"prompt": prompt,
|
|
75
|
+
"messages": messages,
|
|
76
|
+
"system_prompt": system_prompt,
|
|
77
|
+
"max_tokens": max_tokens,
|
|
78
|
+
"full_response": full_response,
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
return openai_llm.generate_response(**params)
|
|
82
|
+
|
|
83
|
+
async def generate_response_async(
|
|
84
|
+
self,
|
|
85
|
+
model_name=None,
|
|
86
|
+
prompt=None,
|
|
87
|
+
messages=None,
|
|
88
|
+
system_prompt="You are a helpful AI Assistant",
|
|
89
|
+
temperature=0.7,
|
|
90
|
+
max_tokens=300,
|
|
91
|
+
top_p=1.0,
|
|
92
|
+
full_response=False,
|
|
93
|
+
):
|
|
94
|
+
params = self.prepare_params(model_name, temperature, top_p)
|
|
95
|
+
params.update(
|
|
96
|
+
{
|
|
97
|
+
"prompt": prompt,
|
|
98
|
+
"messages": messages,
|
|
99
|
+
"system_prompt": system_prompt,
|
|
100
|
+
"max_tokens": max_tokens,
|
|
101
|
+
"full_response": full_response,
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
return await openai_llm.generate_response_async(**params)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class GeminiLLM(LLM):
|
|
108
|
+
def __init__(self, model, model_name, temperature, top_p):
|
|
109
|
+
super().__init__(model, model_name, temperature, top_p)
|
|
110
|
+
|
|
111
|
+
def generate_response(
|
|
112
|
+
self,
|
|
113
|
+
model_name=None,
|
|
114
|
+
prompt=None,
|
|
115
|
+
messages=None,
|
|
116
|
+
system_prompt="You are a helpful AI Assistant",
|
|
117
|
+
temperature=0.7,
|
|
118
|
+
max_tokens=300,
|
|
119
|
+
top_p=1.0,
|
|
120
|
+
full_response=False,
|
|
121
|
+
):
|
|
122
|
+
params = self.prepare_params(model_name, temperature, top_p)
|
|
123
|
+
params.update(
|
|
124
|
+
{
|
|
125
|
+
"prompt": prompt,
|
|
126
|
+
"messages": messages,
|
|
127
|
+
"system_prompt": system_prompt,
|
|
128
|
+
"max_tokens": max_tokens,
|
|
129
|
+
"full_response": full_response,
|
|
130
|
+
}
|
|
131
|
+
)
|
|
132
|
+
return gemini_llm.generate_response(**params)
|
|
133
|
+
|
|
134
|
+
async def generate_response_async(
|
|
135
|
+
self,
|
|
136
|
+
model_name=None,
|
|
137
|
+
prompt=None,
|
|
138
|
+
messages=None,
|
|
139
|
+
system_prompt="You are a helpful AI Assistant",
|
|
140
|
+
temperature=0.7,
|
|
141
|
+
max_tokens=300,
|
|
142
|
+
top_p=1.0,
|
|
143
|
+
full_response=False,
|
|
144
|
+
):
|
|
145
|
+
params = self.prepare_params(model_name, temperature, top_p)
|
|
146
|
+
params.update(
|
|
147
|
+
{
|
|
148
|
+
"prompt": prompt,
|
|
149
|
+
"messages": messages,
|
|
150
|
+
"system_prompt": system_prompt,
|
|
151
|
+
"max_tokens": max_tokens,
|
|
152
|
+
"full_response": full_response,
|
|
153
|
+
}
|
|
154
|
+
)
|
|
155
|
+
return await gemini_llm.generate_response_async(**params)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class AnthropicLLM(LLM):
|
|
159
|
+
def __init__(self, model, model_name, temperature, top_p):
|
|
160
|
+
super().__init__(model, model_name, temperature, top_p)
|
|
161
|
+
|
|
162
|
+
def generate_response(
|
|
163
|
+
self,
|
|
164
|
+
model_name=None,
|
|
165
|
+
prompt=None,
|
|
166
|
+
messages=None,
|
|
167
|
+
system_prompt="You are a helpful AI Assistant",
|
|
168
|
+
temperature=0.7,
|
|
169
|
+
max_tokens=300,
|
|
170
|
+
top_p=1.0,
|
|
171
|
+
full_response=False,
|
|
172
|
+
):
|
|
173
|
+
params = self.prepare_params(model_name, temperature, top_p)
|
|
174
|
+
params.update(
|
|
175
|
+
{
|
|
176
|
+
"prompt": prompt,
|
|
177
|
+
"messages": messages,
|
|
178
|
+
"system_prompt": system_prompt,
|
|
179
|
+
"max_tokens": max_tokens,
|
|
180
|
+
"full_response": full_response,
|
|
181
|
+
}
|
|
182
|
+
)
|
|
183
|
+
return anthropic_llm.generate_response(**params)
|
|
184
|
+
|
|
185
|
+
async def generate_response_async(
|
|
186
|
+
self,
|
|
187
|
+
model_name=None,
|
|
188
|
+
prompt=None,
|
|
189
|
+
messages=None,
|
|
190
|
+
system_prompt="You are a helpful AI Assistant",
|
|
191
|
+
temperature=0.7,
|
|
192
|
+
max_tokens=300,
|
|
193
|
+
top_p=1.0,
|
|
194
|
+
full_response=False,
|
|
195
|
+
):
|
|
196
|
+
params = self.prepare_params(model_name, temperature, top_p)
|
|
197
|
+
params.update(
|
|
198
|
+
{
|
|
199
|
+
"prompt": prompt,
|
|
200
|
+
"messages": messages,
|
|
201
|
+
"system_prompt": system_prompt,
|
|
202
|
+
"max_tokens": max_tokens,
|
|
203
|
+
"full_response": full_response,
|
|
204
|
+
}
|
|
205
|
+
)
|
|
206
|
+
return await anthropic_llm.generate_response_async(**params)
|