diff --git a/src/context.ts b/src/context.ts new file mode 100644 index 0000000..9610f4f --- /dev/null +++ b/src/context.ts @@ -0,0 +1,16 @@ +type Message = { role: 'system' | 'user' | 'assistant'; content: string }; + +export class ContextManager { + private messages: Message[] = []; + + constructor() { + } + + add(message: Message) { + this.messages.push(message); + } + + getMessages(): Message[] { + return [...this.messages]; + } +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index f40fca4..f54a402 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,19 +1,25 @@ -import OpenAI from 'openai'; -import 'dotenv/config'; +import { ContextManager } from './context.js'; +import { chat } from './llm.js'; +import * as readline from 'node:readline/promises'; -const client = new OpenAI({ - apiKey: process.env.OPENAI_API_KEY, - baseURL: process.env.OPENAI_BASE_URL, +const context = new ContextManager(); +context.add({ role: 'system', content: '你是一个直爽的小助手,回答尽量简洁。' }); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, }); -const response = await client.chat.completions.create({ - model: 'deepseek-v4-pro', - messages: [ - { role: 'system', content: '你是一个直爽的编程助手,回答尽量简洁。' }, - { role: 'user', content: '什么是闭包?用一句话解释。' }, - ], - temperature: 0.7, -}); +console.log('Agent已启动,输入 "exit" 退出。\n'); -const reply = response.choices[0]?.message?.content; -console.log(reply); \ No newline at end of file +while (true) { + const userInput = await rl.question('我: '); + if (userInput.toLowerCase() === 'exit') break; + + context.add({ role: 'user', content: userInput }); + const reply = await chat(context.getMessages()); + console.log('助手:', reply.content); + context.add({ role: 'assistant', content: reply.content! }); +} + +rl.close(); \ No newline at end of file diff --git a/src/llm.ts b/src/llm.ts new file mode 100644 index 0000000..bc444df --- /dev/null +++ b/src/llm.ts @@ -0,0 +1,16 @@ +import OpenAI from 'openai'; +import 'dotenv/config'; + +const client = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY, + baseURL: process.env.OPENAI_BASE_URL, +}); + +export async function chat(messages: { role: string; content: string }[]) { + const response = await client.chat.completions.create({ + model: 'deepseek-v4-pro', + messages: messages as any, + temperature: 0.7, + }); + return response.choices[0]!.message!; +} \ No newline at end of file