SimplerLLM 0.1.9__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.9 → SimplerLLM-0.2.0}/PKG-INFO +19 -19
- 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/openai_llm.py +199 -0
- {SimplerLLM-0.1.9 → 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.9 → SimplerLLM-0.2.0}/SimplerLLM.egg-info/PKG-INFO +19 -19
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM.egg-info/SOURCES.txt +1 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM.egg-info/requires.txt +1 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/setup.py +1 -1
- SimplerLLM-0.1.9/SimplerLLM/language/llm.py +0 -336
- SimplerLLM-0.1.9/SimplerLLM/language/llm_providers/anthropic_llm.py +0 -324
- SimplerLLM-0.1.9/SimplerLLM/language/llm_providers/gemini_llm.py +0 -369
- SimplerLLM-0.1.9/SimplerLLM/language/llm_providers/openai_llm.py +0 -198
- SimplerLLM-0.1.9/SimplerLLM/tools/text_chunker.py +0 -106
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/__init__.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/image/__init__.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/image/img_helper_funcs.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/image/stability_ai.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/language/__init__.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/language/llm_addons.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/language/llm_providers/__init__.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/language/llm_providers/llm_response_models.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/prompts/__init__.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/prompts/prompt_builder.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/tools/__init__.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/tools/file_loader.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/tools/generic_loader.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/tools/rapid_api.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM/tools/serp.py +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM.egg-info/dependency_links.txt +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/SimplerLLM.egg-info/top_level.txt +0 -0
- {SimplerLLM-0.1.9 → SimplerLLM-0.2.0}/my_tests/__init__.py +0 -0
- {SimplerLLM-0.1.9 → 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,16 +65,13 @@ 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")
|
|
@@ -83,14 +79,14 @@ llm_instance = LLM.create(provider=LLMProvider.OPENAI)
|
|
|
83
79
|
# For Anthropic Claude
|
|
84
80
|
#llm_instance = LLM.create(LLMProvider.ANTHROPIC, model_name="claude-3-opus-20240229")
|
|
85
81
|
|
|
86
|
-
|
|
87
|
-
response = llm_instance.generate_text(user_prompt="generate a 5 words sentence")
|
|
82
|
+
response = llm_instance.generate_response(prompt="generate a 5 words sentence")
|
|
88
83
|
|
|
89
84
|
```
|
|
90
85
|
|
|
91
86
|
### Using Tools
|
|
92
87
|
|
|
93
88
|
#### SERP
|
|
89
|
+
|
|
94
90
|
```python
|
|
95
91
|
from SimplerLLM.tools.serp import search_with_serper_api
|
|
96
92
|
|
|
@@ -101,6 +97,7 @@ search_results = search_with_serper_api("your search query", num_results=3)
|
|
|
101
97
|
```
|
|
102
98
|
|
|
103
99
|
#### Generic Text Loader
|
|
100
|
+
|
|
104
101
|
```python
|
|
105
102
|
from SimplerLLM.tools.generic_loader import load_content
|
|
106
103
|
|
|
@@ -111,6 +108,7 @@ print(text_file.content)
|
|
|
111
108
|
```
|
|
112
109
|
|
|
113
110
|
#### Calling any RapidAPI API
|
|
111
|
+
|
|
114
112
|
```python
|
|
115
113
|
from SimplerLLM.tools.rapid_api import RapidAPIClient
|
|
116
114
|
|
|
@@ -125,7 +123,6 @@ response = api_client.call_api(api_url, method='GET', params=api_params)
|
|
|
125
123
|
|
|
126
124
|
```
|
|
127
125
|
|
|
128
|
-
|
|
129
126
|
#### Prompt Template Builder
|
|
130
127
|
|
|
131
128
|
```python
|
|
@@ -147,7 +144,7 @@ multi_value_prompt_template = """Hello {name}, your next meeting is on {date}.
|
|
|
147
144
|
params_list = [
|
|
148
145
|
{"name": "Alice", "date": "January 10th", "object" : "dog"},
|
|
149
146
|
{"name": "Bob", "date": "January 12th", "object" : "bag"},
|
|
150
|
-
{"name": "Charlie", "date": "January 15th", "object" : "pen"}
|
|
147
|
+
{"name": "Charlie", "date": "January 15th", "object" : "pen"}
|
|
151
148
|
]
|
|
152
149
|
|
|
153
150
|
|
|
@@ -158,17 +155,20 @@ print(generated_prompts[0])
|
|
|
158
155
|
|
|
159
156
|
```
|
|
160
157
|
|
|
161
|
-
|
|
162
158
|
## Chunking Functions
|
|
159
|
+
|
|
163
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.
|
|
164
161
|
|
|
165
162
|
### chunk_by_max_chunk_size
|
|
163
|
+
|
|
166
164
|
This function splits text into chunks with a maximum size, optionally preserving sentence structure.
|
|
167
165
|
|
|
168
166
|
### chunk_by_sentences
|
|
167
|
+
|
|
169
168
|
This function splits the text into chunks based on sentences.
|
|
170
169
|
|
|
171
170
|
### chunk_by_paragraphs
|
|
171
|
+
|
|
172
172
|
This function splits text into chunks based on paragraphs.
|
|
173
173
|
|
|
174
174
|
Example
|
|
@@ -187,8 +187,8 @@ chunks = chunker.chunk_by_max_chunk_size(text, 100, True)
|
|
|
187
187
|
|
|
188
188
|
```
|
|
189
189
|
|
|
190
|
-
|
|
191
190
|
### Next Updates
|
|
191
|
+
|
|
192
192
|
- Adding More Tools
|
|
193
193
|
- Interacting With Local LLMs
|
|
194
194
|
- Prompt Optimization
|
|
@@ -196,4 +196,4 @@ chunks = chunker.chunk_by_max_chunk_size(text, 100, True)
|
|
|
196
196
|
- GPT Trainer
|
|
197
197
|
- Document Chunker
|
|
198
198
|
- Advanced Document Loader
|
|
199
|
-
- 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)
|