summaryrefslogtreecommitdiff
path: root/src/ollama_web/routes/chat.py
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-06-27 17:00:42 +0900
committertanaka takashi <isazaka@gmail.com>2026-06-27 17:00:42 +0900
commit6a362d58a952c2de0d3097b03b212388a6bc35e4 (patch)
tree0034d4e8dee2a1dcac2a1c2c1d71ad41c0e455ea /src/ollama_web/routes/chat.py
parentff09d6ed60998e31f8baf0846b9bdd31282979ed (diff)
一般設定の追加(UI/Ollama設定) settings.jsonに設定を保存 UIから言語設定対応 Ollama設定でシステムプロンプト, temperature, コンテキスト長などのパラメータを設定可能
Diffstat (limited to 'src/ollama_web/routes/chat.py')
-rw-r--r--src/ollama_web/routes/chat.py25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/ollama_web/routes/chat.py b/src/ollama_web/routes/chat.py
index 30794be..c8cbcff 100644
--- a/src/ollama_web/routes/chat.py
+++ b/src/ollama_web/routes/chat.py
@@ -20,6 +20,7 @@ from ..i18n import t
from ..mcp import collect_mcp_tools, make_mcp_executor
from ..prompts import get_prompt
from ..sessions import SessionStore, is_valid_id
+from ..settings_store import load_app_settings
from ..tools.fetch import pop_fetched_files
from ..tools.helper.image import resize_image
from ..tools.registry import ToolRegistry, default_registry
@@ -27,17 +28,18 @@ from ..tools.registry import ToolRegistry, default_registry
logger = logging.getLogger("ollama_web.chat")
-# System prompt injected when tools are enabled. Encourages the model to use
-# tools iteratively rather than firing many searches at once.
-_TOOL_SYSTEM_PROMPT = get_prompt("tool_system")
-
-
def _limit_text(text: str, limit: int) -> str:
if len(text) <= limit:
return text
return text[:limit] + "\n…[truncated]"
+def _compose_system_prompt(language: str, custom_prompt: str) -> str:
+ """Combine the localized built-in tool prompt with the user prompt."""
+ tool_prompt = get_prompt("tool_system", lang=language)
+ return f"{tool_prompt}\n\n{custom_prompt}" if custom_prompt else tool_prompt
+
+
def _parse_messages(raw: list[dict[str, Any]]) -> list[Message]:
"""Convert raw JSON message dicts into ``ollama.Message`` objects."""
out: list[Message] = []
@@ -153,6 +155,13 @@ async def _chat_event_stream(
"""Core chat loop yielding events. Exceptions are converted to SSE error events."""
model = payload.get("model") or request.app.state.settings.default_model
think = payload.get("think")
+ runtime_settings = request.app.state.settings
+ app_settings = load_app_settings(runtime_settings.data_dir, runtime_settings.language)
+ language = str(app_settings["ui"]["language"])
+ ollama_settings = app_settings["ollama"]
+ ollama_options = dict(ollama_settings["options"])
+ custom_prompt = str(ollama_settings["system_prompt"])
+ system_prompt = _compose_system_prompt(language, custom_prompt)
store: SessionStore = request.app.state.session_store
file_ids: list[str] = [
@@ -202,7 +211,7 @@ async def _chat_event_stream(
# are available. Avoid duplicate injection if the session already has
# a system message.
if not any(getattr(m, "role", None) == "system" for m in messages):
- messages.insert(0, Message(role="system", content=_TOOL_SYSTEM_PROMPT))
+ messages.insert(0, Message(role="system", content=system_prompt))
host = request.app.state.settings.ollama_host
@@ -238,7 +247,7 @@ async def _chat_event_stream(
async for event in llm.astream_chat_with_tools(
messages, model, think=think, host=host, registry=registry,
- capabilities=capabilities,
+ capabilities=capabilities, options=ollama_options, language=language,
):
if event.get("type") == "delta":
assistant_text = _limit_text(
@@ -255,7 +264,7 @@ async def _chat_event_stream(
# and re-renders in the chat pane.
assistant_text = (
f"[ERROR] {error_msg}\n\n"
- f"{t('errors.vision_model_required')}"
+ f"{t('errors.vision_model_required', lang=language)}"
)
finally: