|
29 | 29 | except ImportError: |
30 | 30 | OPENAI_AVAILABLE = False |
31 | 31 |
|
| 32 | +try: |
| 33 | + import litellm |
| 34 | + LITELLM_AVAILABLE = True |
| 35 | +except ImportError: |
| 36 | + LITELLM_AVAILABLE = False |
| 37 | + |
32 | 38 |
|
33 | 39 |
|
34 | 40 |
|
@@ -340,14 +346,28 @@ def search_short_term( |
340 | 346 |
|
341 | 347 | elif self.use_rag and hasattr(self, "chroma_col"): |
342 | 348 | try: |
343 | | - from openai import OpenAI |
344 | | - client = OpenAI() |
345 | | - |
346 | | - response = client.embeddings.create( |
347 | | - input=query, |
348 | | - model="text-embedding-3-small" |
349 | | - ) |
350 | | - query_embedding = response.data[0].embedding |
| 349 | + if LITELLM_AVAILABLE: |
| 350 | + # Use LiteLLM for consistency with the rest of the codebase |
| 351 | + import litellm |
| 352 | + |
| 353 | + response = litellm.embedding( |
| 354 | + model="text-embedding-3-small", |
| 355 | + input=query |
| 356 | + ) |
| 357 | + query_embedding = response.data[0]["embedding"] |
| 358 | + elif OPENAI_AVAILABLE: |
| 359 | + # Fallback to OpenAI client |
| 360 | + from openai import OpenAI |
| 361 | + client = OpenAI() |
| 362 | + |
| 363 | + response = client.embeddings.create( |
| 364 | + input=query, |
| 365 | + model="text-embedding-3-small" |
| 366 | + ) |
| 367 | + query_embedding = response.data[0].embedding |
| 368 | + else: |
| 369 | + self._log_verbose("Neither litellm nor openai available for embeddings", logging.WARNING) |
| 370 | + return [] |
351 | 371 |
|
352 | 372 | resp = self.chroma_col.query( |
353 | 373 | query_embeddings=[query_embedding], |
@@ -464,19 +484,39 @@ def store_long_term( |
464 | 484 | # Store in vector database if enabled |
465 | 485 | if self.use_rag and hasattr(self, "chroma_col"): |
466 | 486 | try: |
467 | | - from openai import OpenAI |
468 | | - client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) # Ensure API key is correctly set |
469 | | - |
470 | | - logger.info("Getting embeddings from OpenAI...") |
471 | | - logger.debug(f"Embedding input text: {text}") # Log the input text |
472 | | - |
473 | | - response = client.embeddings.create( |
474 | | - input=text, |
475 | | - model="text-embedding-3-small" |
476 | | - ) |
477 | | - embedding = response.data[0].embedding |
478 | | - logger.info("Successfully got embeddings") |
479 | | - logger.debug(f"Received embedding of length: {len(embedding)}") # Log embedding details |
| 487 | + if LITELLM_AVAILABLE: |
| 488 | + # Use LiteLLM for consistency with the rest of the codebase |
| 489 | + import litellm |
| 490 | + |
| 491 | + logger.info("Getting embeddings from LiteLLM...") |
| 492 | + logger.debug(f"Embedding input text: {text}") |
| 493 | + |
| 494 | + response = litellm.embedding( |
| 495 | + model="text-embedding-3-small", |
| 496 | + input=text |
| 497 | + ) |
| 498 | + embedding = response.data[0]["embedding"] |
| 499 | + logger.info("Successfully got embeddings from LiteLLM") |
| 500 | + logger.debug(f"Received embedding of length: {len(embedding)}") |
| 501 | + |
| 502 | + elif OPENAI_AVAILABLE: |
| 503 | + # Fallback to OpenAI client |
| 504 | + from openai import OpenAI |
| 505 | + client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) |
| 506 | + |
| 507 | + logger.info("Getting embeddings from OpenAI...") |
| 508 | + logger.debug(f"Embedding input text: {text}") |
| 509 | + |
| 510 | + response = client.embeddings.create( |
| 511 | + input=text, |
| 512 | + model="text-embedding-3-small" |
| 513 | + ) |
| 514 | + embedding = response.data[0].embedding |
| 515 | + logger.info("Successfully got embeddings from OpenAI") |
| 516 | + logger.debug(f"Received embedding of length: {len(embedding)}") |
| 517 | + else: |
| 518 | + logger.warning("Neither litellm nor openai available for embeddings") |
| 519 | + return |
480 | 520 |
|
481 | 521 | # Sanitize metadata for ChromaDB |
482 | 522 | sanitized_metadata = self._sanitize_metadata(metadata) |
@@ -527,15 +567,28 @@ def search_long_term( |
527 | 567 |
|
528 | 568 | elif self.use_rag and hasattr(self, "chroma_col"): |
529 | 569 | try: |
530 | | - from openai import OpenAI |
531 | | - client = OpenAI() |
532 | | - |
533 | | - # Get query embedding |
534 | | - response = client.embeddings.create( |
535 | | - input=query, |
536 | | - model="text-embedding-3-small" # Using consistent model |
537 | | - ) |
538 | | - query_embedding = response.data[0].embedding |
| 570 | + if LITELLM_AVAILABLE: |
| 571 | + # Use LiteLLM for consistency with the rest of the codebase |
| 572 | + import litellm |
| 573 | + |
| 574 | + response = litellm.embedding( |
| 575 | + model="text-embedding-3-small", |
| 576 | + input=query |
| 577 | + ) |
| 578 | + query_embedding = response.data[0]["embedding"] |
| 579 | + elif OPENAI_AVAILABLE: |
| 580 | + # Fallback to OpenAI client |
| 581 | + from openai import OpenAI |
| 582 | + client = OpenAI() |
| 583 | + |
| 584 | + response = client.embeddings.create( |
| 585 | + input=query, |
| 586 | + model="text-embedding-3-small" |
| 587 | + ) |
| 588 | + query_embedding = response.data[0].embedding |
| 589 | + else: |
| 590 | + self._log_verbose("Neither litellm nor openai available for embeddings", logging.WARNING) |
| 591 | + return [] |
539 | 592 |
|
540 | 593 | # Search ChromaDB with embedding |
541 | 594 | resp = self.chroma_col.query( |
@@ -910,21 +963,44 @@ def calculate_quality_metrics( |
910 | 963 | """ |
911 | 964 |
|
912 | 965 | try: |
913 | | - # Use LiteLLM for consistency with the rest of the codebase |
914 | | - import litellm |
915 | | - |
916 | | - # Convert model name if it's in litellm format |
917 | | - model_name = llm or "gpt-4o-mini" |
918 | | - |
919 | | - response = litellm.completion( |
920 | | - model=model_name, |
921 | | - messages=[{ |
922 | | - "role": "user", |
923 | | - "content": custom_prompt or default_prompt |
924 | | - }], |
925 | | - response_format={"type": "json_object"}, |
926 | | - temperature=0.3 |
927 | | - ) |
| 966 | + if LITELLM_AVAILABLE: |
| 967 | + # Use LiteLLM for consistency with the rest of the codebase |
| 968 | + import litellm |
| 969 | + |
| 970 | + # Convert model name if it's in litellm format |
| 971 | + model_name = llm or "gpt-4o-mini" |
| 972 | + |
| 973 | + response = litellm.completion( |
| 974 | + model=model_name, |
| 975 | + messages=[{ |
| 976 | + "role": "user", |
| 977 | + "content": custom_prompt or default_prompt |
| 978 | + }], |
| 979 | + response_format={"type": "json_object"}, |
| 980 | + temperature=0.3 |
| 981 | + ) |
| 982 | + elif OPENAI_AVAILABLE: |
| 983 | + # Fallback to OpenAI client |
| 984 | + from openai import OpenAI |
| 985 | + client = OpenAI() |
| 986 | + |
| 987 | + response = client.chat.completions.create( |
| 988 | + model=llm or "gpt-4o-mini", |
| 989 | + messages=[{ |
| 990 | + "role": "user", |
| 991 | + "content": custom_prompt or default_prompt |
| 992 | + }], |
| 993 | + response_format={"type": "json_object"}, |
| 994 | + temperature=0.3 |
| 995 | + ) |
| 996 | + else: |
| 997 | + logger.error("Neither litellm nor openai available for quality calculation") |
| 998 | + return { |
| 999 | + "completeness": 0.0, |
| 1000 | + "relevance": 0.0, |
| 1001 | + "clarity": 0.0, |
| 1002 | + "accuracy": 0.0 |
| 1003 | + } |
928 | 1004 |
|
929 | 1005 | metrics = json.loads(response.choices[0].message.content) |
930 | 1006 |
|
|
0 commit comments