Skip to content

Customize the voice chat to do more#71

Open
simeneide wants to merge 2 commits intoremorses:mainfrom
simeneide:main
Open

Customize the voice chat to do more#71
simeneide wants to merge 2 commits intoremorses:mainfrom
simeneide:main

Conversation

@simeneide
Copy link
Copy Markdown

I customized the voice assistant to be able to do more than orchestrating the openagents sessions. Now it can check my emails, calendar etc etc too!

Users can add custom tools and system prompt extensions by creating
a voice-config.json file. Supports declarative shell-based tools with
parameter interpolation, an optional built-in runCommand tool, and
extra system prompt text appended to the default Kimaki prompt.
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e05d3a3f84

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +143 to +147
return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
const value = args[key]
if (value === undefined || value === null) return ''
return String(value)
})
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Escape interpolated arguments before executing shell tools

The command templating currently injects raw tool arguments directly into a shell string, so placeholders containing quotes or shell metacharacters can break out of the intended command and run arbitrary extra commands (for example a query value like foo' && rm -rf ~ # in a quoted template). This means a supposedly constrained custom tool can become equivalent to unrestricted shell execution even when enableRunCommand is off, and benign inputs with apostrophes can also fail unexpectedly.

Useful? React with 👍 / 👎.

Comment on lines +263 to +264
if (config.tools) {
for (const toolConfig of config.tools) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Guard non-array tools config before iterating

Because loadVoiceConfig() trusts parsed JSON shape, getVoiceCustomization() assumes config.tools is iterable and does a for...of directly; if a user writes an invalid but parseable config such as "tools": {} or "tools": "...", this throws at runtime and aborts voice setup instead of gracefully falling back to defaults. Since this file is intended for manual user editing, malformed shapes should be handled defensively.

Useful? React with 👍 / 👎.

@remorses
Copy link
Copy Markdown
Owner

remorses commented Mar 5, 2026

Really cool thank you! I was using this feature a lot with the previous Google Voice model too, then they removed it and replaced it with a much worse one. I really hope they release a new better model soon

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants