Spaces:
Running
Running
added openrouter api and called using simple http layer
Browse files- app.py +24 -14
- global_config.py +18 -2
- helpers/llm_helper.py +35 -0
app.py
CHANGED
@@ -345,20 +345,30 @@ def set_up_chat_ui():
|
|
345 |
)
|
346 |
return
|
347 |
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
)
|
360 |
-
|
361 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
362 |
except (httpx.ConnectError, requests.exceptions.ConnectionError):
|
363 |
handle_error(
|
364 |
'A connection error occurred while streaming content from the LLM endpoint.'
|
|
|
345 |
)
|
346 |
return
|
347 |
|
348 |
+
if provider == GlobalConfig.PROVIDER_OPENROUTER:
|
349 |
+
# OpenRouter returns a function, not a LangChain LLM. Call it directly.
|
350 |
+
response_json = llm(formatted_template)
|
351 |
+
# Extract the text from the OpenAI-compatible response
|
352 |
+
try:
|
353 |
+
response = response_json["choices"][0]["message"]["content"]
|
354 |
+
except Exception as ex:
|
355 |
+
handle_error(f"Failed to parse OpenRouter response: {ex}\nRaw response: {response_json}", True)
|
356 |
+
return
|
357 |
+
else:
|
358 |
+
for chunk in llm.stream(formatted_template):
|
359 |
+
if isinstance(chunk, str):
|
360 |
+
response += chunk
|
361 |
+
else:
|
362 |
+
response += chunk.content # AIMessageChunk
|
363 |
+
|
364 |
+
# Update the progress bar with an approx progress percentage
|
365 |
+
progress_bar.progress(
|
366 |
+
min(
|
367 |
+
len(response) / gcfg.get_max_output_tokens(llm_provider_to_use),
|
368 |
+
0.95
|
369 |
+
),
|
370 |
+
text='Streaming content...this might take a while...'
|
371 |
+
)
|
372 |
except (httpx.ConnectError, requests.exceptions.ConnectionError):
|
373 |
handle_error(
|
374 |
'A connection error occurred while streaming content from the LLM endpoint.'
|
global_config.py
CHANGED
@@ -23,6 +23,7 @@ class GlobalConfig:
|
|
23 |
PROVIDER_OLLAMA = 'ol'
|
24 |
PROVIDER_TOGETHER_AI = 'to'
|
25 |
PROVIDER_AZURE_OPENAI = 'az'
|
|
|
26 |
VALID_PROVIDERS = {
|
27 |
PROVIDER_COHERE,
|
28 |
PROVIDER_GOOGLE_GEMINI,
|
@@ -30,6 +31,7 @@ class GlobalConfig:
|
|
30 |
PROVIDER_OLLAMA,
|
31 |
PROVIDER_TOGETHER_AI,
|
32 |
PROVIDER_AZURE_OPENAI,
|
|
|
33 |
}
|
34 |
VALID_MODELS = {
|
35 |
'[az]azure/open-ai': {
|
@@ -72,6 +74,19 @@ class GlobalConfig:
|
|
72 |
'max_new_tokens': 4096,
|
73 |
'paid': True,
|
74 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
}
|
76 |
LLM_PROVIDER_HELP = (
|
77 |
'LLM provider codes:\n\n'
|
@@ -79,13 +94,14 @@ class GlobalConfig:
|
|
79 |
'- **[co]**: Cohere\n'
|
80 |
'- **[gg]**: Google Gemini API\n'
|
81 |
'- **[hf]**: Hugging Face Inference API\n'
|
82 |
-
'- **[to]**: Together AI\n
|
|
|
83 |
'[Find out more](https://github.com/barun-saha/slide-deck-ai?tab=readme-ov-file#summary-of-the-llms)'
|
84 |
)
|
85 |
DEFAULT_MODEL_INDEX = int(os.environ.get('DEFAULT_MODEL_INDEX', '4'))
|
86 |
LLM_MODEL_TEMPERATURE = 0.2
|
87 |
LLM_MODEL_MIN_OUTPUT_LENGTH = 100
|
88 |
-
LLM_MODEL_MAX_INPUT_LENGTH =
|
89 |
MAX_PAGE_COUNT = 50
|
90 |
|
91 |
LOG_LEVEL = 'DEBUG'
|
|
|
23 |
PROVIDER_OLLAMA = 'ol'
|
24 |
PROVIDER_TOGETHER_AI = 'to'
|
25 |
PROVIDER_AZURE_OPENAI = 'az'
|
26 |
+
PROVIDER_OPENROUTER = 'or'
|
27 |
VALID_PROVIDERS = {
|
28 |
PROVIDER_COHERE,
|
29 |
PROVIDER_GOOGLE_GEMINI,
|
|
|
31 |
PROVIDER_OLLAMA,
|
32 |
PROVIDER_TOGETHER_AI,
|
33 |
PROVIDER_AZURE_OPENAI,
|
34 |
+
PROVIDER_OPENROUTER,
|
35 |
}
|
36 |
VALID_MODELS = {
|
37 |
'[az]azure/open-ai': {
|
|
|
74 |
'max_new_tokens': 4096,
|
75 |
'paid': True,
|
76 |
},
|
77 |
+
'[or]openai/gpt-3.5-turbo': {
|
78 |
+
'description': 'OpenAI GPT-3.5 Turbo (via OpenRouter)',
|
79 |
+
'max_new_tokens': 2048,
|
80 |
+
},
|
81 |
+
'[or]openrouter/gpt-4-omni': {
|
82 |
+
'description': 'OpenRouter GPT-4 Omni',
|
83 |
+
'max_new_tokens': 8192,
|
84 |
+
'paid': True,
|
85 |
+
},
|
86 |
+
'[or]openrouter/mixtral-8x22b-instruct': {
|
87 |
+
'description': 'Mixtral 8x22B Instruct (via OpenRouter)',
|
88 |
+
'max_new_tokens': 2048,
|
89 |
+
},
|
90 |
}
|
91 |
LLM_PROVIDER_HELP = (
|
92 |
'LLM provider codes:\n\n'
|
|
|
94 |
'- **[co]**: Cohere\n'
|
95 |
'- **[gg]**: Google Gemini API\n'
|
96 |
'- **[hf]**: Hugging Face Inference API\n'
|
97 |
+
'- **[to]**: Together AI\n'
|
98 |
+
'- **[or]**: OpenRouter\n\n'
|
99 |
'[Find out more](https://github.com/barun-saha/slide-deck-ai?tab=readme-ov-file#summary-of-the-llms)'
|
100 |
)
|
101 |
DEFAULT_MODEL_INDEX = int(os.environ.get('DEFAULT_MODEL_INDEX', '4'))
|
102 |
LLM_MODEL_TEMPERATURE = 0.2
|
103 |
LLM_MODEL_MIN_OUTPUT_LENGTH = 100
|
104 |
+
LLM_MODEL_MAX_INPUT_LENGTH = 10000 # characters
|
105 |
MAX_PAGE_COUNT = 50
|
106 |
|
107 |
LOG_LEVEL = 'DEBUG'
|
helpers/llm_helper.py
CHANGED
@@ -188,6 +188,41 @@ def get_langchain_llm(
|
|
188 |
api_key=api_key,
|
189 |
)
|
190 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
191 |
if provider == GlobalConfig.PROVIDER_COHERE:
|
192 |
from langchain_cohere.llms import Cohere
|
193 |
|
|
|
188 |
api_key=api_key,
|
189 |
)
|
190 |
|
191 |
+
if provider == GlobalConfig.PROVIDER_OPENROUTER:
|
192 |
+
logger.debug('Getting LLM via OpenRouter: %s', model)
|
193 |
+
OPENROUTER_API_URL = "https://openrouter.ai/api/v1/chat/completions"
|
194 |
+
OPENROUTER_API_KEY = api_key
|
195 |
+
import os
|
196 |
+
import requests
|
197 |
+
|
198 |
+
def openrouter_completion(prompt, model=model, api_key=OPENROUTER_API_KEY):
|
199 |
+
headers = {
|
200 |
+
"Authorization": f"Bearer {api_key}",
|
201 |
+
"Content-Type": "application/json",
|
202 |
+
}
|
203 |
+
# Optionally add analytics headers if available
|
204 |
+
site_url = os.getenv("OPENROUTER_SITE_URL")
|
205 |
+
app_name = os.getenv("OPENROUTER_SITE_NAME")
|
206 |
+
if site_url:
|
207 |
+
headers["HTTP-Referer"] = site_url
|
208 |
+
if app_name:
|
209 |
+
headers["X-Title"] = app_name
|
210 |
+
data = {
|
211 |
+
"model": model,
|
212 |
+
"messages": [
|
213 |
+
{"role": "system", "content": "You are a helpful assistant summarizing technical support information. Provide a concise summary or key action points based on the provided context."},
|
214 |
+
{"role": "user", "content": prompt},
|
215 |
+
]
|
216 |
+
}
|
217 |
+
response = requests.post(
|
218 |
+
url=OPENROUTER_API_URL,
|
219 |
+
headers=headers,
|
220 |
+
json=data
|
221 |
+
)
|
222 |
+
response.raise_for_status()
|
223 |
+
return response.json()
|
224 |
+
return openrouter_completion
|
225 |
+
|
226 |
if provider == GlobalConfig.PROVIDER_COHERE:
|
227 |
from langchain_cohere.llms import Cohere
|
228 |
|