feat: 上下文管理

This commit is contained in:
李岩岩 2026-06-05 10:39:38 +08:00
parent 1accefc1da
commit bf8c9e1e12
3 changed files with 53 additions and 15 deletions

16
src/context.ts Normal file
View File

@ -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];
}
}

View File

@ -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);
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();

16
src/llm.ts Normal file
View File

@ -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!;
}