pi-voice-input 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,16 +23,18 @@ const CONFIG_PATH = path.join(homedir(), ".pi", "agent", "voice-input.config.jso
23
23
  const VOLC_API_KEY_URL = "https://console.volcengine.com/speech/new/setting/apikeys?projectName=default";
24
24
  const DEFAULT_SHORTCUT = Key.ctrlShift("r");
25
25
  const DEFAULT_POSTPROCESS_MODEL = "deepseek/deepseek-v4-flash";
26
- const POSTPROCESS_SYSTEM_PROMPT = `你是 pi 语音输入插件的语音识别后处理器。你的唯一任务是把原始 ASR 文本改写为可直接提交给编码智能体的用户指令。
26
+ const POSTPROCESS_SYSTEM_PROMPT = `你是 pi 语音输入插件的语音识别后处理器。你的唯一任务是润色原始 ASR 文本,使其成为可直接提交给编码智能体的用户指令。
27
27
 
28
28
  规则:
29
- - 只输出优化后的用户指令正文,不要输出解释、标题、前后缀、引号、代码围栏或寒暄。
29
+ - 只输出润色后的用户指令正文,不要输出解释、标题、前后缀、引号、代码围栏或寒暄。
30
+ - 绝对不要回答、执行或解决用户语音中提出的问题;即使原始语音是问题,也只能把这个问题本身整理成清晰文本,不要给出答案、方案、代码或结论。
31
+ - 以忠实保留用户信息为最高优先级。不要一味概括、压缩或简述;不要删除条件、约束、例子、数值、文件名、错误信息、多个请求、前后顺序或语气重点。
30
32
  - 结合上下文理解省略指代、当前任务、文件/项目名称和用户意图;上下文仅用于理解,不要重复上下文内容,除非原始语音明确要求引用或修改它。
31
33
  - 修正明显的语音识别错误、同音/近音错误、断句和标点错误;保留代码标识符、命令、路径、URL、模型名、包名和专有名词。
32
34
  - 如果用户口误后自我更正(例如“不是……是……”“不对……”“算了改成……”),只保留更正后的正确指令,删除错误说法和更正过程。
33
- - 让结果完整、符合逻辑、指令明确、有指导性;必要时拆成条目或步骤。
35
+ - 让结果完整、符合逻辑、指令明确、有指导性;必要时拆成条目或步骤,但不得丢失原始信息。
34
36
  - 不要凭空添加原始语音没有表达的新需求;不确定时保留原意并用更清晰的措辞表达。
35
- - 输出语言通常与原始语音一致。`;
37
+ - 输出语言必须跟随用户原始语音的主要语言,而不是上下文语言;不要因为上下文是中文/英文就把用户语音翻译成上下文语言。`;
36
38
 
37
39
  const MSG_TYPE_CLIENT_FULL_REQUEST = 0b0001;
38
40
  const MSG_TYPE_CLIENT_AUDIO_ONLY_REQUEST = 0b0010;
@@ -816,9 +818,11 @@ function buildPostprocessPrompt(ctx: ExtensionContext, rawText: string, config:
816
818
  const sessionContext = getRecentSessionContext(ctx, Math.ceil(contextBudget / 2));
817
819
 
818
820
  return [
819
- "请根据上下文优化下面的原始语音识别结果。",
820
- "如果上下文为空,直接依据原始文本优化。",
821
- "不要重复上下文本身;只输出原始语音对应的最终用户指令。",
821
+ "请根据上下文只润色下面的原始语音识别结果。",
822
+ "如果上下文为空,直接依据原始文本润色。",
823
+ "不要回答原始语音里的问题,也不要执行其中的请求;只输出原始语音对应的最终用户指令文本。",
824
+ "输出语言必须跟随原始语音的主要语言,不要跟随上下文语言,也不要翻译成上下文语言。",
825
+ "务必忠实保留原始语音中的信息和细节,不要为了简洁而概括、压缩或删减。",
822
826
  "",
823
827
  "--- 上下文:当前编辑器已有内容 ---",
824
828
  editorContext || "(空)",
@@ -876,12 +880,10 @@ async function postprocessTranscript(ctx: ExtensionContext, rawText: string, con
876
880
  return polished || rawText;
877
881
  }
878
882
 
879
- function appendToEditor(ctx: ExtensionContext, text: string) {
883
+ function insertIntoEditor(ctx: ExtensionContext, text: string) {
880
884
  const trimmed = text.trim();
881
885
  if (!trimmed) return;
882
- const current = ctx.ui.getEditorText();
883
- const separator = current.trim().length > 0 && !current.endsWith("\n") ? "\n" : "";
884
- ctx.ui.setEditorText(`${current}${separator}${trimmed}`);
886
+ ctx.ui.pasteToEditor(trimmed);
885
887
  }
886
888
 
887
889
  async function isRecording(config: VoiceConfig): Promise<boolean> {
@@ -989,7 +991,7 @@ async function stopRecording(ctx: ExtensionContext, transcribe = true) {
989
991
  }
990
992
 
991
993
  ctx.ui.setStatus("voice-input", undefined);
992
- appendToEditor(ctx, finalText);
994
+ insertIntoEditor(ctx, finalText);
993
995
  ctx.ui.notify(
994
996
  `Voice text inserted. audio=${(durationMs / 1000).toFixed(2)}s decode=${decodeMs}ms asr=${result.timings.totalMs}ms${
995
997
  config.postprocessEnabled ? ` postprocess=${postprocessMs}ms${postprocessUsed ? " polished" : ""}` : ""
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-voice-input",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "provider-extensible voice input extension for pi",
5
5
  "type": "module",
6
6
  "keywords": [