mirror of
https://github.com/we-promise/sure.git
synced 2026-04-07 22:34:47 +00:00
* Implement support for generic OpenAI api - Implements support to route requests to any openAI capable provider ( Deepsek, Qwen, VLLM, LM Studio, Ollama ). - Keeps support for pure OpenAI and uses the new better responses api - Uses the /chat/completions api for the generic providers - If uri_base is not set, uses default implementation. * Fix json handling and indentation * Fix linter error indent * Fix tests to set env vars * Fix updating settings * Change to prefix checking for OAI models * FIX check model if custom uri is set * Change chat to sync calls Some local models don't support streaming. Revert to sync calls for generic OAI api * Fix tests * Fix tests * Fix for gpt5 message extraction - Finds the message output by filtering for "type" == "message" instead of assuming it's at index 0 - Safely extracts the text using safe navigation operators (&.) - Raises a clear error if no message content is found - Parses the JSON as before * Add more langfuse logging - Add Langfuse to auto categorizer and merchant detector - Fix monitoring on streaming chat responses - Add Langfuse traces also for model errors now * Update app/models/provider/openai.rb Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: soky srm <sokysrm@gmail.com> * handle nil function results explicitly * Exposing some config vars. * Linter and nitpick comments * Drop back to `gpt-4.1` as default for now * Linter * Fix for strict tool schema in Gemini - This fixes tool calling in Gemini OpenAI api - Fix for getTransactions function, page size is not used. --------- Signed-off-by: soky srm <sokysrm@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Juan José Mata <juanjo.mata@gmail.com>
75 lines
1.7 KiB
Ruby
75 lines
1.7 KiB
Ruby
require "application_system_test_case"
|
|
|
|
class ChatsTest < ApplicationSystemTestCase
|
|
setup do
|
|
@user = users(:family_admin)
|
|
login_as(@user)
|
|
end
|
|
|
|
test "sidebar shows consent if ai is disabled for user" do
|
|
@user.update!(ai_enabled: false)
|
|
|
|
visit root_path
|
|
|
|
within "#chat-container" do
|
|
assert_selector "h3", text: "Enable AI Chats"
|
|
end
|
|
end
|
|
|
|
test "sidebar shows index when enabled and chats are empty" do
|
|
with_env_overrides OPENAI_ACCESS_TOKEN: "test-token" do
|
|
@user.update!(ai_enabled: true)
|
|
@user.chats.destroy_all
|
|
|
|
visit root_url
|
|
|
|
within "#chat-container" do
|
|
assert_selector "h1", text: "Chats"
|
|
end
|
|
end
|
|
end
|
|
|
|
test "sidebar shows last viewed chat" do
|
|
with_env_overrides OPENAI_ACCESS_TOKEN: "test-token" do
|
|
@user.update!(ai_enabled: true)
|
|
|
|
visit root_url
|
|
|
|
click_on @user.chats.first.title
|
|
|
|
# Page refresh
|
|
visit root_url
|
|
|
|
# After page refresh, we're still on the last chat we were viewing
|
|
within "#chat-container" do
|
|
assert_selector "h1", text: @user.chats.first.title
|
|
end
|
|
end
|
|
end
|
|
|
|
test "create chat and navigate chats sidebar" do
|
|
with_env_overrides OPENAI_ACCESS_TOKEN: "test-token" do
|
|
@user.chats.destroy_all
|
|
|
|
visit root_url
|
|
|
|
Chat.any_instance.expects(:ask_assistant_later).once
|
|
|
|
within "#chat-form" do
|
|
fill_in "chat[content]", with: "Can you help with my finances?"
|
|
find("button[type='submit']").click
|
|
end
|
|
|
|
assert_text "Can you help with my finances?"
|
|
|
|
find("#chat-nav-back").click
|
|
|
|
assert_selector "h1", text: "Chats"
|
|
|
|
click_on @user.chats.reload.first.title
|
|
|
|
assert_text "Can you help with my finances?"
|
|
end
|
|
end
|
|
end
|