Merge 3f40844268
into a102b08743
This commit is contained in:
commit
c571fbd443
4 changed files with 51 additions and 2 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -11192,6 +11192,7 @@ dependencies = [
|
||||||
"schemars",
|
"schemars",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
"util",
|
||||||
"workspace-hack",
|
"workspace-hack",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,8 @@ use credentials_provider::CredentialsProvider;
|
||||||
use editor::{Editor, EditorElement, EditorStyle};
|
use editor::{Editor, EditorElement, EditorStyle};
|
||||||
use futures::{FutureExt, Stream, StreamExt, future::BoxFuture};
|
use futures::{FutureExt, Stream, StreamExt, future::BoxFuture};
|
||||||
use gpui::{
|
use gpui::{
|
||||||
AnyView, App, AsyncApp, Context, Entity, FontStyle, Subscription, Task, TextStyle, WhiteSpace,
|
AnyView, App, AppContext, AsyncApp, Context, Entity, FontStyle, Subscription, Task, TextStyle,
|
||||||
|
WhiteSpace,
|
||||||
};
|
};
|
||||||
use http_client::HttpClient;
|
use http_client::HttpClient;
|
||||||
use language_model::{
|
use language_model::{
|
||||||
|
@ -15,7 +16,8 @@ use language_model::{
|
||||||
LanguageModelToolUse, MessageContent, RateLimiter, Role, StopReason, TokenUsage,
|
LanguageModelToolUse, MessageContent, RateLimiter, Role, StopReason, TokenUsage,
|
||||||
};
|
};
|
||||||
use open_router::{
|
use open_router::{
|
||||||
Model, ModelMode as OpenRouterModelMode, ResponseStreamEvent, list_models, stream_completion,
|
Model, ModelMode as OpenRouterModelMode, Provider, ResponseStreamEvent, list_models,
|
||||||
|
stream_completion,
|
||||||
};
|
};
|
||||||
use schemars::JsonSchema;
|
use schemars::JsonSchema;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -48,6 +50,7 @@ pub struct AvailableModel {
|
||||||
pub supports_tools: Option<bool>,
|
pub supports_tools: Option<bool>,
|
||||||
pub supports_images: Option<bool>,
|
pub supports_images: Option<bool>,
|
||||||
pub mode: Option<ModelMode>,
|
pub mode: Option<ModelMode>,
|
||||||
|
pub provider: Option<Provider>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
|
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
|
||||||
|
@ -278,6 +281,7 @@ impl LanguageModelProvider for OpenRouterLanguageModelProvider {
|
||||||
supports_tools: model.supports_tools,
|
supports_tools: model.supports_tools,
|
||||||
supports_images: model.supports_images,
|
supports_images: model.supports_images,
|
||||||
mode: model.mode.clone().unwrap_or_default().into(),
|
mode: model.mode.clone().unwrap_or_default().into(),
|
||||||
|
provider: model.provider.clone(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -556,6 +560,7 @@ pub fn into_open_router(
|
||||||
LanguageModelToolChoice::Any => open_router::ToolChoice::Required,
|
LanguageModelToolChoice::Any => open_router::ToolChoice::Required,
|
||||||
LanguageModelToolChoice::None => open_router::ToolChoice::None,
|
LanguageModelToolChoice::None => open_router::ToolChoice::None,
|
||||||
}),
|
}),
|
||||||
|
provider: model.provider.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,3 +23,4 @@ schemars = { workspace = true, optional = true }
|
||||||
serde.workspace = true
|
serde.workspace = true
|
||||||
serde_json.workspace = true
|
serde_json.workspace = true
|
||||||
workspace-hack.workspace = true
|
workspace-hack.workspace = true
|
||||||
|
util.workspace = true
|
||||||
|
|
|
@ -4,6 +4,7 @@ use http_client::{AsyncBody, HttpClient, Method, Request as HttpRequest};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
use util::serde::default_true;
|
||||||
|
|
||||||
pub const OPEN_ROUTER_API_URL: &str = "https://openrouter.ai/api/v1";
|
pub const OPEN_ROUTER_API_URL: &str = "https://openrouter.ai/api/v1";
|
||||||
|
|
||||||
|
@ -11,6 +12,41 @@ fn is_none_or_empty<T: AsRef<[U]>, U>(opt: &Option<T>) -> bool {
|
||||||
opt.as_ref().is_none_or(|v| v.as_ref().is_empty())
|
opt.as_ref().is_none_or(|v| v.as_ref().is_empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(rename_all = "lowercase")]
|
||||||
|
pub enum DataCollection {
|
||||||
|
Allow,
|
||||||
|
Disallow,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for DataCollection {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::Allow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub struct Provider {
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
order: Option<Vec<String>>,
|
||||||
|
#[serde(default = "default_true")]
|
||||||
|
allow_fallbacks: bool,
|
||||||
|
#[serde(default)]
|
||||||
|
require_parameters: bool,
|
||||||
|
#[serde(default)]
|
||||||
|
data_collection: DataCollection,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
only: Option<Vec<String>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
ignore: Option<Vec<String>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
quantizations: Option<Vec<String>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
sort: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Serialize, Deserialize, Debug, Eq, PartialEq)]
|
#[derive(Clone, Copy, Serialize, Deserialize, Debug, Eq, PartialEq)]
|
||||||
#[serde(rename_all = "lowercase")]
|
#[serde(rename_all = "lowercase")]
|
||||||
pub enum Role {
|
pub enum Role {
|
||||||
|
@ -55,6 +91,7 @@ pub struct Model {
|
||||||
pub supports_images: Option<bool>,
|
pub supports_images: Option<bool>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub mode: ModelMode,
|
pub mode: ModelMode,
|
||||||
|
pub provider: Option<Provider>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
@ -76,6 +113,7 @@ impl Model {
|
||||||
Some(true),
|
Some(true),
|
||||||
Some(false),
|
Some(false),
|
||||||
Some(ModelMode::Default),
|
Some(ModelMode::Default),
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,6 +128,7 @@ impl Model {
|
||||||
supports_tools: Option<bool>,
|
supports_tools: Option<bool>,
|
||||||
supports_images: Option<bool>,
|
supports_images: Option<bool>,
|
||||||
mode: Option<ModelMode>,
|
mode: Option<ModelMode>,
|
||||||
|
provider: Option<Provider>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
name: name.to_owned(),
|
name: name.to_owned(),
|
||||||
|
@ -98,6 +137,7 @@ impl Model {
|
||||||
supports_tools,
|
supports_tools,
|
||||||
supports_images,
|
supports_images,
|
||||||
mode: mode.unwrap_or(ModelMode::Default),
|
mode: mode.unwrap_or(ModelMode::Default),
|
||||||
|
provider,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,6 +185,7 @@ pub struct Request {
|
||||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||||
pub reasoning: Option<Reasoning>,
|
pub reasoning: Option<Reasoning>,
|
||||||
pub usage: RequestUsage,
|
pub usage: RequestUsage,
|
||||||
|
pub provider: Option<Provider>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Serialize, Deserialize)]
|
#[derive(Debug, Default, Serialize, Deserialize)]
|
||||||
|
@ -632,6 +673,7 @@ pub async fn list_models(client: &dyn HttpClient, api_url: &str) -> Result<Vec<M
|
||||||
} else {
|
} else {
|
||||||
ModelMode::Default
|
ModelMode::Default
|
||||||
},
|
},
|
||||||
|
provider: None,
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue