Skip to content

Quickstart

filonov combines media fetching, tagging and similarity detection libraries in one utility and allows you to generate creative maps files to be visualized in http://filonov-ai.web.app

You can use filonov in one of the following forms:

  • CLI tool - use filonov utility in your terminal or shell scripts.
  • Python library - import filonov library to use in your Python code.
  • API endpoint - start FastAPI endpoint with python -m filonov.entrypoints.server

Parameters

When generating creative map files with filonov you need to provide several elements:

You can check full command structure here.

Example

As a simple example we can get Google Ads images from GOOGLE_ADS_ACCOUNT_ID account.

filonov --source googleads --media-type IMAGE \
  --tagger gemini \
  --googleads.account=GOOGLE_ADS_ACCOUNT_ID
import filonov

service = filonov.FilonovService()

request = filonov.CreativeMapGenerateRequest(
  source='googleads',
  media_type='IMAGE',
  tagger='gemini',
  source_parameters={'account': 'GOOGLE_ADS_ACCOUNT_ID'}
)

creative_map = service.generate_creative_map(request)
creative_map.save('creative_map')
curl -X 'POST' \
  'http://127.0.0.1:8000/creative_maps/generate:googleads' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "media_type": "IMAGE",
  "tagger": "gemini",
  "source_parameters": {
    "account": "GOOGLE_ADS_ACCOUNT_ID"
  }
}'

This will save creative_map.json file to the same directory where code is run.

Customization

filonov supports multiple customization options.

Source

You can configure which data you're getting from a source.

As an example we can get images from DemandGen campaigns (instead of default App campaigns) when fetching data from googleads source.

filonov --source googleads --media-type IMAGE \
  --tagger gemini \
  --googleads.account=GOOGLE_ADS_ACCOUNT_ID \
  --googleads.campaign-types=demandgen
import filonov

service = filonov.FilonovService()

request = filonov.CreativeMapGenerateRequest(
  source='googleads',
  media_type='IMAGE',
  tagger='gemini',
  source_parameters={
    'account': 'GOOGLE_ADS_ACCOUNT_ID',
    'campaign_types': ['demandgen'],
  }
)

creative_map = service.generate_creative_map(request)
creative_map.save('creative_map')
curl -X 'POST' \
  'http://127.0.0.1:8000/creative_maps/generate:googleads' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "media_type": "IMAGE",
  "tagger": "gemini",
  "source_parameters": {
    "account": "GOOGLE_ADS_ACCOUNT_ID",
    "campaign_types": "demandgen"
  }
}'

For the full list of customization options please refer to sources section.

Tagger

You can configure how to tag data extracted from the source.

As an example we can get 50 tags (instead of default 100) when performing tagging via gemini.

filonov --source googleads --media-type IMAGE \
  --tagger gemini \
  --tagger.n-tags=50 \
  --googleads.account=GOOGLE_ADS_ACCOUNT_ID
import filonov

service = filonov.FilonovService()

request = filonov.CreativeMapGenerateRequest(
  source='googleads',
  media_type='IMAGE',
  tagger='gemini',
  tagger_parameters={'n_tags': 50},
  source_parameters={'account': 'GOOGLE_ADS_ACCOUNT_ID'}
)

creative_map = service.generate_creative_map(request)
creative_map.save('creative_map')
curl -X 'POST' \
  'http://127.0.0.1:8000/creative_maps/generate:googleads' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "media_type": "IMAGE",
  "tagger": "gemini",
  "tagger_parameters": {
    "n_tags": 50
  },
  "source_parameters": {
    "account": "GOOGLE_ADS_ACCOUNT_ID"
  }
}'

For the full list of customization options please refer to taggers section.

Similarity

You can fine-tune how similarity is calculated.

filonov --source googleads --media-type IMAGE \
  --tagger gemini \
  --similarity.custom-threshold=2 \
  --googleads.account=GOOGLE_ADS_ACCOUNT_ID
import filonov

service = filonov.FilonovService()

request = filonov.CreativeMapGenerateRequest(
  source='googleads',
  media_type='IMAGE',
  tagger='gemini',
  similarity_parameters={'custom_threshold': 2},
  source_parameters={'account': 'GOOGLE_ADS_ACCOUNT_ID'}
)

creative_map = service.generate_creative_map(request)
creative_map.save('creative_map')
curl -X 'POST' \
  'http://127.0.0.1:8000/creative_maps/generate:googleads' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "media_type": "IMAGE",
  "tagger": "gemini",
  "similarity_parameters": {
    "custom_threshold": 2
  },
  "source_parameters": {
    "account": "GOOGLE_ADS_ACCOUNT_ID"
  }
}'

Persistence

You can save results of tagging / similarity calculation in a database.

filonov --source googleads --media-type IMAGE \
  --tagger gemini \
  --db-uri CONNECTION_STRING_TO_DB \
  --googleads.account=GOOGLE_ADS_ACCOUNT_ID
import filonov
import media_tagging
from media_tagging.repositories import SqlAlchemyTaggingResultsRepository

media_tagging_repository = SqlAlchemyTaggingResultsRepository(
  CONNECTION_STRING_TO_DB
)
media_tagging_service = media_tagging.MediaTaggingService(
  media_tagging_repository
)

service = filonov.FilonovService(tagging_service=media_tagging_service)

request = filonov.CreativeMapGenerateRequest(
  source='googleads',
  media_type='IMAGE',
  tagger='gemini',
  source_parameters={'account': 'GOOGLE_ADS_ACCOUNT_ID'}
)

creative_map = service.generate_creative_map(request)
creative_map.save('creative_map')

Expose MEDIA_TAGGING_DB_URL environmental variable and restart service.

curl -X 'POST' \
  'http://127.0.0.1:8000/creative_maps/generate:googleads' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "media_type": "IMAGE",
  "tagger": "gemini",
  "source_parameters": {
    "account": "GOOGLE_ADS_ACCOUNT_ID"
  }
}'

Trimming

You can exclude tags with score below certain threshold when performing similarity calculation.

filonov --source googleads --media-type IMAGE \
  --tagger gemini \
  --googleads.account=GOOGLE_ADS_ACCOUNT_ID \
  --trim-tags-threshold 0.5
import filonov

service = filonov.FilonovService()

request = filonov.CreativeMapGenerateRequest(
  source='googleads',
  media_type='IMAGE',
  tagger='gemini',
  source_parameters={'account': 'GOOGLE_ADS_ACCOUNT_ID'},
  trim_tags_threshold=0.5,
)

creative_map = service.generate_creative_map(request)
creative_map.save('creative_map')
curl -X 'POST' \
  'http://127.0.0.1:8000/creative_maps/generate:googleads' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "media_type": "IMAGE",
  "tagger": "gemini",
  "source_parameters": {
    "account": "GOOGLE_ADS_ACCOUNT_ID"
  },
  "trim_tags_threshold": 0.5
}'

Output

By default the results are saved into creative_map.json file in the current folder.

You can overwrite it with output-name option.

Let's save map into map1.json file.

filonov --source googleads --media-type IMAGE \
  --tagger gemini \
  --googleads.account=GOOGLE_ADS_ACCOUNT_ID \
  --output-name map1
import filonov

service = filonov.FilonovService()

request = filonov.CreativeMapGenerateRequest(
  source='googleads',
  media_type='IMAGE',
  tagger='gemini',
  source_parameters={'account': 'GOOGLE_ADS_ACCOUNT_ID'},
  output_parameters={'output_name': 'map1'},
)

creative_map = service.generate_creative_map(request)
creative_map.save('creative_map')
curl -X 'POST' \
  'http://127.0.0.1:8000/creative_maps/generate:googleads' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "media_type": "IMAGE",
  "tagger": "gemini",
  "source_parameters": {
    "account": "GOOGLE_ADS_ACCOUNT_ID"
  },
  "output_parameters": {
    "output_name": "map1"
  }
}'

Command structure

filonov --source SOURCE \
  --media-type MEDIA_TYPE \
  --db-uri=CONNECTION_STRING \
  --tagger=TAGGER_TYPE \
  --SOURCE.PARAM=VALUE \
  --tagger.PARAM=VALUE \
  --output-name=FILE_NAME