Ctrl K
ComunidadGuías…

echo.Tiltfile

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# 0. constants

## 0.1. ports

READINESS_PORT = 8086
CHAT_INTEGRATION_PORT = 8089
ECHO_BOT_PORT = 8090
PUSHPIN_PUBLIC_INNER_PORT = 7999
PUSHPIN_PRIVATE_INNER_PORT = 5561
PUSHPIN_PUBLIC_PORT = 7001
PUSHPIN_PRIVATE_PORT = 6001
DYNAMO_DB_PORT = 8000

## 0.2. strings

AUTH_ENCRYPTION_KEY = "allo"
WORK_DIR = os.path.dirname(__file__)
BOTPRESS_HOME_DIR = "%s/.botpresshome.echo" % WORK_DIR
PUSHPIN_CONFIG_PATH="%s/pushpin.conf" % WORK_DIR
LOCAL_AWS_ACCESS_KEY_ID = "FOO"
LOCAL_AWS_SECRET_ACCESS_KEY = "BAR"
ECHO_BOT_PATH = "%s/bots/echo" % WORK_DIR
CHAT_INT_PATH = "%s/integrations/chat" % WORK_DIR

CONV_FID_STORE = struct(
  table_name='chat-integration-conversation-fid-store',
  index_name='chat-integration-conversation-id-store',
  partition_key='bot_id',
  sort_key='fid',
  index_sort_key='id',
)

USER_FID_STORE = struct(
  table_name='chat-integration-user-fid-store',
  index_name='chat-integration-user-id-store',
  partition_key='bot_id',
  sort_key='fid',
  index_sort_key='id',
)

## 0.3. utils

def encode_base64(content):
    return str(local(
        command=['base64'],
        quiet=True,
        echo_off=True,
        stdin=content,
    )).strip()

# 0.4. env

BP_HOME_ENV = struct(key='BP_BOTPRESS_HOME', value=BOTPRESS_HOME_DIR)

# 1. config

config.define_bool('skip-install')
config.define_bool('skip-build')
config.define_string('bp-domain')
config.define_string('bp-token')
config.define_string('bp-workspace-id')
cfg = config.parse()

config_skip_install = cfg.get('skip-install', False)
config_skip_build = cfg.get('skip-build', False)
config_bp_domain = cfg.get('bp-domain', None)
config_bp_token = cfg.get('bp-token', None)
config_bp_workspace_id = cfg.get('bp-workspace-id', None)

if not config_bp_domain:
  fail("config 'bp-domain' is required")

if not config_bp_token:
  fail("config 'bp-token' is required")

if not config_bp_workspace_id:
  fail("config 'bp-workspace-id' is required")

CONFIG = struct(
  skip_install=config_skip_install,
  skip_build=config_skip_build,
  bp_domain=config_bp_domain,
  bp_token=config_bp_token,
  bp_workspace_id=config_bp_workspace_id,
)

api_webhook_domain = "webhook.%s" % CONFIG.bp_domain
api_api_domain = "api.%s" % CONFIG.bp_domain
content_domains = {"botpress.cloud": "bpcontent.cloud", "botpress.dev": "bpcontent.dev"}
api_tunnel_domain = "tunnel.%s" % content_domains.get(CONFIG.bp_domain, CONFIG.bp_domain)
api_api_url = "https://%s" % api_api_domain
api_tunnel_url = "https://%s" % api_tunnel_domain

API = struct(
  bp_webhook_domain = api_webhook_domain,
  bp_api_domain = api_api_domain,
  bp_tunnel_domain = api_tunnel_domain,
  bp_api_url = api_api_url,
  bp_tunnel_url = api_tunnel_url,
)

# 2. docker compose

dynamodb_resource = {
  "image": "amazon/dynamodb-local",
  "ports": ["%s:%s" % (DYNAMO_DB_PORT, DYNAMO_DB_PORT)],
  "environment": {
    "DYNAMODB_LOCAL_LOG": "DEBUG"
  }
}

PUSHPIN_ROUTES = "*,proto=ws %s:443,ssl,insecure,host=%s,over_http\n* %s:443,ssl,insecure,host=%s" % (API.bp_webhook_domain, API.bp_webhook_domain, API.bp_webhook_domain, API.bp_webhook_domain)
PUSHPIN_CONFIG = "%s" % read_file(PUSHPIN_CONFIG_PATH, '')
pushpin_ressource = {
  "image": "botpress/pushpin",
  "environment": {
    "PUSHPIN_ROUTES": PUSHPIN_ROUTES,
    "PUSHPIN_CONFIG": PUSHPIN_CONFIG,
  },
  'ports': ['%s:%s' % (PUSHPIN_PUBLIC_PORT, PUSHPIN_PUBLIC_INNER_PORT), '%s:%s' % (PUSHPIN_PRIVATE_PORT, PUSHPIN_PRIVATE_INNER_PORT)],
  'platform': 'linux/amd64',
}

docker_compose(encode_yaml({
  'version': '3.5',
  'services': {
    'run-pushpin': pushpin_ressource,
    'run-dynamodb': dynamodb_resource,
  },
}))

dc_readiness = [
  { 'type': 'http', 'name': 'run-pushpin', 'url': 'http://localhost:%s' % PUSHPIN_PUBLIC_PORT },
  { 'type': 'dynamodb', 'name': 'run-dynamodb', 'uri': 'http://localhost:%s' % DYNAMO_DB_PORT },
]

# 3. ressources

## 3.1. utils

local_resource(
  name='pnpm-install',
  cmd='pnpm install' if not CONFIG.skip_install else 'echo skipped',
  labels=['utils']
)

local_resource(
  name='pnpm-build',
  cmd='pnpm build' if not CONFIG.skip_build else 'echo skipped',
  labels=['utils'],
  resource_deps=['pnpm-install']
)

local_resource(
  name='login-botpress',
  cmd='pnpm bp login',
  env={
    BP_HOME_ENV.key: BP_HOME_ENV.value,
    'BP_API_URL': API.bp_api_url,
    'BP_TOKEN': CONFIG.bp_token,
    'BP_WORKSPACE_ID': CONFIG.bp_workspace_id,
  },
  resource_deps=['pnpm-install', 'pnpm-build'],
  labels=['utils'],
)

readiness_deps=[r['name'] for r in dc_readiness] + ['pnpm-install', 'pnpm-build']
local_resource(
  name="readiness",
  allow_parallel=True,
  serve_cmd='pnpm ready',
  serve_env={
    'PORT': '%s' % READINESS_PORT,
    'LOG_LEVEL': 'info',
    'CONFIG': encode_json(dc_readiness),
    'AWS_REGION': 'localhost',
    'AWS_ACCESS_KEY_ID': LOCAL_AWS_ACCESS_KEY_ID,
    'AWS_SECRET_ACCESS_KEY': LOCAL_AWS_SECRET_ACCESS_KEY,
  },
  labels=['utils'],
  readiness_probe=probe(http_get=http_get_action(port=READINESS_PORT, path='/ready'), period_secs=2, failure_threshold=20),
  resource_deps=readiness_deps,
)

# 3.2. scripts

local_resource(
  name='create-conv-fid-store',
  cmd='pnpm ts-node -T ./scripts/dynamodb-create-table.ts',
  env={
    'AWS_REGION': "localhost",
    'AWS_ACCESS_KEY_ID': LOCAL_AWS_ACCESS_KEY_ID,
    'AWS_SECRET_ACCESS_KEY': LOCAL_AWS_SECRET_ACCESS_KEY,
    'endpoint': "http://localhost:%s" % DYNAMO_DB_PORT,
    'table_name': CONV_FID_STORE.table_name,
    'index_name': CONV_FID_STORE.index_name,
    'partition_key': CONV_FID_STORE.partition_key,
    'sort_key': CONV_FID_STORE.sort_key,
    'index_sort_key': CONV_FID_STORE.index_sort_key,
  },
  labels=['scripts'],
  resource_deps=['readiness'],
)

local_resource(
  name='create-user-fid-store',
  cmd='pnpm ts-node -T ./scripts/dynamodb-create-table.ts',
  env={
    'AWS_REGION': "localhost",
    'AWS_ACCESS_KEY_ID': LOCAL_AWS_ACCESS_KEY_ID,
    'AWS_SECRET_ACCESS_KEY': LOCAL_AWS_SECRET_ACCESS_KEY,
    'endpoint': "http://localhost:%s" % DYNAMO_DB_PORT,
    'table_name': USER_FID_STORE.table_name,
    'index_name': USER_FID_STORE.index_name,
    'partition_key': USER_FID_STORE.partition_key,
    'sort_key': USER_FID_STORE.sort_key,
    'index_sort_key': USER_FID_STORE.index_sort_key,
  },
  labels=['scripts'],
  resource_deps=['readiness'],
)

## 3.3. run

dc_resource(name='run-pushpin', labels=['run'])
dc_resource(name='run-dynamodb', labels=['run'])

local_resource(
  name='run-chat-integration',
  serve_cmd=" ".join([
    "pnpm -F @botpresshub/chat exec bp dev -v",
    "--secrets SIGNAL_URL=http://localhost:%s" % PUSHPIN_PRIVATE_PORT,
    "--secrets AUTH_ENCRYPTION_KEY=%s" % AUTH_ENCRYPTION_KEY,
    '--secrets FID_STORE_CONFIG="%s"' % encode_base64(encode_json({
      "strategy": "dynamo-db",
      "endpoint": "http://localhost:%s" % DYNAMO_DB_PORT,
      "region": "localhost",
      "accessKeyId": LOCAL_AWS_ACCESS_KEY_ID,
      "secretAccessKey": LOCAL_AWS_SECRET_ACCESS_KEY,
      "conversationTable": {
        "tableName": CONV_FID_STORE.table_name,
        "indexName": CONV_FID_STORE.index_name,
        "partitionKey": CONV_FID_STORE.partition_key,
        "sortKey": CONV_FID_STORE.sort_key,
        "indexSortKey": CONV_FID_STORE.index_sort_key,
      },
      "userTable": {
        "tableName": USER_FID_STORE.table_name,
        "indexName": USER_FID_STORE.index_name,
        "partitionKey": USER_FID_STORE.partition_key,
        "sortKey": USER_FID_STORE.sort_key,
        "indexSortKey": USER_FID_STORE.index_sort_key,
      }
    }))
  ]),
  serve_env={
    BP_HOME_ENV.key: BP_HOME_ENV.value,
    'BP_CONFIRM': 'true',
    'BP_TUNNEL_URL': API.bp_tunnel_url,
    'BP_PORT': str(CHAT_INTEGRATION_PORT),
  },
  resource_deps=['login-botpress', 'readiness', 'run-pushpin', 'create-conv-fid-store', 'create-user-fid-store'],
  labels=['run'],
  readiness_probe=probe(http_get=http_get_action(port=CHAT_INTEGRATION_PORT, path='/health'), period_secs=1, failure_threshold=10),
)

local_resource(
  name='run-echo-bot',
  cmd="pnpm -F echo exec bp add --use-dev -y -v",
  serve_cmd="pnpm -F echo exec bp dev -y --tunnel-url %s --port %s" % (API.bp_tunnel_url, ECHO_BOT_PORT),
  serve_env={
    BP_HOME_ENV.key: BP_HOME_ENV.value,
  },
  resource_deps=['login-botpress', 'run-chat-integration'],
  labels=['run'],
  readiness_probe=probe(http_get=http_get_action(port=ECHO_BOT_PORT, path='/health'), period_secs=1, failure_threshold=10),
)

## 3.3. test

# TODO: find a way to make this work without bash specific syntax
local_resource(
  name='test-chat-integration',
  cmd=" ".join([
    'wh_id=$(pnpm ts-node -T ./scripts/fetch-chat-wh.ts);',
    'API_URL=http://localhost:%s/$wh_id' % PUSHPIN_PUBLIC_PORT,
    'pnpm run -F @botpress/chat test:e2e'
  ]),
  env={
    BP_HOME_ENV.key: BP_HOME_ENV.value,
    'BP_API_URL': API.bp_api_url,
    'BP_TOKEN': CONFIG.bp_token,
    'BP_WORKSPACE_ID': CONFIG.bp_workspace_id,
    'ECHO_PATH': ECHO_BOT_PATH,
    'CHAT_PATH': CHAT_INT_PATH,
    'ENCRYPTION_KEY': AUTH_ENCRYPTION_KEY,   
  },
  resource_deps=['run-chat-integration', 'run-echo-bot'],
  labels=['test'],
)