lemdaddy commited on
Commit
66bc554
·
1 Parent(s): 3cdfd33

Add support for fallback on LLM error or downtown

Browse files
Files changed (2) hide show
  1. chatxbt-assistant.py +23 -7
  2. src/config/portkey_config.py +108 -0
chatxbt-assistant.py CHANGED
@@ -1,6 +1,7 @@
1
- import os
2
  from typing import Optional, Dict
3
  from dotenv import load_dotenv
 
4
  load_dotenv()
5
 
6
  import chainlit as cl
@@ -9,13 +10,16 @@ from phi.llm.openai import OpenAIChat
9
  from phi.tools.duckduckgo import DuckDuckGo
10
  from phi.tools.yfinance import YFinanceTools
11
  from src.databases.postgres import sqlalchemy_engine
 
12
  from src.tools.crypto_swap_toolkit import CryptoSwapTools
13
  from src.tools.crypto_data_toolkit import CryptoDataTools
14
- from src.tools.crypto_evm_wallet_toolkit import CryptoEVMWalletTools
15
- from src.tools.user_confirmation_pin_toolkit import UserConfirmationPinToolkit
16
  from src.tools.user_profile_toolkit import UserProfileToolkit
17
  from phi.storage.assistant.postgres import PgAssistantStorage
18
- from src.knowledge_bases.combined import knowledge_base
 
 
19
 
20
  storage = PgAssistantStorage(
21
  # stores runs in the ai.assistant_runs table
@@ -85,14 +89,24 @@ async def set_starters():
85
  async def start():
86
  is_dev_mode = True if os.getenv("DEV_MODE") else False
87
 
 
 
 
88
  # Initialize the assistant
89
  cxbt_assistant = Assistant(
90
- llm=OpenAIChat(model="gpt-4o"),
 
 
 
 
 
 
 
91
  tools=[
92
- UserProfileToolkit(),
93
  DuckDuckGo(),
94
  CryptoDataTools(),
95
  CryptoSwapTools(),
 
96
  CryptoEVMWalletTools(),
97
  UserConfirmationPinToolkit(),
98
  YFinanceTools(stock_price=True)
@@ -104,7 +118,9 @@ async def start():
104
  search_knowledge=True,
105
  read_chat_history=True,
106
  add_references_to_prompt=True,
107
- add_chat_history_to_prompt=True
 
 
108
  )
109
  cxbt_assistant.knowledge_base.load(recreate=False)
110
 
 
1
+ import os, json
2
  from typing import Optional, Dict
3
  from dotenv import load_dotenv
4
+
5
  load_dotenv()
6
 
7
  import chainlit as cl
 
10
  from phi.tools.duckduckgo import DuckDuckGo
11
  from phi.tools.yfinance import YFinanceTools
12
  from src.databases.postgres import sqlalchemy_engine
13
+ from src.knowledge_bases.combined import knowledge_base
14
  from src.tools.crypto_swap_toolkit import CryptoSwapTools
15
  from src.tools.crypto_data_toolkit import CryptoDataTools
16
+ from portkey_ai import PORTKEY_GATEWAY_URL, createHeaders
17
+ from src.config.portkey_config import generate_portkey_config
18
  from src.tools.user_profile_toolkit import UserProfileToolkit
19
  from phi.storage.assistant.postgres import PgAssistantStorage
20
+ from src.tools.crypto_evm_wallet_toolkit import CryptoEVMWalletTools
21
+ from src.tools.user_confirmation_pin_toolkit import UserConfirmationPinToolkit
22
+
23
 
24
  storage = PgAssistantStorage(
25
  # stores runs in the ai.assistant_runs table
 
89
  async def start():
90
  is_dev_mode = True if os.getenv("DEV_MODE") else False
91
 
92
+ portkey_local_gateway = True if os.getenv("PORTKEY_LOCAL_GATEWAY_URL") else False
93
+ portkey_config = generate_portkey_config(local=portkey_local_gateway)
94
+
95
  # Initialize the assistant
96
  cxbt_assistant = Assistant(
97
+ llm=OpenAIChat(
98
+ api_key=os.getenv("PORTKEY_API_KEY"),
99
+ base_url=os.getenv("PORTKEY_LOCAL_GATEWAY_URL") or PORTKEY_GATEWAY_URL,
100
+ default_headers=createHeaders(
101
+ api_key=os.getenv("PORTKEY_API_KEY") or None,
102
+ config=portkey_config
103
+ ),
104
+ ),
105
  tools=[
 
106
  DuckDuckGo(),
107
  CryptoDataTools(),
108
  CryptoSwapTools(),
109
+ UserProfileToolkit(),
110
  CryptoEVMWalletTools(),
111
  UserConfirmationPinToolkit(),
112
  YFinanceTools(stock_price=True)
 
118
  search_knowledge=True,
119
  read_chat_history=True,
120
  add_references_to_prompt=True,
121
+ add_chat_history_to_prompt=True,
122
+ prevent_hallucinations=True,
123
+ prevent_prompt_injection=True
124
  )
125
  cxbt_assistant.knowledge_base.load(recreate=False)
126
 
src/config/portkey_config.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+
4
+ def generate_portkey_config(local: bool = True):
5
+ if local:
6
+ config = {
7
+ "strategy": {
8
+ "mode": "fallback"
9
+ },
10
+ "cache": {
11
+ "mode": "semantic",
12
+ "max_age": 10000
13
+ },
14
+ "retry": {
15
+ "attempts": 3,
16
+ "on_status_codes": [429]
17
+ },
18
+ "targets": [
19
+ # {
20
+ # "provider": "mistral-ai",
21
+ # "api_key": os.getenv("MISTRAL_API_KEY"),
22
+ # "override_params": {
23
+ # "model": "codestral-latest",
24
+ # "max_tokens": 1024,
25
+ # "temperature": 0
26
+ # }
27
+ # },
28
+ {
29
+ "provider": "anthropic",
30
+ "api_key": os.getenv("ANTHROPIC_API_KEY"),
31
+ "override_params": {
32
+ "model": "claude-3-5-sonnet-20240620",
33
+ "max_tokens": 1024,
34
+ "temperature": 0
35
+ }
36
+ },
37
+ {
38
+ "provider": "openai",
39
+ "api_key": os.getenv("OPENAI_API_KEY"),
40
+ "override_params": {
41
+ "model": "gpt-4o",
42
+ "max_tokens": 1024,
43
+ "temperature": 0
44
+ }
45
+ },
46
+ {
47
+ "provider": "anthropic",
48
+ "api_key": os.getenv("ANTHROPIC_API_KEY"),
49
+ "override_params": {
50
+ "model": "claude-3-opus-20240229",
51
+ "max_tokens": 1024,
52
+ "temperature": 0
53
+ }
54
+ }
55
+ ]
56
+ }
57
+ else:
58
+ config = {
59
+ "strategy": {
60
+ "mode": "fallback"
61
+ },
62
+ "cache": {
63
+ "mode": "semantic",
64
+ "max_age": 10000
65
+ },
66
+ "retry": {
67
+ "attempts": 3,
68
+ "on_status_codes": [429]
69
+ },
70
+ "targets": [
71
+
72
+ {
73
+ "virtual_key": os.getenv("PORTKEY_OPENAI_VIRTUAL_KEY"),
74
+ "override_params": {
75
+ "model": "gpt-4o",
76
+ "max_tokens": 1024,
77
+ "temperature": 0
78
+ }
79
+ },
80
+ {
81
+ "provider": "anthropic",
82
+ "api_key": os.getenv("POETRY_ANTHROPIC_API_KEY"),
83
+ "override_params": {
84
+ "model": "claude-3-5-sonnet-20240620",
85
+ "max_tokens": 1024,
86
+ "temperature": 0
87
+ }
88
+ },
89
+ {
90
+ "virtual_key": os.getenv("PORTKEY_ANTHROPIC_API_KEY"),
91
+ "override_params": {
92
+ "model": "claude-3-opus-20240229",
93
+ "max_tokens": 1024,
94
+ "temperature": 0
95
+ }
96
+ },
97
+ {
98
+ "virtual_key": os.getenv("PORTKEY_MISTRAL_API_KEY"),
99
+ "override_params": {
100
+ "model": "codestral-latest",
101
+ "max_tokens": 1024,
102
+ "temperature": 0
103
+ }
104
+ }
105
+ ]
106
+ }
107
+
108
+ return json.dumps(config)