refactor: state rendering
This commit is contained in:
parent
e91a8a20a1
commit
efb44c4414
3 changed files with 16 additions and 16 deletions
4
index.ts
4
index.ts
|
|
@ -63,14 +63,12 @@ async function main() {
|
||||||
messages: convo.messages,
|
messages: convo.messages,
|
||||||
});
|
});
|
||||||
|
|
||||||
const start = Date.now();
|
|
||||||
await renderer.renderStream(fullStream);
|
await renderer.renderStream(fullStream);
|
||||||
const stop = Date.now();
|
|
||||||
|
|
||||||
convo.messages.push({ role: "assistant", content: await text });
|
convo.messages.push({ role: "assistant", content: await text });
|
||||||
await convo.save();
|
await convo.save();
|
||||||
|
|
||||||
await renderer.renderStats(totalUsage, start, stop);
|
await renderer.renderStats(totalUsage);
|
||||||
}
|
}
|
||||||
|
|
||||||
await main();
|
await main();
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@ export default class Renderer {
|
||||||
private memOk = true;
|
private memOk = true;
|
||||||
private buffer = "";
|
private buffer = "";
|
||||||
private unsafeIndex = 0;
|
private unsafeIndex = 0;
|
||||||
|
private start = 0;
|
||||||
|
private stop = 0;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private isPlain = false,
|
private isPlain = false,
|
||||||
|
|
@ -88,8 +90,6 @@ export default class Renderer {
|
||||||
async renderStream(stream: AsyncIterableStream<TextStreamPart<ToolSet>>) {
|
async renderStream(stream: AsyncIterableStream<TextStreamPart<ToolSet>>) {
|
||||||
this.resetCounts();
|
this.resetCounts();
|
||||||
|
|
||||||
let reasonStart = 0;
|
|
||||||
|
|
||||||
const spin = spinner({ withGuide: false, indicator: "timer" });
|
const spin = spinner({ withGuide: false, indicator: "timer" });
|
||||||
if (!this.isPlain) {
|
if (!this.isPlain) {
|
||||||
spin.start("Waiting for response");
|
spin.start("Waiting for response");
|
||||||
|
|
@ -98,7 +98,7 @@ export default class Renderer {
|
||||||
for await (const part of stream) {
|
for await (const part of stream) {
|
||||||
switch (part.type) {
|
switch (part.type) {
|
||||||
case "reasoning-start": {
|
case "reasoning-start": {
|
||||||
reasonStart = Date.now();
|
this.start = Date.now();
|
||||||
spin.clear();
|
spin.clear();
|
||||||
if (supportsColorStderr)
|
if (supportsColorStderr)
|
||||||
this.write(
|
this.write(
|
||||||
|
|
@ -121,7 +121,7 @@ export default class Renderer {
|
||||||
} else {
|
} else {
|
||||||
this.write("\n--- Done Thinking ---\n", process.stderr);
|
this.write("\n--- Done Thinking ---\n", process.stderr);
|
||||||
}
|
}
|
||||||
const time = (Date.now() - reasonStart) / 1000;
|
const time = (Date.now() - this.start) / 1000;
|
||||||
this.write(`Thought for ${time.toFixed(2)}s\n`, process.stderr);
|
this.write(`Thought for ${time.toFixed(2)}s\n`, process.stderr);
|
||||||
|
|
||||||
if (supportsColorStderr)
|
if (supportsColorStderr)
|
||||||
|
|
@ -133,6 +133,7 @@ export default class Renderer {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "text-start": {
|
case "text-start": {
|
||||||
|
if (this.start === 0) this.start = Date.now();
|
||||||
spin.clear();
|
spin.clear();
|
||||||
this.write("\n");
|
this.write("\n");
|
||||||
break;
|
break;
|
||||||
|
|
@ -146,6 +147,7 @@ export default class Renderer {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "text-end": {
|
case "text-end": {
|
||||||
|
this.stop = Date.now();
|
||||||
if (this.buffer) {
|
if (this.buffer) {
|
||||||
await this.render(this.buffer);
|
await this.render(this.buffer);
|
||||||
this.buffer = "";
|
this.buffer = "";
|
||||||
|
|
@ -160,16 +162,12 @@ export default class Renderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async renderStats(
|
async renderStats(usage: PromiseLike<LanguageModelUsage>) {
|
||||||
usage: PromiseLike<LanguageModelUsage>,
|
|
||||||
start: number,
|
|
||||||
stop: number,
|
|
||||||
) {
|
|
||||||
const { inputTokens, outputTokens } = await usage;
|
const { inputTokens, outputTokens } = await usage;
|
||||||
const context = (inputTokens ?? 0) / 1000;
|
const context = (inputTokens ?? 0) / 1000;
|
||||||
const output = (outputTokens ?? 0) / 1000;
|
const output = (outputTokens ?? 0) / 1000;
|
||||||
const time = (stop - start) / 1000;
|
const toks = (outputTokens ?? 0) / ((this.stop - this.start) / 1000);
|
||||||
const template = `Context: ${context.toFixed(1)}k, Output: ${output.toFixed(1)}k, Time: ${time.toFixed(2)}s\n`;
|
const template = `Context: ${context.toFixed(1)}k, Output: ${output.toFixed(1)}k, Toks: ${toks.toFixed(2)}/s\n`;
|
||||||
this.write(chalkStderr.dim(template), process.stderr);
|
this.write(chalkStderr.dim(template), process.stderr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ export async function renderMarkdown(
|
||||||
return `\`\`\`${chalk.blue(meta?.language ?? "")}\n${toRender}\`\`\`\n`;
|
return `\`\`\`${chalk.blue(meta?.language ?? "")}\n${toRender}\`\`\`\n`;
|
||||||
},
|
},
|
||||||
list: (children, { depth }) => {
|
list: (children, { depth }) => {
|
||||||
const trimmed = children.replaceAll("\n\n", "\n");
|
const trimmed = children.replace(/\n+/g, "\n");
|
||||||
return depth === 0 ? `${trimmed}\n` : `\n${trimmed}`;
|
return depth === 0 ? `${trimmed}\n` : `\n${trimmed}`;
|
||||||
},
|
},
|
||||||
listItem: (children, { index, depth, ordered, start, checked }) => {
|
listItem: (children, { index, depth, ordered, start, checked }) => {
|
||||||
|
|
@ -132,7 +132,11 @@ export async function renderMarkdown(
|
||||||
link: (children, { href }) =>
|
link: (children, { href }) =>
|
||||||
chalk.blueBright.underline(terminalLink(children, href)),
|
chalk.blueBright.underline(terminalLink(children, href)),
|
||||||
image: () => chalk.red("Images are unsupported (for now)\n"),
|
image: () => chalk.red("Images are unsupported (for now)\n"),
|
||||||
text: (children) => children,
|
text: (children) =>
|
||||||
|
children
|
||||||
|
.replaceAll("$\\rightarrow$", "->")
|
||||||
|
.replaceAll("$\\leftarrow$", "<-")
|
||||||
|
.replaceAll("$\\to$", "->"),
|
||||||
html: () => chalk.red("HTML is unsupported\n"),
|
html: () => chalk.red("HTML is unsupported\n"),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue