add support for openwebui

This commit is contained in:
Adil Hafeez 2025-05-28 14:47:26 -07:00
parent ce26ebb330
commit 4f5c71ffc0
No known key found for this signature in database
GPG key ID: 9B18EF7691369645
4 changed files with 13 additions and 14 deletions

View file

@ -3,7 +3,6 @@ use std::sync::Arc;
use bytes::Bytes; use bytes::Bytes;
use common::api::open_ai::ChatCompletionsRequest; use common::api::open_ai::ChatCompletionsRequest;
use common::consts::ARCH_PROVIDER_HINT_HEADER; use common::consts::ARCH_PROVIDER_HINT_HEADER;
use common::utils::shorten_string;
use http_body_util::combinators::BoxBody; use http_body_util::combinators::BoxBody;
use http_body_util::{BodyExt, Full, StreamBody}; use http_body_util::{BodyExt, Full, StreamBody};
use hyper::body::Frame; use hyper::body::Frame;
@ -39,7 +38,7 @@ pub async fn chat_completions(
let v: Value = serde_json::from_slice(&chat_request_bytes).unwrap(); let v: Value = serde_json::from_slice(&chat_request_bytes).unwrap();
let err_msg = format!("Failed to parse request body: {}", err); let err_msg = format!("Failed to parse request body: {}", err);
warn!("{}", err_msg); warn!("{}", err_msg);
warn!("request body: {}", v.to_string()); warn!("arch-router request body: {}", v.to_string());
let mut bad_request = Response::new(full(err_msg)); let mut bad_request = Response::new(full(err_msg));
*bad_request.status_mut() = StatusCode::BAD_REQUEST; *bad_request.status_mut() = StatusCode::BAD_REQUEST;
return Ok(bad_request); return Ok(bad_request);
@ -47,8 +46,8 @@ pub async fn chat_completions(
}; };
debug!( debug!(
"request body: {}", "arch-router request body: {}",
shorten_string(&serde_json::to_string(&chat_completion_request).unwrap()) &serde_json::to_string(&chat_completion_request).unwrap()
); );
let trace_parent = request_headers let trace_parent = request_headers
@ -56,7 +55,7 @@ pub async fn chat_completions(
.find(|(ty, _)| ty.as_str() == "traceparent") .find(|(ty, _)| ty.as_str() == "traceparent")
.map(|(_, value)| value.to_str().unwrap_or_default().to_string()); .map(|(_, value)| value.to_str().unwrap_or_default().to_string());
let selected_llm = match router_service let mut selected_llm = match router_service
.determine_route(&chat_completion_request.messages, trace_parent.clone()) .determine_route(&chat_completion_request.messages, trace_parent.clone())
.await .await
{ {
@ -69,6 +68,11 @@ pub async fn chat_completions(
} }
}; };
if selected_llm.is_none() {
debug!("No LLM model selected, using default from request");
selected_llm = Some(chat_completion_request.model.clone());
}
info!( info!(
"sending request to llm provider: {} with llm model: {:?}", "sending request to llm provider: {} with llm model: {:?}",
llm_provider_endpoint, selected_llm llm_provider_endpoint, selected_llm

View file

@ -2,7 +2,6 @@ use bytes::Bytes;
use common::api::open_ai::Models; use common::api::open_ai::Models;
use common::configuration::LlmProvider; use common::configuration::LlmProvider;
use http_body_util::{combinators::BoxBody, BodyExt, Full}; use http_body_util::{combinators::BoxBody, BodyExt, Full};
use hyper::body::Body;
use hyper::{Response, StatusCode}; use hyper::{Response, StatusCode};
use serde_json; use serde_json;
use std::sync::Arc; use std::sync::Arc;
@ -12,11 +11,6 @@ pub async fn list_models(
) -> Response<BoxBody<Bytes, hyper::Error>> { ) -> Response<BoxBody<Bytes, hyper::Error>> {
let prov = llm_providers.clone(); let prov = llm_providers.clone();
let providers = (*prov).clone(); let providers = (*prov).clone();
let providers = providers
.iter()
.filter(|provider| provider.name == "gpt-4o-mini")
.cloned()
.collect::<Vec<_>>();
let openai_models = Models::from(providers); let openai_models = Models::from(providers);
match serde_json::to_string(&openai_models) { match serde_json::to_string(&openai_models) {

View file

@ -8,6 +8,7 @@ listeners:
timeout: 30s timeout: 30s
llm_providers: llm_providers:
- name: gpt-4o-mini - name: gpt-4o-mini
access_key: $OPENAI_API_KEY access_key: $OPENAI_API_KEY
provider_interface: openai provider_interface: openai
@ -17,6 +18,7 @@ llm_providers:
access_key: $OPENAI_API_KEY access_key: $OPENAI_API_KEY
provider_interface: openai provider_interface: openai
model: gpt-4o model: gpt-4o
default: true
- name: ministral-3b - name: ministral-3b
access_key: $MISTRAL_API_KEY access_key: $MISTRAL_API_KEY
@ -27,7 +29,6 @@ llm_providers:
access_key: $ANTHROPY_API_KEY access_key: $ANTHROPY_API_KEY
provider_interface: claude provider_interface: claude
model: claude-3-7-sonnet-latest model: claude-3-7-sonnet-latest
default: true
- name: claude-sonnet-4 - name: claude-sonnet-4
access_key: $ANTHROPY_API_KEY access_key: $ANTHROPY_API_KEY

View file

@ -3,13 +3,13 @@ services:
open-web-ui: open-web-ui:
image: ghcr.io/open-webui/open-webui:main image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: always restart: always
ports: ports:
- "8080:8080" - "8080:8080"
environment: environment:
- DEFAULT_MODEL=gpt-4o-mini - DEFAULT_MODEL=gpt-4o-mini
- OPENAI_API_KEY=your_secret_key - ENABLE_OPENAI_API=true
- OPENAI_API_BASE_URL=http://host.docker.internal:12000/v1
jaeger: jaeger:
build: build: