Skip to content

Commit 7f97d05

Browse files
committed
Switch to /v1/chat/completions API for more robust inference
Made-with: Cursor
1 parent 6934454 commit 7f97d05

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

src/LiveLingo.Core/Engines/LlamaTranslationEngine.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,21 @@ public async Task<string> TranslateAsync(
4747
var tgtName = GetLanguageName(targetLanguage);
4848

4949
var endpoint = await _host.GetOrStartServerAsync(ct);
50-
var url = $"{endpoint}/completion";
50+
var url = $"{endpoint}/v1/chat/completions";
5151

5252
var systemPrompt = $"You are an expert translation engine. Your task is to translate the source text from {srcName} to {tgtName}.\n\nRules:\n1. Output ONLY the final {tgtName} translation.\n2. Do NOT output any {srcName} text.\n3. Do NOT output any explanations, conversational text, or notes.\n4. Do NOT use <think> tags or output any thought process.";
53-
var prompt = $"<|im_start|>system\n{systemPrompt}<|im_end|>\n<|im_start|>user\nTranslate the following {srcName} text to {tgtName}:\n\n<source>\n{text}\n</source><|im_end|>\n<|im_start|>assistant\n";
53+
var userPrompt = $"Translate the following {srcName} text to {tgtName}:\n\n<source>\n{text}\n</source>";
5454

55-
_logger.LogDebug("Translation prompt for {Src}→{Tgt}: {Prompt}", sourceLanguage, targetLanguage, prompt);
55+
_logger.LogDebug("Translation prompt for {Src}→{Tgt}: {Prompt}", sourceLanguage, targetLanguage, userPrompt);
5656

5757
var requestBody = new
5858
{
59-
prompt = prompt,
60-
n_predict = 512,
59+
messages = new[]
60+
{
61+
new { role = "system", content = systemPrompt },
62+
new { role = "user", content = userPrompt }
63+
},
64+
max_tokens = 512,
6165
temperature = 0.1f,
6266
top_p = 0.95f,
6367
stop = StopSequences,
@@ -69,7 +73,11 @@ public async Task<string> TranslateAsync(
6973

7074
var json = await response.Content.ReadAsStringAsync(ct);
7175
using var doc = JsonDocument.Parse(json);
72-
var result = doc.RootElement.GetProperty("content").GetString()?.Trim() ?? string.Empty;
76+
var result = doc.RootElement
77+
.GetProperty("choices")[0]
78+
.GetProperty("message")
79+
.GetProperty("content")
80+
.GetString()?.Trim() ?? string.Empty;
7381

7482
// Clean up <think> tags if the model still generated them
7583
if (result.Contains("</think>"))

src/LiveLingo.Core/Processing/QwenTextProcessor.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@ public async Task<string> ProcessAsync(string text, string language, Cancellatio
2727
try
2828
{
2929
var endpoint = await _host.GetOrStartServerAsync(ct);
30-
var url = $"{endpoint}/completion";
31-
32-
var prompt = $"<|im_start|>system\n{SystemPrompt} Do not use <think> tags.<|im_end|>\n<|im_start|>user\n{text}<|im_end|>\n<|im_start|>assistant\n";
30+
var url = $"{endpoint}/v1/chat/completions";
3331

3432
var requestBody = new
3533
{
36-
prompt = prompt,
37-
n_predict = 512,
34+
messages = new[]
35+
{
36+
new { role = "system", content = $"{SystemPrompt} Do not use <think> tags." },
37+
new { role = "user", content = text }
38+
},
39+
max_tokens = 512,
3840
temperature = 0.3f,
3941
top_p = 0.9f,
4042
stop = new[] { "</s>", "<|im_end|>", "</think>" },
@@ -46,7 +48,11 @@ public async Task<string> ProcessAsync(string text, string language, Cancellatio
4648

4749
var json = await response.Content.ReadAsStringAsync(ct);
4850
using var doc = JsonDocument.Parse(json);
49-
var result = doc.RootElement.GetProperty("content").GetString()?.Trim() ?? string.Empty;
51+
var result = doc.RootElement
52+
.GetProperty("choices")[0]
53+
.GetProperty("message")
54+
.GetProperty("content")
55+
.GetString()?.Trim() ?? string.Empty;
5056

5157
// Clean up <think> tags if the model still generated them
5258
if (result.Contains("</think>"))

0 commit comments

Comments
 (0)