analyse: thread user.lang into the system prompt
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
e4982cdc04
commit
d318039ad5
3 changed files with 89 additions and 4 deletions
|
|
@ -176,3 +176,77 @@ async def test_log_translation_fanout_per_language_failure_isolated(tmp_path, mo
|
|||
async with factory() as session:
|
||||
rows = (await session.execute(select(StrategicLogTranslation))).scalars().all()
|
||||
assert rows == []
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_analyse_threads_lang_into_system_prompt(tmp_path, monkeypatch):
|
||||
"""When lang='it', the system prompt sent to call_llm contains
|
||||
'Respond in Italian.' — the LLM does the rest."""
|
||||
from app.services import portfolio_analysis as pa
|
||||
from app.services.openrouter import LogResult
|
||||
|
||||
captured = {}
|
||||
|
||||
async def _fake_call_llm(client, messages, **kw):
|
||||
captured["messages"] = messages
|
||||
return LogResult(
|
||||
content="Analisi del portafoglio in italiano.",
|
||||
model="m", prompt_tokens=400, completion_tokens=100, cost_usd=0.0001,
|
||||
)
|
||||
monkeypatch.setattr(pa, "call_llm", _fake_call_llm)
|
||||
|
||||
_, factory, setup = _build_session_factory(tmp_path)
|
||||
await setup()
|
||||
|
||||
payload = {
|
||||
"positions": [{"yahoo_ticker": "AAPL", "qty": 10, "avg_cost": 150.0,
|
||||
"currency": "USD", "name": "Apple Inc"}],
|
||||
"prices": {"AAPL": {"p": 172.4, "c": "USD"}},
|
||||
"fx": {"USD": 1.0},
|
||||
"base_currency": "USD",
|
||||
"tone": "INTERMEDIATE",
|
||||
"analysis": "NORMAL",
|
||||
"lang": "it",
|
||||
}
|
||||
req = pa.parse_request(payload)
|
||||
assert req.lang == "it"
|
||||
|
||||
async with factory() as session:
|
||||
await pa.analyse(session, req)
|
||||
system = next(m["content"] for m in captured["messages"] if m["role"] == "system")
|
||||
assert "Respond in Italian" in system
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_analyse_no_clause_when_lang_is_en(tmp_path, monkeypatch):
|
||||
from app.services import portfolio_analysis as pa
|
||||
from app.services.openrouter import LogResult
|
||||
|
||||
captured = {}
|
||||
|
||||
async def _fake_call_llm(client, messages, **kw):
|
||||
captured["messages"] = messages
|
||||
return LogResult(
|
||||
content="Portfolio analysis in English.",
|
||||
model="m", prompt_tokens=400, completion_tokens=100, cost_usd=0.0001,
|
||||
)
|
||||
monkeypatch.setattr(pa, "call_llm", _fake_call_llm)
|
||||
|
||||
_, factory, setup = _build_session_factory(tmp_path)
|
||||
await setup()
|
||||
|
||||
payload = {
|
||||
"positions": [{"yahoo_ticker": "AAPL", "qty": 10, "avg_cost": 150.0,
|
||||
"currency": "USD", "name": "Apple Inc"}],
|
||||
"prices": {"AAPL": {"p": 172.4, "c": "USD"}},
|
||||
"fx": {"USD": 1.0},
|
||||
"base_currency": "USD",
|
||||
"tone": "INTERMEDIATE",
|
||||
"analysis": "NORMAL",
|
||||
"lang": "en",
|
||||
}
|
||||
req = pa.parse_request(payload)
|
||||
async with factory() as session:
|
||||
await pa.analyse(session, req)
|
||||
system = next(m["content"] for m in captured["messages"] if m["role"] == "system")
|
||||
assert "Respond in" not in system
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue