summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2023-03-05 07:52:36 +0800
committerGitHub <noreply@github.com>2023-03-05 07:52:36 +0800
commit598c31c3d946e8772c4d1bc450b5d2b1bdf587c0 (patch)
treedf12513b90f3b559b25f93a9f9d26f54e58d1118
parent822f0eed9429f71524e739352da3f76d604071d5 (diff)
downloadaichat-598c31c3d946e8772c4d1bc450b5d2b1bdf587c0.tar.gz
refactor: optimize role prompt (#13)
-rw-r--r--README.md1
-rw-r--r--src/client.rs32
-rw-r--r--src/repl.rs8
3 files changed, 26 insertions, 15 deletions
diff --git a/README.md b/README.md
index e7d418b..aeb9e28 100644
--- a/README.md
+++ b/README.md
@@ -76,7 +76,6 @@ We can predefine a batch of roles in `roles.yaml`. For example, we define a emoj
I want you to translate the sentences I wrote into emojis. I will write the sentence, and you will express it with emojis.
I just want you to express it with emojis. I don't want you to reply with anything but emoji.
When I need to tell you something in English, I will do it by wrapping it in curly brackets like {like this}.
- My first sentence is:
```
Let ChatGPT answer questions in the role of a emoji translator
diff --git a/src/client.rs b/src/client.rs
index 1f42346..3fe75dd 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -81,11 +81,10 @@ impl ChatGptClient {
}
async fn acquire_inner(&self, content: &str, prompt: Option<String>) -> Result<String> {
- let content = combine(content, prompt);
if self.config.dry_run {
- return Ok(content);
+ return Ok(combine(content, prompt));
}
- let builder = self.request_builder(&content, false);
+ let builder = self.request_builder(content, prompt, false);
let data: Value = builder.send().await?.json().await?;
@@ -102,12 +101,11 @@ impl ChatGptClient {
prompt: Option<String>,
receiver: &mut ReplyReceiver,
) -> Result<()> {
- let content = combine(content, prompt);
if self.config.dry_run {
- receiver.text(&content);
+ receiver.text(&combine(content, prompt));
return Ok(());
}
- let builder = self.request_builder(&content, true);
+ let builder = self.request_builder(content, prompt, true);
let mut stream = builder.send().await?.bytes_stream().eventsource();
let mut virgin = true;
while let Some(part) = stream.next().await {
@@ -135,10 +133,25 @@ impl ChatGptClient {
Ok(())
}
- fn request_builder(&self, content: &str, stream: bool) -> RequestBuilder {
+ fn request_builder(
+ &self,
+ content: &str,
+ prompt: Option<String>,
+ stream: bool,
+ ) -> RequestBuilder {
+ let user_message = json!({ "role": "user", "content": content });
+ let messages = match prompt {
+ Some(prompt) => {
+ let system_message = json!({ "role": "system", "content": prompt.trim() });
+ json!([system_message, user_message])
+ }
+ None => {
+ json!([user_message])
+ }
+ };
let mut body = json!({
"model": MODEL,
- "messages": [{"role": "user", "content": content}],
+ "messages": messages,
});
if let Some(v) = self.config.temperature {
@@ -160,11 +173,10 @@ impl ChatGptClient {
fn combine(content: &str, prompt: Option<String>) -> String {
match prompt {
- Some(v) => format!("{v} {content}"),
+ Some(prompt) => format!("{}\n{content}", prompt.trim()),
None => content.to_string(),
}
}
-
fn init_runtime() -> Result<Runtime> {
tokio::runtime::Builder::new_current_thread()
.enable_all()
diff --git a/src/repl.rs b/src/repl.rs
index 164d746..17617f8 100644
--- a/src/repl.rs
+++ b/src/repl.rs
@@ -134,7 +134,6 @@ impl Repl {
},
".clear-role" => {
handler.handle(ReplCmd::UnsetRole)?;
- dump("", 1);
}
".editor" => {
dump(
@@ -156,7 +155,6 @@ impl Repl {
}
".info" => {
handler.handle(ReplCmd::Info)?;
- dump("", 1);
}
_ => dump_unknown_command(),
}
@@ -295,8 +293,9 @@ impl ReplCmdHandler {
}
ReplCmd::SetRole(name) => match self.config.find_role(&name) {
Some(role) => {
+ let output = format!("{}>> {}", role.name, role.prompt.trim());
self.state.borrow_mut().role = Some(role);
- dump("", 1);
+ dump(output, 2);
}
None => {
dump("Unknown role", 2);
@@ -304,6 +303,7 @@ impl ReplCmdHandler {
},
ReplCmd::UnsetRole => {
self.state.borrow_mut().role = None;
+ dump("Clear the current selected role", 1);
}
ReplCmd::Info => {
let state = self.state.borrow();
@@ -338,7 +338,7 @@ impl ReplCmdHandler {
for (name, value) in items {
info.push_str(&format!("{name:<20}{value}\n"));
}
- dump(info, 0);
+ dump(info, 1);
}
}
Ok(())