Skip to content

Move inbound translation from RoutingService to ConversationService.S… - #1401

Merged
iceljc merged 2 commits into
SciSharp:masterfrom
iceljc:bugfix/inbound-translation-placement
Aug 19, 2026
Merged

Move inbound translation from RoutingService to ConversationService.S…#1401
iceljc merged 2 commits into
SciSharp:masterfrom
iceljc:bugfix/inbound-translation-placement

Conversation

@iceljc

@iceljc iceljc commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

…endMessage

TranslateInboundMessage was called from both InstructDirect and InstructLoop, leaving the two routing paths to stay in sync by hand. SendMessage is the only caller of either, so run it once there, ahead of the conversation hook loop.

Running before the hooks means they now evaluate English content, which matters for RoutingConversationHook: it embeds message.Content and classifies intent against an English-trained model.

It also means a hook can overwrite Content after SecondaryContent has been set to the user's original text. Consumers render SecondaryContent in preference to Content, so a rate-limited or intent-templated reply would be replaced by the user's own message on its way back to them. Clear SecondaryContent when a hook rewrites Content, gated on whether translation actually ran so we only ever clear a value we set ourselves. This matches RoleDialogModel.From, which already drops SecondaryContent when it replaces Content.

…endMessage

TranslateInboundMessage was called from both InstructDirect and InstructLoop,
leaving the two routing paths to stay in sync by hand. SendMessage is the only
caller of either, so run it once there, ahead of the conversation hook loop.

Running before the hooks means they now evaluate English content, which matters
for RoutingConversationHook: it embeds message.Content and classifies intent
against an English-trained model.

It also means a hook can overwrite Content after SecondaryContent has been set
to the user's original text. Consumers render SecondaryContent in preference to
Content, so a rate-limited or intent-templated reply would be replaced by the
user's own message on its way back to them. Clear SecondaryContent when a hook
rewrites Content, gated on whether translation actually ran so we only ever
clear a value we set ourselves. This matches RoleDialogModel.From, which already
drops SecondaryContent when it replaces Content.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@qodo-code-review

Copy link
Copy Markdown
Contributor

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@iceljc
iceljc requested a review from yileicn August 19, 2026 02:08
@iceljc
iceljc merged commit f177b24 into SciSharp:master Aug 19, 2026
4 checks passed
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.

1 participant