This PR mostly refines the model selector popover design by formatting the models names' and adjusting spacing/alignment in the list-related items. The list component changes could've been made in a separate PR but it was also very practical to do it here as I was already in-context. Either way, I'm happy to separate if that's better! One thing I couldn't necessarily figure out, though, is why the order changed (e.g., Anthropic at last ). I wonder if that was because of the separator logic somehow? I'd love guidance here—new to Rust! | Before | After | |--------|--------| | <img width="228" alt="Screenshot 2024-07-23 at 21 02 33" src="https://github.com/user-attachments/assets/3372c6c9-08dc-4d71-9265-26f015e2dbc2"> | <img width="228" alt="Screenshot 2024-07-23 at 21 01 45" src="https://github.com/user-attachments/assets/624cc7db-a3d9-48e3-99d7-c29829501130"> | --- Release Notes: - N/A --------- Co-authored-by: Marshall Bowers <elliott.codes@gmail.com> Co-authored-by: Bennet Bo Fenner <bennet@zed.dev> Co-authored-by: Antonio <antonio@zed.dev> Co-authored-by: Antonio Scandurra <me@as-cii.com>
97 lines
2.7 KiB
Rust
97 lines
2.7 KiB
Rust
mod model;
|
|
pub mod provider;
|
|
mod registry;
|
|
mod request;
|
|
mod role;
|
|
pub mod settings;
|
|
|
|
use std::sync::Arc;
|
|
|
|
use anyhow::Result;
|
|
use client::Client;
|
|
use futures::{future::BoxFuture, stream::BoxStream};
|
|
use gpui::{AnyView, AppContext, AsyncAppContext, SharedString, Task, WindowContext};
|
|
|
|
pub use model::*;
|
|
pub use registry::*;
|
|
pub use request::*;
|
|
pub use role::*;
|
|
|
|
pub fn init(client: Arc<Client>, cx: &mut AppContext) {
|
|
settings::init(cx);
|
|
registry::init(client, cx);
|
|
}
|
|
|
|
pub trait LanguageModel: Send + Sync {
|
|
fn id(&self) -> LanguageModelId;
|
|
fn name(&self) -> LanguageModelName;
|
|
fn provider_id(&self) -> LanguageModelProviderId;
|
|
fn provider_name(&self) -> LanguageModelProviderName;
|
|
fn telemetry_id(&self) -> String;
|
|
|
|
fn max_token_count(&self) -> usize;
|
|
|
|
fn count_tokens(
|
|
&self,
|
|
request: LanguageModelRequest,
|
|
cx: &AppContext,
|
|
) -> BoxFuture<'static, Result<usize>>;
|
|
|
|
fn stream_completion(
|
|
&self,
|
|
request: LanguageModelRequest,
|
|
cx: &AsyncAppContext,
|
|
) -> BoxFuture<'static, Result<BoxStream<'static, Result<String>>>>;
|
|
}
|
|
|
|
pub trait LanguageModelProvider: 'static {
|
|
fn id(&self) -> LanguageModelProviderId;
|
|
fn name(&self) -> LanguageModelProviderName;
|
|
fn provided_models(&self, cx: &AppContext) -> Vec<Arc<dyn LanguageModel>>;
|
|
fn load_model(&self, _model: Arc<dyn LanguageModel>, _cx: &AppContext) {}
|
|
fn is_authenticated(&self, cx: &AppContext) -> bool;
|
|
fn authenticate(&self, cx: &AppContext) -> Task<Result<()>>;
|
|
fn authentication_prompt(&self, cx: &mut WindowContext) -> AnyView;
|
|
fn reset_credentials(&self, cx: &AppContext) -> Task<Result<()>>;
|
|
}
|
|
|
|
pub trait LanguageModelProviderState: 'static {
|
|
fn subscribe<T: 'static>(&self, cx: &mut gpui::ModelContext<T>) -> Option<gpui::Subscription>;
|
|
}
|
|
|
|
#[derive(Clone, Eq, PartialEq, Hash, Debug, Ord, PartialOrd)]
|
|
pub struct LanguageModelId(pub SharedString);
|
|
|
|
#[derive(Clone, Eq, PartialEq, Hash, Debug, Ord, PartialOrd)]
|
|
pub struct LanguageModelName(pub SharedString);
|
|
|
|
#[derive(Clone, Eq, PartialEq, Hash, Debug, Ord, PartialOrd)]
|
|
pub struct LanguageModelProviderId(pub SharedString);
|
|
|
|
#[derive(Clone, Eq, PartialEq, Hash, Debug, Ord, PartialOrd)]
|
|
pub struct LanguageModelProviderName(pub SharedString);
|
|
|
|
impl From<String> for LanguageModelId {
|
|
fn from(value: String) -> Self {
|
|
Self(SharedString::from(value))
|
|
}
|
|
}
|
|
|
|
impl From<String> for LanguageModelName {
|
|
fn from(value: String) -> Self {
|
|
Self(SharedString::from(value))
|
|
}
|
|
}
|
|
|
|
impl From<String> for LanguageModelProviderId {
|
|
fn from(value: String) -> Self {
|
|
Self(SharedString::from(value))
|
|
}
|
|
}
|
|
|
|
impl From<String> for LanguageModelProviderName {
|
|
fn from(value: String) -> Self {
|
|
Self(SharedString::from(value))
|
|
}
|
|
}
|