Hooks
创建 Hook
安装一个自主 Hook,当匹配的事件发生时触发技能执行。
POST
/
api
/
v1
/
hooks
创建 Hook
curl --request POST \
--url https://api.example.com/api/v1/hooks \
--header 'Content-Type: application/json' \
--data '
{
"hook_preset_id": "<string>",
"event_pattern": "<string>",
"skill_slug": "<string>",
"cooldown_minutes": 123
}
'import requests
url = "https://api.example.com/api/v1/hooks"
payload = {
"hook_preset_id": "<string>",
"event_pattern": "<string>",
"skill_slug": "<string>",
"cooldown_minutes": 123
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
hook_preset_id: '<string>',
event_pattern: '<string>',
skill_slug: '<string>',
cooldown_minutes: 123
})
};
fetch('https://api.example.com/api/v1/hooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/v1/hooks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'hook_preset_id' => '<string>',
'event_pattern' => '<string>',
'skill_slug' => '<string>',
'cooldown_minutes' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/hooks"
payload := strings.NewReader("{\n \"hook_preset_id\": \"<string>\",\n \"event_pattern\": \"<string>\",\n \"skill_slug\": \"<string>\",\n \"cooldown_minutes\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/v1/hooks")
.header("Content-Type", "application/json")
.body("{\n \"hook_preset_id\": \"<string>\",\n \"event_pattern\": \"<string>\",\n \"skill_slug\": \"<string>\",\n \"cooldown_minutes\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/hooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"hook_preset_id\": \"<string>\",\n \"event_pattern\": \"<string>\",\n \"skill_slug\": \"<string>\",\n \"cooldown_minutes\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"event_pattern": "<string>",
"skill_slug": "<string>",
"enabled": true,
"cooldown_minutes": 123
}请求
string
内置 Hook 预设的 ID(例如
share.accepted.welcome、task.overdue.summary)。与 event_pattern 互斥。string
要匹配的自定义事件模式。支持精确匹配(
share.accepted)、通配符(order.*.completed)、前缀匹配(share)或全匹配(*)。与 hook_preset_id 互斥。string
必填
Hook 触发时要执行的技能 slug。
number
两次触发之间的最短间隔时间(分钟,1–1440)。省略时将应用服务端默认值。
响应
string
该 Hook 的唯一 UUID。
string
解析后的事件模式(来自预设或自定义)。
string
目标技能 slug。
boolean
创建时始终为
true。number
两次触发之间的冷却周期。
身份验证
需要具有completions 权限范围的 API 密钥。
示例
curl -X POST https://www.hitheo.ai/api/v1/hooks \
-H "Authorization: Bearer $THEO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event_pattern": "order.*.completed",
"skill_slug": "order-processor",
"cooldown_minutes": 5
}'
const hook = await theo.createHook({
event_pattern: "order.*.completed",
skill_slug: "order-processor",
cooldown_minutes: 5,
});
护栏
- 每次自主执行前进行预检信用额度检查
- 自主操作单独设有每日上限
- 对工具调用次数和总支出设有单次运行上限
- Hook 在连续失败后会自动暂停
- 强制执行两次触发之间的冷却时间
此页面对您有帮助吗?
创建 Hook
curl --request POST \
--url https://api.example.com/api/v1/hooks \
--header 'Content-Type: application/json' \
--data '
{
"hook_preset_id": "<string>",
"event_pattern": "<string>",
"skill_slug": "<string>",
"cooldown_minutes": 123
}
'import requests
url = "https://api.example.com/api/v1/hooks"
payload = {
"hook_preset_id": "<string>",
"event_pattern": "<string>",
"skill_slug": "<string>",
"cooldown_minutes": 123
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
hook_preset_id: '<string>',
event_pattern: '<string>',
skill_slug: '<string>',
cooldown_minutes: 123
})
};
fetch('https://api.example.com/api/v1/hooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/v1/hooks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'hook_preset_id' => '<string>',
'event_pattern' => '<string>',
'skill_slug' => '<string>',
'cooldown_minutes' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/hooks"
payload := strings.NewReader("{\n \"hook_preset_id\": \"<string>\",\n \"event_pattern\": \"<string>\",\n \"skill_slug\": \"<string>\",\n \"cooldown_minutes\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/v1/hooks")
.header("Content-Type", "application/json")
.body("{\n \"hook_preset_id\": \"<string>\",\n \"event_pattern\": \"<string>\",\n \"skill_slug\": \"<string>\",\n \"cooldown_minutes\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/hooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"hook_preset_id\": \"<string>\",\n \"event_pattern\": \"<string>\",\n \"skill_slug\": \"<string>\",\n \"cooldown_minutes\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"event_pattern": "<string>",
"skill_slug": "<string>",
"enabled": true,
"cooldown_minutes": 123
}