ai_marketplace_monitor package¶
Submodules¶
ai_marketplace_monitor.ai module¶
- class ai_marketplace_monitor.ai.AIBackend(config: AIConfig, logger: Logger | None = None)[source]¶
Bases:
Generic[TAIConfig]- evaluate(listing: Listing, item_config: TItemConfig, marketplace_config: TMarketplaceConfig) AIResponse[source]¶
- class ai_marketplace_monitor.ai.AIConfig(name: str, enabled: bool | None = None, api_key: str | None = None, provider: str | None = None, model: str | None = None, base_url: str | None = None, max_retries: int = 10, timeout: int | None = None)[source]¶
Bases:
BaseConfig
- class ai_marketplace_monitor.ai.AIResponse(score: int, comment: str, name: str = '')[source]¶
Bases:
object
- class ai_marketplace_monitor.ai.AIServiceProvider(*values)[source]¶
Bases:
Enum- ANTHROPIC = 'Anthropic'¶
- DEEPSEEK = 'DeepSeek'¶
- OLLAMA = 'Ollama'¶
- OPENAI = 'OpenAI'¶
- class ai_marketplace_monitor.ai.AnthropicBackend(config: AIConfig, logger: Logger | None = None)[source]¶
Bases:
AIBackend- default_model = 'claude-sonnet-4-20250514'¶
- evaluate(listing: Listing, item_config: TItemConfig, marketplace_config: TMarketplaceConfig) AIResponse[source]¶
- classmethod get_config(**kwargs: Any) AnthropicConfig[source]¶
- class ai_marketplace_monitor.ai.AnthropicConfig(name: str, enabled: bool | None = None, api_key: str | None = None, provider: str | None = None, model: str | None = None, base_url: str | None = None, max_retries: int = 10, timeout: int | None = None)[source]¶
Bases:
AIConfig
- class ai_marketplace_monitor.ai.DeekSeekConfig(name: str, enabled: bool | None = None, api_key: str | None = None, provider: str | None = None, model: str | None = None, base_url: str | None = None, max_retries: int = 10, timeout: int | None = None)[source]¶
Bases:
OpenAIConfig
- class ai_marketplace_monitor.ai.DeepSeekBackend(config: AIConfig, logger: Logger | None = None)[source]¶
Bases:
OpenAIBackend- default_model = 'deepseek-chat'¶
- classmethod get_config(**kwargs: Any) DeekSeekConfig[source]¶
- class ai_marketplace_monitor.ai.OllamaBackend(config: AIConfig, logger: Logger | None = None)[source]¶
Bases:
OpenAIBackend- default_model = 'deepseek-r1:14b'¶
- classmethod get_config(**kwargs: Any) OllamaConfig[source]¶
- class ai_marketplace_monitor.ai.OllamaConfig(name: str, enabled: bool | None = None, api_key: str | None = 'ollama', provider: str | None = None, model: str | None = None, base_url: str | None = None, max_retries: int = 10, timeout: int | None = None)[source]¶
Bases:
OpenAIConfig
- class ai_marketplace_monitor.ai.OpenAIBackend(config: AIConfig, logger: Logger | None = None)[source]¶
Bases:
AIBackend- default_model = 'gpt-4o'¶
- evaluate(listing: Listing, item_config: TItemConfig, marketplace_config: TMarketplaceConfig) AIResponse[source]¶
- classmethod get_config(**kwargs: Any) OpenAIConfig[source]¶
ai_marketplace_monitor.cli module¶
Console script for ai-marketplace-monitor.
- ai_marketplace_monitor.cli.main(config_files: Path] | None, <typer.models.OptionInfo object at 0x7d6a54de06e0>]=None, headless: Annotated[bool | None, <typer.models.OptionInfo object at 0x7d6a54de0770>]=False, clear_cache: Annotated[str | None, <typer.models.OptionInfo object at 0x7d6a54c43470>]=None, verbose: Annotated[bool | None, <typer.models.OptionInfo object at 0x7d6a54de0860>]=False, items: List[str] | None, <typer.models.OptionInfo object at 0x7d6a54de08f0>]=None, for_item: Annotated[str | None, <typer.models.OptionInfo object at 0x7d6a54de0980>]=None, webui: Annotated[bool, <typer.models.OptionInfo object at 0x7d6a54de0a10>]=True, webui_host: Annotated[str, <typer.models.OptionInfo object at 0x7d6a54de0aa0>]='127.0.0.1', webui_port: Annotated[int, <typer.models.OptionInfo object at 0x7d6a54de0b30>]=8467, webui_log_retention: Annotated[int, <typer.models.OptionInfo object at 0x7d6a54de0bc0>]=2000, version: Annotated[bool | None, <typer.models.OptionInfo object at 0x7d6a54de0c50>]=None) None[source]¶
Console script for AI Marketplace Monitor.
- ai_marketplace_monitor.cli.version_callback(value: bool) None[source]¶
Callback function for the –version option.
- Parameters:
value (-) – The value provided for the –version option.
- Raises:
- typer.Exit – Raises an Exit exception if the –version option is provided,
printing the Awesome CLI version and exiting the program. –
ai_marketplace_monitor.config module¶
- class ai_marketplace_monitor.config.Config(config_files: List[pathlib.Path], logger: logging.Logger | None = None)[source]¶
Bases:
Generic[TAIConfig,TItemConfig,TMarketplaceConfig]- monitor: MonitorConfig¶
- notification: Dict[str, NotificationConfig]¶
- region: Dict[str, RegionConfig]¶
- translator: Dict[str, Translator]¶
- user: Dict[str, UserConfig]¶
ai_marketplace_monitor.email_notify module¶
- class ai_marketplace_monitor.email_notify.EmailNotificationConfig(name: str, enabled: bool | None = None, max_retries: int = 5, retry_delay: int = 60, rate_limit_enabled: bool = False, instance_rate_limit: float = 1.0, global_rate_limit: int = 10, _handles_own_rate_limiting: bool = False, _last_send_time: float | None = None, email: List[str] | None = None, smtp_server: str | None = None, smtp_port: int | None = None, smtp_username: str | None = None, smtp_password: str | None = None, smtp_from: str | None = None)[source]¶
Bases:
NotificationConfig- get_html_message(listings: List[Listing], ratings: List[AIResponse], notification_status: List[NotificationStatus], force: bool = False, logger: Logger | None = None) Tuple[str, list[Tuple[bytes, str, str]]][source]¶
- get_text_message(listings: List[Listing], ratings: List[AIResponse], notification_status: List[NotificationStatus], force: bool = False, logger: Logger | None = None) str[source]¶
- get_title(listings: List[Listing], notification_status: List[NotificationStatus], force: bool = False) str[source]¶
- notify(listings: List[Listing], ratings: List[AIResponse], notification_status: List[NotificationStatus], force: bool = False, logger: Logger | None = None) bool[source]¶
- notify_method = 'email'¶
ai_marketplace_monitor.facebook module¶
- class ai_marketplace_monitor.facebook.Availability(*values)[source]¶
Bases:
Enum- ALL = 'all'¶
- INSTOCK = 'in'¶
- OUTSTOCK = 'out'¶
- class ai_marketplace_monitor.facebook.Category(*values)[source]¶
Bases:
Enum- APPAREL = 'apparel'¶
- ELECTRONICS = 'electronics'¶
- ENTERTAINMENT = 'entertainment'¶
- FAMILY = 'family'¶
- FREE = 'free'¶
- FREE_STUFF = 'freestuff'¶
- GARDEN = 'garden'¶
- HOBBIES = 'hobbies'¶
- HOME_GOODS = 'homegoods'¶
- HOME_IMPROVEMENT = 'homeimprovement'¶
- HOME_SALES = 'homesales'¶
- MUSICAL_INSTRUMENTS = 'musicalinstruments'¶
- OFFICE_SUPPLIES = 'officesupplies'¶
- PET_SUPPLIES = 'petsupplies'¶
- PROPERTY_RENTALS = 'propertyrentals'¶
- SPORTING_GOODS = 'sportinggoods'¶
- TICKETS = 'tickets'¶
- TOYS = 'toys'¶
- VEHICLES = 'vehicles'¶
- VIDEO_GAMES = 'videogames'¶
- class ai_marketplace_monitor.facebook.Condition(*values)[source]¶
Bases:
Enum- NEW = 'new'¶
- USED_FAIR = 'used_fair'¶
- USED_GOOD = 'used_good'¶
- USED_LIKE_NEW = 'used_like_new'¶
- class ai_marketplace_monitor.facebook.DateListed(*values)[source]¶
Bases:
Enum- ANYTIME = 0¶
- PAST_24_HOURS = 1¶
- PAST_MONTH = 30¶
- PAST_WEEK = 7¶
- class ai_marketplace_monitor.facebook.DeliveryMethod(*values)[source]¶
Bases:
Enum- ALL = 'all'¶
- LOCAL_PICK_UP = 'local_pick_up'¶
- SHIPPING = 'shipping'¶
- class ai_marketplace_monitor.facebook.FacebookAutoItemWithAboutAndDescriptionPage(page: Page, translator: Translator | None = None, logger: Logger | None = None)[source]¶
Bases:
FacebookRegularItemPage
- class ai_marketplace_monitor.facebook.FacebookAutoItemWithDescriptionPage(page: Page, translator: Translator | None = None, logger: Logger | None = None)[source]¶
- class ai_marketplace_monitor.facebook.FacebookItemConfig(name: str, enabled: bool | None = None, seller_locations: List[str] | None = None, availability: List[str] | None = None, condition: List[str] | None = None, date_listed: List[int] | None = None, delivery_method: List[str] | None = None, category: str | None = None, ai: List[str] | None = None, exclude_sellers: List[str] | None = None, notify: List[str] | None = None, search_city: List[str] | None = None, city_name: List[str] | None = None, radius: List[int] | None = None, currency: List[str] | None = None, search_interval: int | None = None, max_search_interval: int | None = None, start_at: List[str] | None = None, search_region: List[str] | None = None, max_price: str | None = None, min_price: str | None = None, rating: List[int] | None = None, prompt: str | None = None, extra_prompt: str | None = None, rating_prompt: str | None = None, searched_count: int = 0, search_phrases: List[str] = <factory>, keywords: List[str] | None = None, antikeywords: List[str] | None = None, description: str | None = None, marketplace: str | None = None)[source]¶
- class ai_marketplace_monitor.facebook.FacebookItemPage(page: Page, translator: Translator | None = None, logger: Logger | None = None)[source]¶
Bases:
WebPage
- class ai_marketplace_monitor.facebook.FacebookMarketItemCommonConfig(name: str, enabled: bool | None = None, seller_locations: List[str] | None = None, availability: List[str] | None = None, condition: List[str] | None = None, date_listed: List[int] | None = None, delivery_method: List[str] | None = None, category: str | None = None)[source]¶
Bases:
BaseConfigItem options that can be defined in marketplace
This class defines and processes options that can be specified in both marketplace and item sections, specific to facebook marketplace
- class ai_marketplace_monitor.facebook.FacebookMarketplace(name: str, browser: Browser | None, keyboard_monitor: KeyboardMonitor | None = None, logger: Logger | None = None)[source]¶
Bases:
Marketplace- check_listing(item: Listing, item_config: FacebookItemConfig, description_available: bool = True) bool[source]¶
- classmethod get_config(**kwargs: Any) FacebookMarketplaceConfig[source]¶
- classmethod get_item_config(**kwargs: Any) FacebookItemConfig[source]¶
- get_listing_details(post_url: str, item_config: ItemConfig, price: str | None = None, title: str | None = None) Tuple[Listing, bool][source]¶
- initial_url = 'https://www.facebook.com/login/device-based/regular/login/'¶
- name = 'facebook'¶
- class ai_marketplace_monitor.facebook.FacebookMarketplaceConfig(name: str, enabled: bool | None = None, seller_locations: List[str] | None = None, availability: List[str] | None = None, condition: List[str] | None = None, date_listed: List[int] | None = None, delivery_method: List[str] | None = None, category: str | None = None, ai: List[str] | None = None, exclude_sellers: List[str] | None = None, notify: List[str] | None = None, search_city: List[str] | None = None, city_name: List[str] | None = None, radius: List[int] | None = None, currency: List[str] | None = None, search_interval: int | None = None, max_search_interval: int | None = None, start_at: List[str] | None = None, search_region: List[str] | None = None, max_price: str | None = None, min_price: str | None = None, rating: List[int] | None = None, prompt: str | None = None, extra_prompt: str | None = None, rating_prompt: str | None = None, market_type: str | None = 'facebook', language: str | None = None, monitor_config: MonitorConfig | None = None, login_wait_time: int | None = None, password: str | None = None, username: str | None = None)[source]¶
Bases:
MarketplaceConfig,FacebookMarketItemCommonConfigOptions specific to facebook marketplace
This class defines and processes options that can be specified in the marketplace.facebook section only. None of the options are required.
- class ai_marketplace_monitor.facebook.FacebookRegularItemPage(page: Page, translator: Translator | None = None, logger: Logger | None = None)[source]¶
Bases:
FacebookItemPage
- class ai_marketplace_monitor.facebook.FacebookRentalItemPage(page: Page, translator: Translator | None = None, logger: Logger | None = None)[source]¶
Bases:
FacebookRegularItemPage
ai_marketplace_monitor.listing module¶
ai_marketplace_monitor.marketplace module¶
- class ai_marketplace_monitor.marketplace.ItemConfig(name: str, enabled: bool | None = None, ai: List[str] | None = None, exclude_sellers: List[str] | None = None, notify: List[str] | None = None, search_city: List[str] | None = None, city_name: List[str] | None = None, radius: List[int] | None = None, currency: List[str] | None = None, search_interval: int | None = None, max_search_interval: int | None = None, start_at: List[str] | None = None, search_region: List[str] | None = None, max_price: str | None = None, min_price: str | None = None, rating: List[int] | None = None, prompt: str | None = None, extra_prompt: str | None = None, rating_prompt: str | None = None, searched_count: int = 0, search_phrases: List[str] = <factory>, keywords: List[str] | None = None, antikeywords: List[str] | None = None, description: str | None = None, marketplace: str | None = None)[source]¶
Bases:
MarketItemCommonConfigThis class defined options that can only be specified for items.
- class ai_marketplace_monitor.marketplace.MarketItemCommonConfig(name: str, enabled: bool | None = None, ai: List[str] | None = None, exclude_sellers: List[str] | None = None, notify: List[str] | None = None, search_city: List[str] | None = None, city_name: List[str] | None = None, radius: List[int] | None = None, currency: List[str] | None = None, search_interval: int | None = None, max_search_interval: int | None = None, start_at: List[str] | None = None, search_region: List[str] | None = None, max_price: str | None = None, min_price: str | None = None, rating: List[int] | None = None, prompt: str | None = None, extra_prompt: str | None = None, rating_prompt: str | None = None)[source]¶
Bases:
BaseConfigItem options that can be specified in market (non-marketplace specifc)
This class defines and processes options that can be specified in both marketplace and item sections, generic to all marketplaces
- class ai_marketplace_monitor.marketplace.MarketPlace(*values)[source]¶
Bases:
Enum- FACEBOOK = 'facebook'¶
- class ai_marketplace_monitor.marketplace.Marketplace(name: str, browser: Browser | None, keyboard_monitor: KeyboardMonitor | None = None, logger: Logger | None = None)[source]¶
Bases:
Generic[TMarketplaceConfig,TItemConfig]- configure(config: TMarketplaceConfig, translator: Translator | None = None) None[source]¶
- class ai_marketplace_monitor.marketplace.MarketplaceConfig(name: str, enabled: bool | None = None, ai: List[str] | None = None, exclude_sellers: List[str] | None = None, notify: List[str] | None = None, search_city: List[str] | None = None, city_name: List[str] | None = None, radius: List[int] | None = None, currency: List[str] | None = None, search_interval: int | None = None, max_search_interval: int | None = None, start_at: List[str] | None = None, search_region: List[str] | None = None, max_price: str | None = None, min_price: str | None = None, rating: List[int] | None = None, prompt: str | None = None, extra_prompt: str | None = None, rating_prompt: str | None = None, market_type: str | None = 'facebook', language: str | None = None, monitor_config: MonitorConfig | None = None)[source]¶
Bases:
MarketItemCommonConfigGeneric marketplace config
- monitor_config: MonitorConfig | None = None¶
- class ai_marketplace_monitor.marketplace.WebPage(page: Page, translator: Translator | None = None, logger: Logger | None = None)[source]¶
Bases:
object- translator: Translator¶
ai_marketplace_monitor.monitor module¶
- class ai_marketplace_monitor.monitor.MarketplaceMonitor(config_files: List[Path] | None, headless: bool | None, logger: Logger | None)[source]¶
Bases:
object- check_items(items: List[str] | None = None, for_item: str | None = None) None[source]¶
Main function to monitor the marketplace.
- evaluate_by_ai(item: Listing, item_config: TItemConfig, marketplace_config: TMarketplaceConfig) AIResponse[source]¶
- search_item(marketplace_config: TMarketplaceConfig, marketplace: Marketplace, item_config: TItemConfig) None[source]¶
Search for an item on the marketplace.
ai_marketplace_monitor.notification module¶
- class ai_marketplace_monitor.notification.NotificationConfig(name: str, enabled: bool | None = None, max_retries: int = 5, retry_delay: int = 60, rate_limit_enabled: bool = False, instance_rate_limit: float = 1.0, global_rate_limit: int = 10, _handles_own_rate_limiting: bool = False, _last_send_time: float | None = None)[source]¶
Bases:
BaseConfig- classmethod get_config(**kwargs: Any) NotificationConfig | None[source]¶
Get the specific subclass name from the specified keys, for validation purposes
- classmethod notify_all(config: NotificationConfig, *args, **kwargs: Any) bool[source]¶
Call the notify method of all subclasses
- send_message_with_retry(title: str, message: str, logger: Logger | None = None) bool[source]¶
Enhanced retry method with rate limiting support.
Subclasses that set
_handles_own_rate_limiting = True(e.g. Telegram, which applies async rate limiting inside its ownsend_message) will NOT get sync rate limiting here — avoiding a double-wait.
- class ai_marketplace_monitor.notification.NotificationStatus(*values)[source]¶
Bases:
Enum- EXPIRED = 1¶
- LISTING_CHANGED = 3¶
- LISTING_DISCOUNTED = 4¶
- NOTIFIED = 2¶
- NOT_NOTIFIED = 0¶
- class ai_marketplace_monitor.notification.PushNotificationConfig(name: str, enabled: bool | None = None, max_retries: int = 5, retry_delay: int = 60, rate_limit_enabled: bool = False, instance_rate_limit: float = 1.0, global_rate_limit: int = 10, _handles_own_rate_limiting: bool = False, _last_send_time: float | None = None, message_format: str | None = None, with_description: int | None = None)[source]¶
Bases:
NotificationConfig- notify(listings: List[Listing], ratings: List[AIResponse], notification_status: List[NotificationStatus], force: bool = False, logger: Logger | None = None) bool[source]¶
- notify_method = 'push_notification'¶
ai_marketplace_monitor.ntfy module¶
- class ai_marketplace_monitor.ntfy.NtfyNotificationConfig(name: str, enabled: bool | None = None, max_retries: int = 5, retry_delay: int = 60, rate_limit_enabled: bool = False, instance_rate_limit: float = 1.0, global_rate_limit: int = 10, _handles_own_rate_limiting: bool = False, _last_send_time: float | None = None, message_format: str | None = None, with_description: int | None = None, ntfy_server: str | None = None, ntfy_topic: str | None = None)[source]¶
Bases:
PushNotificationConfig- notify_method = 'ntfy'¶
ai_marketplace_monitor.pushbullet module¶
- class ai_marketplace_monitor.pushbullet.PushbulletNotificationConfig(name: str, enabled: bool | None = None, max_retries: int = 5, retry_delay: int = 60, rate_limit_enabled: bool = False, instance_rate_limit: float = 1.0, global_rate_limit: int = 10, _handles_own_rate_limiting: bool = False, _last_send_time: float | None = None, message_format: str | None = None, with_description: int | None = None, pushbullet_token: str | None = None, pushbullet_proxy_type: str | None = None, pushbullet_proxy_server: str | None = None)[source]¶
Bases:
PushNotificationConfig- notify_method = 'pushbullet'¶
ai_marketplace_monitor.pushover module¶
- class ai_marketplace_monitor.pushover.PushoverNotificationConfig(name: str, enabled: bool | None = None, max_retries: int = 5, retry_delay: int = 60, rate_limit_enabled: bool = False, instance_rate_limit: float = 1.0, global_rate_limit: int = 10, _handles_own_rate_limiting: bool = False, _last_send_time: float | None = None, message_format: str | None = None, with_description: int | None = None, pushover_user_key: str | None = None, pushover_api_token: str | None = None)[source]¶
Bases:
PushNotificationConfig- notify_method = 'pushover'¶
ai_marketplace_monitor.region module¶
ai_marketplace_monitor.telegram module¶
- class ai_marketplace_monitor.telegram.TelegramNotificationConfig(name: str, enabled: bool | None = None, max_retries: int = 5, retry_delay: int = 60, rate_limit_enabled: bool = True, instance_rate_limit: float = 1.0, global_rate_limit: int = 30, _handles_own_rate_limiting: bool = True, _last_send_time: float | None = None, message_format: str | None = None, with_description: int | None = None, telegram_token: str | None = None, telegram_chat_id: str | None = None)[source]¶
Bases:
PushNotificationConfig- notify_method = 'telegram'¶
ai_marketplace_monitor.user module¶
- class ai_marketplace_monitor.user.User(config: UserConfig, logger: Logger | None = None)[source]¶
Bases:
object- classmethod get_config(**kwargs: Any) UserConfig[source]¶
- notification_status(listing: Listing, local_cache: Cache | None = None) NotificationStatus[source]¶
- class ai_marketplace_monitor.user.UserConfig(name: str, enabled: bool | None = None, max_retries: int = 5, retry_delay: int = 60, rate_limit_enabled: bool = False, instance_rate_limit: float = 1.0, global_rate_limit: int = 10, _handles_own_rate_limiting: bool = False, _last_send_time: float | None = None, message_format: str | None = None, with_description: int | None = None, telegram_token: str | None = None, telegram_chat_id: str | None = None, ntfy_server: str | None = None, ntfy_topic: str | None = None, pushover_user_key: str | None = None, pushover_api_token: str | None = None, pushbullet_token: str | None = None, pushbullet_proxy_type: str | None = None, pushbullet_proxy_server: str | None = None, email: List[str] | None = None, smtp_server: str | None = None, smtp_port: int | None = None, smtp_username: str | None = None, smtp_password: str | None = None, smtp_from: str | None = None, notify_with: List[str] | None = None, remind: int | None = None)[source]¶
Bases:
EmailNotificationConfig,PushbulletNotificationConfig,PushoverNotificationConfig,NtfyNotificationConfig,TelegramNotificationConfigUserConfiguration
Derive from EmailNotificationConfig, PushbulletNotificationConfig allows the user config class to use settings from both classes.
It is possible to dynamically added these classes as parent class of UserConfig, but it is troublesome to make sure that these classes are imported.
ai_marketplace_monitor.utils module¶
- class ai_marketplace_monitor.utils.BaseConfig(name: str, enabled: bool | None = None)[source]¶
Bases:
object
- class ai_marketplace_monitor.utils.CacheType(*values)[source]¶
Bases:
Enum- AI_INQUIRY = 'ai-inquiries'¶
- COUNTERS = 'counters'¶
- LISTING_DETAILS = 'listing-details'¶
- USER_NOTIFIED = 'user-notifications'¶
- class ai_marketplace_monitor.utils.ChangeHandler(files: List[str])[source]¶
Bases:
FileSystemEventHandler- on_created(event: FileSystemEvent) None[source]¶
Called when a file or directory is created.
- Parameters:
event (
DirCreatedEventorFileCreatedEvent) – Event representing file/directory creation.
- on_deleted(event: FileSystemEvent) None[source]¶
Called when a file or directory is deleted.
- Parameters:
event (
DirDeletedEventorFileDeletedEvent) – Event representing file/directory deletion.
- class ai_marketplace_monitor.utils.CounterItem(*values)[source]¶
Bases:
Enum- AI_QUERY = 'Total AI Queries'¶
- EXCLUDED_LISTING = 'Listing excluded'¶
- FAILED_AI_QUERY = 'Failed AI Queries)'¶
- LISTING_EXAMINED = 'Total listing examined'¶
- LISTING_QUERY = 'New listing fetched'¶
- NEW_AI_QUERY = 'New AI Queries'¶
- NEW_VALIDATED_LISTING = 'New validated listing'¶
- NOTIFICATIONS_SENT = 'Notifications sent'¶
- REMINDERS_SENT = 'Reminders sent'¶
- SEARCH_PERFORMED = 'Search performed'¶
- class ai_marketplace_monitor.utils.Currency(*values)[source]¶
Bases:
Enum- ARS_unsupported = 'ARS'¶
- AUD = 'AUD'¶
- BGN = 'BGN'¶
- BRL = 'BRL'¶
- CAD = 'CAD'¶
- CHF = 'CHF'¶
- CNY = 'CNY'¶
- CYP = 'CYP'¶
- CZK = 'CZK'¶
- DKK = 'DKK'¶
- EEK = 'EEK'¶
- EUR = 'EUR'¶
- GBP = 'GBP'¶
- HKD = 'HKD'¶
- HRK = 'HRK'¶
- HUF = 'HUF'¶
- IDR = 'IDR'¶
- ILS = 'ILS'¶
- INR = 'INR'¶
- ISK = 'ISK'¶
- JPY = 'JPY'¶
- KRW = 'KRW'¶
- LTL = 'LTL'¶
- LVL = 'LVL'¶
- MTL = 'MTL'¶
- MXN = 'MXN'¶
- MYR = 'MYR'¶
- NOK = 'NOK'¶
- NZD = 'NZD'¶
- PHP = 'PHP'¶
- PLN = 'PLN'¶
- ROL = 'ROL'¶
- RON = 'RON'¶
- RUB = 'RUB'¶
- SEK = 'SEK'¶
- SGD = 'SGD'¶
- SIT = 'SIT'¶
- SKK = 'SKK'¶
- THB = 'THB'¶
- TRL = 'TRL'¶
- TRY = 'TRY'¶
- USD = 'USD'¶
- ZAR = 'ZAR'¶
- class ai_marketplace_monitor.utils.MonitorConfig(name: str, enabled: bool | None = None, proxy_server: List[str] | None = None, proxy_bypass: str | None = None, proxy_username: str | None = None, proxy_password: str | None = None)[source]¶
Bases:
BaseConfig
- class ai_marketplace_monitor.utils.SleepStatus(*values)[source]¶
Bases:
Enum- BY_FILE_CHANGE = 2¶
- BY_KEYBOARD = 1¶
- NOT_DISRUPTED = 0¶
- class ai_marketplace_monitor.utils.Translator(locale: str | None = None, dictionary: Dict[str, str] | None = None)[source]¶
Bases:
object
- ai_marketplace_monitor.utils.aimm_event(kind: str, **fields: Any) Dict[str, Any][source]¶
Build a structured-event payload for a log call.
- Usage:
logger.info(message, extra=aimm_event(“ai_eval”, score=5, …))
The web UI surfaces these structured fields in its filter dropdowns (kind / item / score) and in the expand-row detail pane.
- ai_marketplace_monitor.utils.calculate_file_hash(file_paths: List[Path]) str[source]¶
Calculate the SHA-256 hash of the file content.
- ai_marketplace_monitor.utils.doze(duration: int, files: List[Path] | None = None, keyboard_monitor: KeyboardMonitor | None = None) SleepStatus[source]¶
Sleep for a specified duration while monitoring the change of files.
- Returns:
if doze was done naturally. 1: if doze was disrupted by keyboard 2: if doze was disrupted by file change
- Return type:
0
- ai_marketplace_monitor.utils.fetch_with_retry(url: str, timeout: int = 10, max_retries: int = 3, backoff_factor: float = 1.5, logger: Logger | None = None) Tuple[bytes, str] | None[source]¶
Fetch URL content with retry logic
- Parameters:
url – URL to fetch
timeout – Timeout in seconds
max_retries – Maximum number of retry attempts
backoff_factor – Multiplier for exponential backoff
logger – logger object
- Returns:
Tuple of (content, content_type) if successful, None if failed
- ai_marketplace_monitor.utils.hash_dict(obj: Dict[str, Any]) str[source]¶
Hash a dictionary to a string.
- ai_marketplace_monitor.utils.hilight(text: str, style: str = 'name') str[source]¶
Highlight the keywords in the text with the specified color.
- ai_marketplace_monitor.utils.is_substring(var1: str | List[str], var2: str | List[str], logger: Logger | None = None) bool[source]¶
Check if var1 is a substring of var2, after normalizing both strings. One of them can be a list of strings.
- var1: can be a single string, or a list of string, for which a condition of OR is assumed.
this program will parse var11 for “AND”, “OR” and “NOT”, and return the results of the logical expression.
var2: one or more strings for testing if strings in “var1” is a substring.
- ai_marketplace_monitor.utils.merge_dicts(dicts: list) dict[source]¶
Merge a list of dictionaries into a single dictionary, including nested dictionaries.
- Parameters:
dicts – A list of dictionaries to merge.
- Returns:
A single merged dictionary.
Module contents¶
Top-level package for ai-marketplace-monitor.