
This PR adds rudimentary support for using tools to `assistant2`. There are currently no visual affordances for tool use. This is gated behind the `assistant-tool-use` feature flag. <img width="1079" alt="Screenshot 2024-11-25 at 7 21 31 PM" src="https://github.com/user-attachments/assets/64d6ca29-c592-4474-8e9d-c344f855bc63"> Release Notes: - N/A
60 lines
1.7 KiB
Rust
60 lines
1.7 KiB
Rust
use std::sync::Arc;
|
|
|
|
use anyhow::{anyhow, Result};
|
|
use assistant_tool::Tool;
|
|
use chrono::{Local, Utc};
|
|
use gpui::{Task, WeakView, WindowContext};
|
|
use schemars::JsonSchema;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum Timezone {
|
|
/// Use UTC for the datetime.
|
|
Utc,
|
|
/// Use local time for the datetime.
|
|
Local,
|
|
}
|
|
|
|
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
|
|
pub struct FileToolInput {
|
|
/// The timezone to use for the datetime.
|
|
timezone: Timezone,
|
|
}
|
|
|
|
pub struct NowTool;
|
|
|
|
impl Tool for NowTool {
|
|
fn name(&self) -> String {
|
|
"now".into()
|
|
}
|
|
|
|
fn description(&self) -> String {
|
|
"Returns the current datetime in RFC 3339 format. Only use this tool when the user specifically asks for it or the current task would benefit from knowing the current datetime.".into()
|
|
}
|
|
|
|
fn input_schema(&self) -> serde_json::Value {
|
|
let schema = schemars::schema_for!(FileToolInput);
|
|
serde_json::to_value(&schema).unwrap()
|
|
}
|
|
|
|
fn run(
|
|
self: Arc<Self>,
|
|
input: serde_json::Value,
|
|
_workspace: WeakView<workspace::Workspace>,
|
|
_cx: &mut WindowContext,
|
|
) -> Task<Result<String>> {
|
|
let input: FileToolInput = match serde_json::from_value(input) {
|
|
Ok(input) => input,
|
|
Err(err) => return Task::ready(Err(anyhow!(err))),
|
|
};
|
|
|
|
let now = match input.timezone {
|
|
Timezone::Utc => Utc::now().to_rfc3339(),
|
|
Timezone::Local => Local::now().to_rfc3339(),
|
|
};
|
|
let text = format!("The current datetime is {now}.");
|
|
|
|
Task::ready(Ok(text))
|
|
}
|
|
}
|