Skip to content

Commit 84403d5

Browse files
authored
Improve support for LLM usage (#2437)
* Drop support for experimental model parameter * Allow some logic adapters to identify as MCP compatable tools * Update examples * Add logic adapter classes for each supported LLM backend * Revise tool calling detection * Update docs * Note status * Check completed items * Update progress steps * Add SecurityException * Clean up code * Set default conversation ID * Update documentation * Update docstrings
1 parent f6d2510 commit 84403d5

20 files changed

Lines changed: 1611 additions & 219 deletions

chatterbot/chatterbot.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import uuid
23
from typing import Union
34
from chatterbot.storage import StorageAdapter
45
from chatterbot.logic import LogicAdapter
@@ -56,6 +57,14 @@ def __init__(self, name, stream=False, **kwargs):
5657

5758
self.stream = stream
5859

60+
# Generate a default conversation ID for this ChatBot instance.
61+
# This is used as a fallback when callers don't provide an explicit
62+
# conversation ID, ensuring that conversation history is tracked
63+
# within a session. Conversation IDs are necessary for cases such as
64+
# the LLM-based logic adapters which require it to retrieve previous
65+
# messages.
66+
self.default_conversation = uuid.uuid4().hex
67+
5968
self.logger = kwargs.get('logger', logging.getLogger(__name__))
6069

6170
storage_adapter = kwargs.get('storage_adapter', 'chatterbot.storage.SQLStorageAdapter')
@@ -147,11 +156,6 @@ def __init__(self, name, stream=False, **kwargs):
147156
# NOTE: 'xx' is the language code for a multi-language model
148157
self.nlp = spacy.blank(self.tagger.language.ISO_639_1)
149158

150-
self.model = None
151-
if model := kwargs.get('model'):
152-
import_path = model.pop('client')
153-
self.model = utils.initialize_class(import_path, self, **model)
154-
155159
# Allow the bot to save input it receives so that it can learn
156160
self.read_only = kwargs.get('read_only', False)
157161

@@ -199,6 +203,13 @@ def get_response(self, statement: Union[Statement, str, dict] = None, **kwargs)
199203

200204
input_statement.add_tags(*tags)
201205

206+
# If no conversation ID was provided, use the default session ID
207+
# so that conversation history is tracked across calls. Callers
208+
# can override this by passing an explicit conversation kwarg or
209+
# setting it on the Statement object.
210+
if not input_statement.conversation:
211+
input_statement.conversation = self.default_conversation
212+
202213
# Preprocess the input statement
203214
for preprocessor in self.preprocessors:
204215
input_statement = preprocessor(input_statement)
@@ -269,12 +280,6 @@ def generate_response(self, input_statement, additional_response_selection_param
269280
result = None
270281
max_confidence = -1
271282

272-
# If a model is provided, use it to process the input statement
273-
# instead of the logic adapters
274-
if self.model:
275-
model_response = self.model.process(input_statement)
276-
return model_response
277-
278283
for adapter in self.logic_adapters:
279284
if adapter.can_process(input_statement):
280285

@@ -360,8 +365,8 @@ def learn_response(self, statement, previous_statement=None):
360365
statement.in_response_to = previous_statement
361366

362367
self.logger.info('Adding "{}" as a response to "{}"'.format(
363-
previous_statement_text,
364-
statement.text
368+
statement.text,
369+
previous_statement_text
365370
))
366371

367372
if not statement.persona:

chatterbot/llm.py

Lines changed: 0 additions & 145 deletions
This file was deleted.

chatterbot/logic/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
from chatterbot.logic.specific_response import SpecificResponseAdapter
55
from chatterbot.logic.time_adapter import TimeLogicAdapter
66
from chatterbot.logic.unit_conversion import UnitConversion
7+
from chatterbot.logic.llm_adapters import (
8+
LLMLogicAdapter,
9+
OllamaLogicAdapter,
10+
OpenAILogicAdapter,
11+
)
712

813

914
__all__ = (
@@ -13,4 +18,7 @@
1318
'SpecificResponseAdapter',
1419
'TimeLogicAdapter',
1520
'UnitConversion',
21+
'LLMLogicAdapter',
22+
'OllamaLogicAdapter',
23+
'OpenAILogicAdapter',
1624
)

chatterbot/logic/best_match.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def process(self, input_statement: Statement, additional_response_selection_para
8989
}
9090

9191
alternate_response_selection_parameters = {
92-
'search_in_response_to': self.chatbot.tagger.get_text_index_string(
92+
'search_in_response_to': input_statement.search_text or self.chatbot.tagger.get_text_index_string(
9393
input_statement.text
9494
),
9595
'persona_not_startswith': 'bot:',

0 commit comments

Comments
 (0)