mirror of
https://github.com/katanemo/plano.git
synced 2026-06-17 15:25:17 +02:00
* pushing draft PR * transformations are working. Now need to add some tests next * updated tests and added necessary response transformations for Anthropics' message response object * fixed bugs for integration tests * fixed doc tests * fixed serialization issues with enums on response * adding some debug logs to help * fixed issues with non-streaming responses * updated the stream_context to update response bytes * the serialized bytes length must be set in the response side * fixed the debug statement that was causing the integration tests for wasm to fail * fixing json parsing errors * intentionally removing the headers * making sure that we convert the raw bytes to the correct provider type upstream * fixing non-streaming responses to tranform correctly * /v1/messages works with transformations to and from /v1/chat/completions * updating the CLI and demos to support anthropic vs. claude * adding the anthropic key to the preference based routing tests * fixed test cases and added more structured logs * fixed integration tests and cleaned up logs * added python client tests for anthropic and openai * cleaned up logs and fixed issue with connectivity for llm gateway in weather forecast demo * fixing the tests. python dependency order was broken * updated the openAI client to fix demos * removed the raw response debug statement * fixed the dup cloning issue and cleaned up the ProviderRequestType enum and traits * fixing logs * moved away from string literals to consts * fixed streaming from Anthropic Client to OpenAI * removed debug statement that would likely trip up integration tests * fixed integration tests for llm_gateway * cleaned up test cases and removed unnecessary crates * fixing comments from PR * fixed bug whereby we were sending an OpenAIChatCompletions request object to llm_gateway even though the request may have been AnthropicMessages --------- Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-4.local> Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-9.local> Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-10.local> Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-41.local> Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-136.local>
48 lines
1.2 KiB
Rust
48 lines
1.2 KiB
Rust
use std::rc::Rc;
|
|
|
|
use crate::{configuration, llm_providers::LlmProviders};
|
|
use configuration::LlmProvider;
|
|
use rand::{seq::IteratorRandom, thread_rng};
|
|
|
|
#[derive(Debug)]
|
|
pub enum ProviderHint {
|
|
Default,
|
|
Name(String),
|
|
}
|
|
|
|
impl From<String> for ProviderHint {
|
|
fn from(value: String) -> Self {
|
|
match value.as_str() {
|
|
"default" => ProviderHint::Default,
|
|
_ => ProviderHint::Name(value),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn get_llm_provider(
|
|
llm_providers: &LlmProviders,
|
|
provider_hint: Option<ProviderHint>,
|
|
) -> Rc<LlmProvider> {
|
|
let maybe_provider = provider_hint.and_then(|hint| match hint {
|
|
ProviderHint::Default => llm_providers.default(),
|
|
// FIXME: should a non-existent name in the hint be more explicit? i.e, return a BAD_REQUEST?
|
|
ProviderHint::Name(name) => llm_providers.get(&name),
|
|
});
|
|
|
|
if let Some(provider) = maybe_provider {
|
|
return provider;
|
|
}
|
|
|
|
|
|
if llm_providers.default().is_some() {
|
|
return llm_providers.default().unwrap();
|
|
}
|
|
|
|
let mut rng = thread_rng();
|
|
llm_providers
|
|
.iter()
|
|
.choose(&mut rng)
|
|
.expect("There should always be at least one llm provider")
|
|
.1
|
|
.clone()
|
|
}
|