mirror of
https://github.com/we-promise/sure.git
synced 2026-04-08 23:04:49 +00:00
* Add SearchFamilyImportedFiles assistant function with vector store support Implement per-Family document search using OpenAI vector stores, allowing the AI assistant to search through uploaded financial documents (tax returns, statements, contracts, etc.). The architecture is modular with a provider- agnostic VectorStoreConcept interface so other RAG backends can be added. Key components: - Assistant::Function::SearchFamilyImportedFiles - tool callable from any LLM - Provider::VectorStoreConcept - abstract vector store interface - Provider::Openai vector store methods (create, upload, search, delete) - Family::VectorSearchable concern with document management - FamilyDocument model for tracking uploaded files - Migration adding vector_store_id to families and family_documents table https://claude.ai/code/session_01TSkKc7a9Yu2ugm1RvSf4dh * Extract VectorStore adapter layer for swappable backends Replace the Provider::VectorStoreConcept mixin with a standalone adapter architecture under VectorStore::. This cleanly separates vector store concerns from the LLM provider and makes it trivial to swap backends. Components: - VectorStore::Base — abstract interface (create/delete/upload/remove/search) - VectorStore::Openai — uses ruby-openai gem's native vector_stores.search - VectorStore::Pgvector — skeleton for local pgvector + embedding model - VectorStore::Qdrant — skeleton for Qdrant vector DB - VectorStore::Registry — resolves adapter from VECTOR_STORE_PROVIDER env - VectorStore::Response — success/failure wrapper (like Provider::Response) Consumers updated to go through VectorStore.adapter: - Family::VectorSearchable - Assistant::Function::SearchFamilyImportedFiles - FamilyDocument Removed: Provider::VectorStoreConcept, vector store methods from Provider::Openai https://claude.ai/code/session_01TSkKc7a9Yu2ugm1RvSf4dh * Add Vector Store configuration docs to ai.md Documents how to configure the document search feature, covering all three supported backends (OpenAI, pgvector, Qdrant), environment variables, Docker Compose examples, supported file types, and privacy considerations. https://claude.ai/code/session_01TSkKc7a9Yu2ugm1RvSf4dh * No need to specify `imported` in code * Missed a couple more places * Tiny reordering for the human OCD * Update app/models/assistant/function/search_family_files.rb Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: Juan José Mata <jjmata@jjmata.com> * PR comments * More PR comments --------- Signed-off-by: Juan José Mata <jjmata@jjmata.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
124 lines
5.1 KiB
Ruby
124 lines
5.1 KiB
Ruby
module Assistant::Configurable
|
|
extend ActiveSupport::Concern
|
|
|
|
class_methods do
|
|
def config_for(chat)
|
|
preferred_currency = Money::Currency.new(chat.user.family.currency)
|
|
preferred_date_format = chat.user.family.date_format
|
|
|
|
if chat.user.ui_layout_intro?
|
|
{
|
|
instructions: intro_instructions(preferred_currency, preferred_date_format),
|
|
functions: []
|
|
}
|
|
else
|
|
{
|
|
instructions: default_instructions(preferred_currency, preferred_date_format),
|
|
functions: default_functions
|
|
}
|
|
end
|
|
end
|
|
|
|
private
|
|
def intro_instructions(preferred_currency, preferred_date_format)
|
|
<<~PROMPT
|
|
## Your identity
|
|
|
|
You are Sure, a warm and curious financial guide welcoming a new household to the Sure personal finance application.
|
|
|
|
## Your purpose
|
|
|
|
Host an introductory conversation that helps you understand the user's stage of life, financial responsibilities, and near-term priorities so future guidance feels personal and relevant.
|
|
|
|
## Conversation approach
|
|
|
|
- Ask one thoughtful question at a time and tailor follow-ups based on what the user shares.
|
|
- Reflect key details back to the user to confirm understanding.
|
|
- Keep responses concise, friendly, and free of filler phrases.
|
|
- If the user requests detailed analytics, let them know the dashboard experience will cover it soon and guide them back to sharing context.
|
|
|
|
## Information to uncover
|
|
|
|
- Household composition and stage of life milestones (education, career, retirement, dependents, caregiving, etc.).
|
|
- Primary financial goals, concerns, and timelines.
|
|
- Notable upcoming events or obligations.
|
|
|
|
## Formatting guidelines
|
|
|
|
- Use markdown for any lists or emphasis.
|
|
- When money or timeframes are discussed, format currency with #{preferred_currency.symbol} (#{preferred_currency.iso_code}) and dates using #{preferred_date_format}.
|
|
- Do not call external tools or functions.
|
|
PROMPT
|
|
end
|
|
|
|
def default_functions
|
|
[
|
|
Assistant::Function::GetTransactions,
|
|
Assistant::Function::GetAccounts,
|
|
Assistant::Function::GetHoldings,
|
|
Assistant::Function::GetBalanceSheet,
|
|
Assistant::Function::GetIncomeStatement,
|
|
Assistant::Function::ImportBankStatement,
|
|
Assistant::Function::SearchFamilyFiles
|
|
]
|
|
end
|
|
|
|
def default_instructions(preferred_currency, preferred_date_format)
|
|
<<~PROMPT
|
|
## Your identity
|
|
|
|
You are a friendly financial assistant for an open source personal finance application called "Sure", which is short for "Sure Finances".
|
|
|
|
## Your purpose
|
|
|
|
You help users understand their financial data by answering questions about their accounts, transactions, income, expenses, net worth, forecasting and more.
|
|
|
|
## Your rules
|
|
|
|
Follow all rules below at all times.
|
|
|
|
### General rules
|
|
|
|
- Provide ONLY the most important numbers and insights
|
|
- Eliminate all unnecessary words and context
|
|
- Ask follow-up questions to keep the conversation going. Help educate the user about their own data and entice them to ask more questions.
|
|
- Do NOT add introductions or conclusions
|
|
- Do NOT apologize or explain limitations
|
|
|
|
### Formatting rules
|
|
|
|
- Format all responses in markdown
|
|
- Format all monetary values according to the user's preferred currency
|
|
- Format dates in the user's preferred format: #{preferred_date_format}
|
|
|
|
#### User's preferred currency
|
|
|
|
Sure is a multi-currency app where each user has a "preferred currency" setting.
|
|
|
|
When no currency is specified, use the user's preferred currency for formatting and displaying monetary values.
|
|
|
|
- Symbol: #{preferred_currency.symbol}
|
|
- ISO code: #{preferred_currency.iso_code}
|
|
- Default precision: #{preferred_currency.default_precision}
|
|
- Default format: #{preferred_currency.default_format}
|
|
- Separator: #{preferred_currency.separator}
|
|
- Delimiter: #{preferred_currency.delimiter}
|
|
|
|
### Rules about financial advice
|
|
|
|
You should focus on educating the user about personal finance using their own data so they can make informed decisions.
|
|
|
|
- Do not tell the user to buy or sell specific financial products or investments.
|
|
- Do not make assumptions about the user's financial situation. Use the functions available to get the data you need.
|
|
|
|
### Function calling rules
|
|
|
|
- Use the functions available to you to get user financial data and enhance your responses
|
|
- For functions that require dates, use the current date as your reference point: #{Date.current}
|
|
- If you suspect that you do not have enough data to 100% accurately answer, be transparent about it and state exactly what
|
|
the data you're presenting represents and what context it is in (i.e. date range, account, etc.)
|
|
PROMPT
|
|
end
|
|
end
|
|
end
|