Connector
ActQLに同梱される17のConnector、接続の設定のしかた、各Connectorのページに書いてあること。
Connectorは、ActQLを1つの外部システムにつなぎます。プログラムから見えるのは salesforce.accounts のような名前だけで、認証、ページング、レート制限、各APIの形はConnectorの中に収まります。このページでは、ActQLに同梱されるConnectorの一覧、Connectorの設定のしかた、そして各Connectorのページに共通する内容を説明します。
どのConnectorも読み取りと書き込みの両方に対応し、17種類すべてが同じモデルで動きます。check が検証する型付きの読み取り元、プレビューと承認を通るEffectと操作、そして記録され突き合わせられる結果です。対象がDWHのテーブルでも、CRMのレコードでも、Slackのチャンネルでも、バケットでも変わりません。
Connectorの一覧
| 分類 | Connector | 読み取り | レコードのEffect | テーブルとコンテンツ | 操作 |
|---|---|---|---|---|---|
| データベース・DWH | Snowflake | テーブル、ビュー、ステージのファイル | 追加、更新、UPSERT、削除 | テーブル作成、ステージへの保存 | プロシージャ呼び出し、タスク実行 |
| データベース・DWH | BigQuery | テーブル、ビュー | 追加、更新、UPSERT、削除 | テーブル作成、GCSからのロード | プロシージャ呼び出し、クエリジョブ実行 |
| データベース・DWH | DuckDB | テーブル、ビュー | 追加、更新、UPSERT、削除 | テーブル作成、ファイルへのコピー | —対象外 |
| SaaS | Salesforce | オブジェクト、ファイル | 追加、更新、UPSERT、削除 | ファイルの保存 | リードの変換、メール送信 |
| SaaS | HubSpot | オブジェクト、関連、エンゲージメント | 追加、更新、UPSERT、削除 | —対象外 | 関連付け、ワークフロー登録 |
| SaaS | Notion | データベース、ページ、ページ本文 | 追加、更新、UPSERT、アーカイブ | ファイルブロックの保存 | ブロックの追記 |
| SaaS | kintone | アプリ、サブテーブル、添付ファイル | 追加、更新、UPSERT、削除 | 添付ファイルの保存 | ステータス更新 |
| SaaS | Slack | チャンネル、メッセージ、ユーザー、ファイル | メッセージの更新、削除 | ファイル共有 | 投稿、返信、リアクション、チャンネルのアーカイブ |
| SaaS | GitHub | Issue、PR、コメント、リポジトリのファイル | 追加、更新、削除 | ファイルのコミット | マージ、クローズ、レビュー依頼、ラベル追加 |
| SaaS | Tableau | ワークブック、データソース、ビュー、ビューのデータ、フロー | 更新、削除 | データソースの公開 | 更新処理、フロー実行 |
| Google Sheets | 宣言した範囲 | 宣言したキーによる行の追加、更新、UPSERT、削除 | 範囲の置換、新しいシート | 範囲のクリア | |
| Google Drive | ファイル、フォルダ、内容、コメント | 更新、削除(ゴミ箱) | アップロード | コピー、共有、完全削除 | |
| Gmail | メッセージ、スレッド、ラベル、下書き、添付ファイル | ラベル更新、ゴミ箱、下書き作成 | 下書きへの添付 | 送信、返信、転送、完全削除 | |
| Google Calendar | カレンダー、イベント、空き時間 | 追加、更新、UPSERT、削除 | —対象外 | 出欠の回答、移動 | |
| ストレージ・ファイル | Google Cloud Storage | オブジェクト、内容 | メタデータ更新、削除 | アップロード | コピー、結合 |
| ストレージ・ファイル | Amazon S3 | オブジェクト、内容 | メタデータ更新、削除 | アップロード | コピー、復元 |
| ストレージ・ファイル | ローカルファイル | 宣言したテーブル、ファイル、内容 | 削除 | テーブル作成、保存、ファイルの書き出し | 移動 |
似た名前の3つのもの
- Connectorは実装です。SalesforceやSnowflakeと話す方法を知っているコードです。
- **接続(connection)**は、その設定済みのインスタンス1つです。名前、接続先やアカウント、認証情報を持ちます。
salesforce_prodとsalesforce_sandboxは、1つのConnectorの2つの接続です。 - リソースは、接続が公開するもの(オブジェクト、テーブル、チャンネル)です。そのSourceViewは、それを読むための型付きでバージョン付きの契約で、列、型、キー、ページングを定めます。
プログラムの中でのConnectorの見え方
どのリソースも、接続名の下にあるテーブル形の読み取り元です。
FROM salesforce.accounts AS a
JOIN snowflake.usage_30d AS u ON a.id = u.account_id
|> WHERE u.trend = 'down'列とその型はConnectorから来るので、check は何かを読む前に、それらに照らしてプログラムを検証します。
書き込みはEffectです。レコードのEffectは、接続、リソース、キーを指定します。
|> EFFECT UPDATE salesforce.Account
ID id SET (Churn_Risk__c = risk.value.level)送信、投稿、更新処理の開始、ジョブの起動といった操作もEffectです。EFFECT COMMAND と操作の名前で宣言します。
FROM notifications
|> EFFECT COMMAND slack.post
TARGET channel
ID notification_id
INPUT (text = message);slack.post は、Connectorが公開するバージョン付きのCommand契約1つに解決されます。入力の項目と型、対象となるリソース、必要な権限、プレビューに出る内容、結果の確認方法です。Gmailの send、Tableauの refresh、Slackの post、Driveへのアップロードは、すべてこの1つのモデルを通ります。レコードの書き込みも操作も、同じようにプレビューされ、判断され、記録されます。Effectと承認を参照してください。
ファイルとコンテンツ
Google Drive、Google Cloud Storage、Amazon S3、ローカルファイルの4つはファイルを扱うConnectorで、Snowflake、Salesforce、Notion、kintone、Slack、GitHub、Gmailもファイルの内容を公開します。どれも同じ規則に従います。
| ステップ | 役割 |
|---|---|
LIST_FILES(connection.listing, …)(一覧の読み取り元が1つの接続なら接続名だけ) | メタデータだけ。resource、version、path、サイズ、種類。何もダウンロードしない |
JOIN connection.contents ON resource AND version | ちょうどそのバージョンの内容を、media_type 付きの content_ref として読む |
content_ref | 取り込んだバイト列への型付きの参照。INFER に渡す、別の場所に保存する、形式を宣言したConnectorを通して型付きのテーブルとして読む、ができる |
SERIALIZE | レコードを1つのファイルのコンテンツにする。アップロードはしない |
EFFECT STORE | コンテンツをオブジェクト、ファイル、ステージに書く。またはレコードを宣言済みのテーブルに書く |
CREATE [OR REPLACE] TABLE | カタログを持つConnectorに、レコードを新しいテーブルとして書く |
一覧と読み取りを分けているのには理由があります。プログラムが読むバージョンを正確に指定でき、バイト数の上限が決まったファイルの集合に適用され、Runの途中で置き換えられたファイルは別のバージョンとして扱われ、黙って同じ文書になることがないからです。プログラム側の書き方はファイルを扱うにあります。
接続と認証情報
接続は、actql.config.json が connectors として指すファイル(既定は connectors.json)に書きます。接続ごとに1エントリです。
{
"version": "actql-connectors/0.1",
"connections": {
"salesforce": {
"connector": "salesforce",
"instance_url": "https://acme.my.salesforce.com",
"credentials": {"access_token": {"env": "SALESFORCE_ACCESS_TOKEN"}}
},
"snowflake": {
"connector": "snowflake",
"account": "acme-eu",
"warehouse": "ANALYTICS",
"database": "PRODUCT",
"schema": "USAGE",
"credentials": {"private_key": {"env": "SNOWFLAKE_PRIVATE_KEY"}}
}
}
}秘密情報をファイルに書くことはありません。認証情報の項目には、環境変数({"env": "…"})かファイル({"path": "…"})を指定します。Hostが値を保持し、ポリシーが許可した操作のときだけConnectorに貸し出します。プログラムから、設定にないURL、認証情報、接続を指定することはできません。Hostはこのファイルを内部で使うConnectorのマニフェストに変換します。マニフェストを手で書くことはありません。
同じConnectorを別の名前で2つの接続にできます。たとえば salesforce_prod と salesforce_sandbox で、プログラムは必要なほうを参照します。
ローカルとCloud。 ローカルのHostでは、自分の認証情報を用意して使います。ActQL Cloudは、プロバイダーが承認済みアプリを求めるConnectorについて、ホスト型のOAuthを追加します。その承認が済んでいないあいだも、CloudはローカルのHostと同じ認証情報ベースの設定を受け付けます。アカウントに何が必要かは、各Connectorのページにあります。今日動くConnectorは実装状況にあります。
catalog show が教えてくれること
actql catalog show salesforce は、Hostが保存しているCatalogから、その接続についてプログラムが頼りにできるものをすべて表示します(catalog refresh はシステムに問い合わせ直します)。
Connection salesforce (Salesforce, catalog revision 2026-10-14T09:12Z)
Sources
accounts key id id string, name string, description string, industry string, …
contacts key id id string, account_id string, email string, …
Effects
Account insert, update, upsert (External_Id__c), delete preview full_diff
Contact insert, update, upsert, delete preview full_diff
ContentVersion store preview targeted
Operations
convert_lead TARGET Lead INPUT (account_id string?, opportunity_name string?)
send_email INPUT (template string, to string)
Capabilities
projection, filter (=, !=, <, >, IN, LIKE, IS NULL), order, limit
Permissions
read: accounts.read, contacts.read
write: Account.update, Account.create, …エージェントは推測ではなく、これを見てプログラムを書きます。
mockプロファイル
--profile mock(CLI)または profile: 'mock'(SDK)は、すべての接続をmockに置き換えます。mockは mock.data のレコードを返し、書き込みをそのレコードに反映するので、認証情報なしでレコードを作って読み返すところまで試せます。クイックスタートは、解約リスクのプログラムをこの方法で動かします。
本物の接続への切り替えは設定の変更であって、プログラムの変更ではありません。読み取り元の名前、列、キー、Mapping、操作がmockと本物で同じ意味を持つかぎり、プログラムはそのまま動きます。本物のシステムが違っていれば(項目名が変わっている、オブジェクトがない)、check がその差分を報告します。黙って別の解釈で動くことはありません。
Capabilityとプッシュダウン
各Connectorは、そのシステム自身が計算できること(読み取り元で選べる列、適用できる絞り込み、集計・並べ替え・JOINができるか)と、その結果がActQLの意味を正確に保つ条件(NULLの扱い、照合順序、数値の精度)を宣言します。プランナーはその条件のもとでだけ処理をシステムの中で実行し、残りはエンジンで実行します。各ステップがどこに行ったかは explain が示します。Capabilityは権限ではありません。保護された境界(読み取り、LLMへのデータ送信、Effect)のそれぞれで、Hostはその操作が許可されているかを確認します。Planとプッシュダウンを参照してください。
各Connectorのページにあるもの
| 節 | 分かること |
|---|---|
| 読み取り元 | リソース、その列、キー、読み取りの範囲 |
| 型 | システムの型と、それがどのActQLの型になるか。精度が保たれるところと、未対応の型 |
| Effectと操作 | すべてのEffectと操作。対象、入力、結果 |
| セットアップ | 接続のエントリ、ローカルのHostに必要な認証情報と権限、Cloudで提供されるもの |
| Capabilityとプッシュダウン | システムの中で実行される演算と、ActQLの意味を保つ条件 |
| プレビューと突き合わせ | プレビューの作り方(full_diff か targeted)と適用時の検証、応答喪失時に結果を確定させる証跡 |
| 上限と費用 | ページング、レート制限、読み取りの上限、外部システムの課金 |
| 例 | 読み取りだけのプログラム1つと、Effectか操作を含むプログラム1つ |
一覧にないシステムをつなぎたいときは、Connectorを作るで、Connectorが何を宣言し、どう書くかを説明しています。
Source: actql/actql/docs/connectors/README.md at d904416674e4 · Edit on GitHub