mirror of
https://github.com/we-promise/sure.git
synced 2026-07-12 04:45:19 +00:00
* feat(mcp): add get/create/update tools for tags and categories * test(mcp): add tests for tag and category assistant functions * fix(mcp): harden category/tag assistant functions against bad tool input * refactor(mcp): use UuidFormat.valid? instead of local UUID_PATTERN * chore(mcp): remove account_filter component files that don't belong in this branch
97 lines
2.0 KiB
Ruby
97 lines
2.0 KiB
Ruby
class Assistant::Function
|
|
class << self
|
|
def name
|
|
raise NotImplementedError, "Subclasses must implement the name class method"
|
|
end
|
|
|
|
def description
|
|
raise NotImplementedError, "Subclasses must implement the description class method"
|
|
end
|
|
end
|
|
|
|
def initialize(user)
|
|
@user = user
|
|
end
|
|
|
|
def call(params = {})
|
|
raise NotImplementedError, "Subclasses must implement the call method"
|
|
end
|
|
|
|
def name
|
|
self.class.name
|
|
end
|
|
|
|
def description
|
|
self.class.description
|
|
end
|
|
|
|
def params_schema
|
|
build_schema
|
|
end
|
|
|
|
# (preferred) when in strict mode, the schema needs to include all properties in required array
|
|
def strict_mode?
|
|
true
|
|
end
|
|
|
|
def to_definition
|
|
{
|
|
name: name,
|
|
description: description,
|
|
params_schema: params_schema,
|
|
strict: strict_mode?
|
|
}
|
|
end
|
|
|
|
private
|
|
attr_reader :user
|
|
|
|
def build_schema(properties: {}, required: [])
|
|
{
|
|
type: "object",
|
|
properties: properties,
|
|
required: required,
|
|
additionalProperties: false
|
|
}
|
|
end
|
|
|
|
def family_account_names
|
|
@family_account_names ||= user.accessible_accounts.visible.pluck(:name)
|
|
end
|
|
|
|
def family_category_names
|
|
@family_category_names ||= begin
|
|
names = family.categories.pluck(:name)
|
|
names << "Uncategorized"
|
|
names
|
|
end
|
|
end
|
|
|
|
def family_merchant_names
|
|
@family_merchant_names ||= family.merchants.pluck(:name)
|
|
end
|
|
|
|
def family_tag_names
|
|
@family_tag_names ||= family.tags.pluck(:name)
|
|
end
|
|
|
|
def family
|
|
user.family
|
|
end
|
|
|
|
def valid_uuid?(str)
|
|
UuidFormat.valid?(str)
|
|
end
|
|
|
|
# To save tokens, we provide the AI metadata about the series and a flat array of
|
|
# raw, formatted values which it can infer dates from
|
|
def to_ai_time_series(series)
|
|
{
|
|
start_date: series.start_date,
|
|
end_date: series.end_date,
|
|
interval: series.interval,
|
|
values: series.values.map { |v| v.trend.current.format }
|
|
}
|
|
end
|
|
end
|