client.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import * as readline from "readline";
  2. const model = "llama3";
  3. type Message = {
  4. role: "assistant" | "user" | "system";
  5. content: string;
  6. }
  7. const messages: Message[] = [{
  8. role: "system",
  9. content: "You are a helpful AI agent."
  10. }]
  11. const rl = readline.createInterface({
  12. input: process.stdin,
  13. output: process.stdout
  14. })
  15. async function chat(messages: Message[]): Promise<Message> {
  16. const body = {
  17. model: model,
  18. messages: messages
  19. }
  20. const response = await fetch("http://localhost:11434/api/chat", {
  21. method: "POST",
  22. body: JSON.stringify(body)
  23. })
  24. const reader = response.body?.getReader()
  25. if (!reader) {
  26. throw new Error("Failed to read response body")
  27. }
  28. let content = ""
  29. while (true) {
  30. const { done, value } = await reader.read()
  31. if (done) {
  32. break;
  33. }
  34. const rawjson = new TextDecoder().decode(value);
  35. const json = JSON.parse(rawjson)
  36. if (json.done === false) {
  37. process.stdout.write(json.message.content);
  38. content += json.message.content
  39. }
  40. }
  41. return { role: "assistant", content: content };
  42. }
  43. async function askQuestion(): Promise<void> {
  44. return new Promise<void>((resolve) => {
  45. rl.question("\n\nAsk a question: (press enter alone to quit)\n\n", async (user_input) => {
  46. if (user_input.trim() === "") {
  47. rl.close();
  48. console.log("Thankyou. Goodbye.\n")
  49. console.log("=======\nHere is the message history that was used in this conversation.\n=======\n")
  50. messages.forEach(message => {
  51. console.log(message)
  52. })
  53. resolve();
  54. } else {
  55. console.log();
  56. messages.push({ role: "user", content: user_input });
  57. messages.push(await chat(messages));
  58. await askQuestion(); // Ask the next question
  59. }
  60. });
  61. });
  62. }
  63. async function main() {
  64. await askQuestion();
  65. }
  66. main();