Skip to content

Commit 294dab7

Browse files
committed
Add syntax highlighting
1 parent 6799070 commit 294dab7

File tree

5 files changed

+53
-9
lines changed

5 files changed

+53
-9
lines changed

code-helper/client/package-lock.json

Lines changed: 11 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

code-helper/client/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
"dependencies": {
1212
"@pipecat-ai/client-js": "file:../../../pipecat-client-web/client-js",
1313
"@pipecat-ai/daily-transport": "file:../../../pipecat-client-web-transports/transports/daily",
14-
"@pipecat-ai/small-webrtc-transport": "file:../../../pipecat-client-web-transports/transports/small-webrtc-transport"
14+
"@pipecat-ai/small-webrtc-transport": "file:../../../pipecat-client-web-transports/transports/small-webrtc-transport",
15+
"highlight.js": "^11.11.1"
1516
},
1617
"devDependencies": {
1718
"vite": "^7.1.7"

code-helper/client/src/app.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ import {
66
createTransport,
77
} from './config';
88

9+
import hljs from 'highlight.js/lib/core';
10+
import javascript from 'highlight.js/lib/languages/javascript';
11+
import python from 'highlight.js/lib/languages/python';
12+
hljs.registerLanguage('javascript', javascript);
13+
hljs.registerLanguage('python', python);
14+
915
class VoiceChatClient {
1016
constructor() {
1117
this.client = null;
@@ -276,8 +282,18 @@ class VoiceChatClient {
276282
roleSpan.className = 'role';
277283
roleSpan.textContent = role === 'user' ? 'You' : 'Bot';
278284

279-
const textDiv = document.createElement('div');
280-
textDiv.textContent = text;
285+
let textDiv;
286+
if (type !== 'code') {
287+
textDiv = document.createElement('div');
288+
textDiv.textContent = text;
289+
} else {
290+
textDiv = document.createElement('pre');
291+
let codeDiv = document.createElement('code');
292+
codeDiv.textContent = text;
293+
textDiv.appendChild(codeDiv);
294+
textDiv.className = 'language-html';
295+
hljs.highlightElement(textDiv);
296+
}
281297

282298
messageDiv.appendChild(roleSpan);
283299
messageDiv.appendChild(textDiv);

code-helper/client/src/style.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ body {
149149
}
150150

151151
.conversation-message.code {
152-
font-family: 'Courier New', monospace;
152+
/* font-family: 'Courier New', monospace; */
153153
background-color: #374151;
154154
padding: 0.5rem;
155155
border-radius: 0.25rem;

code-helper/server/bot.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from pipecat.pipeline.runner import PipelineRunner
3333
from pipecat.pipeline.task import PipelineParams, PipelineTask
3434
from pipecat.processors.aggregators.llm_context import LLMContext
35+
from pipecat.processors.aggregators.llm_response import LLMAssistantAggregatorParams
3536
from pipecat.processors.aggregators.llm_response_universal import LLMContextAggregatorPair
3637
from pipecat.processors.frameworks.rtvi import RTVIObserver, RTVIProcessor
3738
from pipecat.processors.transcript_processor import TranscriptProcessor
@@ -57,8 +58,8 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
5758

5859
# Text-to-Speech service
5960
# Text aggregator to handle code snippets
60-
aggregator = PatternPairAggregator()
61-
aggregator.add_pattern_pair(
61+
tts_aggregator = PatternPairAggregator()
62+
tts_aggregator.add_pattern_pair(
6263
pattern_id="code",
6364
start_pattern="<code>",
6465
end_pattern="</code>",
@@ -68,7 +69,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
6869
tts = ElevenLabsTTSService(
6970
api_key=os.getenv("ELEVENLABS_API_KEY"),
7071
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
71-
text_aggregator=aggregator,
72+
text_aggregator=tts_aggregator,
7273
skip_aggregator_types=["code"],
7374
)
7475

@@ -82,8 +83,21 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
8283
},
8384
]
8485

86+
# LLM aggregator context
87+
# Text aggregator to handle code snippets when the tts is skipped
88+
llm_aggregator = PatternPairAggregator()
89+
llm_aggregator.add_pattern_pair(
90+
pattern_id="code",
91+
start_pattern="<code>",
92+
end_pattern="</code>",
93+
type="code",
94+
action=MatchAction.AGGREGATE,
95+
)
8596
context = LLMContext(messages)
86-
context_aggregator = LLMContextAggregatorPair(context)
97+
context_aggregator = LLMContextAggregatorPair(
98+
context=context,
99+
assistant_params=LLMAssistantAggregatorParams(llm_text_aggregator=llm_aggregator),
100+
)
87101

88102
# Transcription processor
89103
transcript_processor = TranscriptProcessor()
@@ -142,6 +156,9 @@ async def on_transcript_update(processor: TranscriptProcessor, frame: Transcript
142156
@rtvi.event_handler("on_client_message")
143157
async def on_message(rtvi, msg):
144158
print("RTVI junk message:", msg.type, msg.data)
159+
if msg.type == "get_context":
160+
context = context_aggregator.assistant().messages
161+
print(f"context: {context}")
145162

146163
runner = PipelineRunner(handle_sigint=runner_args.handle_sigint)
147164

0 commit comments

Comments
 (0)