company-watch
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCompany watch
公司监测
Answers "what was said about X lately" in one program, over the last 90 days unless the user names a window: episode counts per show from , the trend from , the catalog notes from , and quotes from about the entity. Then it turns "keep me posted on X" into a monitor that delivers. Research picks the entity ids: a company or person through , a topic through each of its spellings. The user's own monitors decide where they go: one that fits, or a new one the user confirms. Only the save runs in ; everything before it reads.
occurrencesmomentummentionssearchresolvearcmira_execute_writeRun each program with ; has the method reference.
arcmira_execute_readarcmira_describe通过一个程序回答“近期关于 X 说了什么”,默认覆盖过去 90 天,除非用户指定时间窗口:通过 获取每个节目中被提及的单集数,通过 获取趋势,通过 获取目录中的说明,并通过 获取关于该实体的引述。随后,把“持续告诉我 X 的动态”转化为一个会投递提醒的监控项。研究流程负责选定实体 ID:公司或人物通过 解析,话题则逐一解析其每种拼写。根据用户已有的监控项决定这些实体应放入哪里:放入一个合适的现有监控项,或在用户确认后新建。只有保存操作在 中运行;此前的所有操作都只是读取。
occurrencesmomentummentionssearchresolvearcmira_execute_write每个程序都应使用 运行; 提供方法参考。
arcmira_execute_readarcmira_describeWhen to use
何时使用
- what is being said about a company, product or brand lately, this month or this week, and is talk rising or fading
- did any show mention us, a competitor or an investor lately
- keep me posted on a company, a competitor, a person or a topic
- save what this research found to a monitor, or tell me when X comes up on a show
- watch a topic like "data center discourse" across shows
- 近期(本月或本周)关于某家公司、产品或品牌有哪些讨论,话题热度是在上升还是消退
- 近期是否有任何节目提到过我方、竞争对手或投资人
- 持续告诉我某家公司、竞争对手、人物或话题的最新动态
- 将本次研究找到的内容保存到监控项,或在某个节目提到 X 时通知我
- 跨节目追踪“数据中心讨论”之类的话题
Pick the entity the user meant
选定用户所指实体
Users give names; filters take ids only (ent_..., UC..., 11-character video ids), and a name where an id belongs throws .
id_required- Resolve the exact name the user said, with their own words about it as (a bare "Theo" has none).
context - and
bestgive the id. Asuggestedpick is an assumption: the answer names it, withsuggestedas the reason.suggested.evidence - : several entities fit, and
askgoes back to the user. No answer at all: the name is not in the index.ask.options
For this task:
- Resolve a company with no type (the catalog types some companies as product) and a person with . A company name is often a common word ("Linear", "Ramp", "ICE"): name each pick, for example "Linear, the software company (product, ent_279443)", so the user can catch a wrong one before it is answered or saved.
{ type: "person" } - A topic has spellings. Resolve each variant with ("data centers", "datacenters", "data centre", "data center") and keep every distinct id: one tracker per spelling catches what one would miss.
{ type: "topic" }
用户提供名称;筛选器只接受 ID(、 或 11 位视频 ID),若在应传 ID 的位置传入名称,则会抛出 。
ent_...UC...id_required- 使用用户自己的相关描述作为 ,解析用户提到的准确名称(仅提到“Theo”时不带上下文)。
context - 和
best会给出 ID。选取suggested意味着这是一项推测:回答中要明确指出该实体,并以suggested作为依据。suggested.evidence - :有多个实体都符合条件,此时
ask会返回给用户。若完全没有答案,则说明该名称不在索引中。ask.options
对于本任务:
- 解析没有指定 type 的公司,以及使用 的人物。目录可能会将某些公司归类为 product。公司名称常常是常见词(“Linear”“Ramp”“ICE”):每个候选项都应带上名称,例如“Linear,这家软件公司(product, ent_279443)”,以便用户在回答或保存前发现选错。
{ type: "person" } - 话题可能存在多种拼写。使用 逐一解析每个变体(“data centers”“datacenters”“data centre”“data center”),并保留所有不同的 ID:每种拼写对应一个追踪项,才能捕获仅用其他拼写会遗漏的内容。
{ type: "topic" }
Steps
步骤
- What was said lately: run the first program and answer.
- To follow the subject: the second program, in , resolves every name and topic spelling (reuse ids the research already found) and reads the user's monitors, what each follows, and the connected Slack workspaces.
arcmira_execute_read - To save: the third program, in , uses the monitor that fits or creates one, follows every id with
arcmira_execute_writeand every unresolved name withaddEntities, and returns each id that did not attach with its reason andaddName. Acurrent_monitor_namemeans the id was merged into that entity.canonical_entity_id
MONITORS. A monitor sends alerts for the entities it follows, by email to the account address or by Slack, realtime, hourly or daily. arcmira.monitors.list() lists the user's monitors and monitors.trackers(id) what one follows. Changes run only in arcmira_execute_write; nothing is deleted, and update(id, { paused: true }) pauses. Confirm the monitor and its delivery with the user before a write. create needs name and notify_frequency. Slack needs notify_slack: true and a workspace from arcmira.integrations.slack(): its id as slack_integration_id and default_channel_id as slack_channel_id; with none, the user connects one at https://arcmira.com/dashboard/integrations. addEntities takes up to 90 ids in one call. addName follows an exact name that resolve does not find (a show by its UC id). Topic spellings ("data centers", "datacenters") can be separate ids; follow each. A name may already be followed: list() and trackers(id) show what is, so check them before creating a monitor. A result with attached: false names its reason: entity_not_found, entity_type_not_trackable, tracker_limit_reached, or tracked_in_another_monitor (current_monitor_id names it; attachTrackers moves it once the user agrees). Creating a monitor uses no credits; each alert uses 25 credits from the account's plan, then its on-demand budget.
- 近期讨论了什么:运行第一个程序并给出答案。
- 要持续追踪该对象时:在 中运行第二个程序,解析所有名称和话题拼写(复用研究中已找到的 ID),并读取用户的监控项、每个监控项当前追踪的内容以及已连接的 Slack 工作区。
arcmira_execute_read - 要保存时:在 中运行第三个程序,使用合适的现有监控项或新建一个;通过
arcmira_execute_write关注每个 ID,通过addEntities添加每个未能解析但仍要关注的名称;返回每个未能附加的 ID 及其原因和addName。如果出现current_monitor_name,表示该 ID 已合并到对应实体中。canonical_entity_id
监控项。一个监控项会针对其关注的实体发送提醒,可通过电子邮件发往账户地址,也可通过 Slack 发送,频率可以是实时、每小时或每日。 列出用户的监控项, 显示某个监控项关注的内容。所有更改只能在 中运行;不会删除任何内容,使用 可暂停监控。写入前必须向用户确认监控项及投递方式。 需要 和 。使用 Slack 时需设置 ,并从 获取工作区:其 ID 用作 , 用作 ;如果尚未连接,则让用户前往 https://arcmira.com/dashboard/integrations 连接。一次 调用最多可添加 90 个 ID。 用于关注 无法找到的确切名称(例如以 UC ID 表示的节目)。话题的不同拼写(如“data centers”“datacenters”)可能是不同的 ID,需要分别关注。某个名称可能已经被关注:应通过 和 查看现状,并在创建监控项前完成检查。 的结果会列明原因:、、 或 (后者由 标识;用户同意后可通过 移动)。创建监控项不消耗 credits;每次提醒会先从账户套餐中消耗 25 credits,然后从按需预算中扣除。
arcmira.monitors.list()monitors.trackers(id)arcmira_execute_writeupdate(id, { paused: true })createnamenotify_frequencynotify_slack: truearcmira.integrations.slack()slack_integration_iddefault_channel_idslack_channel_idaddEntitiesaddNameresolvelist()trackers(id)attached: falseentity_not_foundentity_type_not_trackabletracker_limit_reachedtracked_in_another_monitorcurrent_monitor_idattachTrackersWorked program
可运行程序
Pass each block to as one program (a block marked arcmira_execute_write goes to that tool), with the name swapped for the user's. It opens with the pick: set to the user's own words about the name. When several entities fit it returns and runs nothing else. Show those options to the user, then run it again with set to the pick. Build date windows from and .
arcmira_execute_readCONTEXTaskIDarcmira.daysAgo(n)arcmira.today()将每个代码块作为单个程序传给 (标记为 的代码块则传给该工具),并把名称替换为用户的名称。程序首先进行实体选择:将 设置为用户对名称的原话。如果有多个实体符合条件,它会返回 且不运行其他操作。向用户展示这些选项后,将 设置为用户选中的选项并再次运行。使用 和 构建日期窗口。
arcmira_execute_readarcmira_execute_writeCONTEXTaskIDarcmira.daysAgo(n)arcmira.today()The last 90 days about one company (arcmira_execute_read)
最近 90 天内关于一家公司的信息(arcmira_execute_read)
javascript
const NAME = "Linear", CONTEXT = undefined, ID = null; // CONTEXT: the user's own words about the name, never a guess. After an ask, set ID to the picked option's id and run again
const r = ID ? null : await arcmira.resolve(NAME, { context: CONTEXT });
const e = r && (r.best ?? r.suggested);
if (r && !e) return { ask: r.ask };
const id = ID ?? e.id;
const assumed = Boolean(r?.suggested), why = r?.suggested?.evidence ?? null;
const after = arcmira.daysAgo(90); // the user's window when they name one ("this week": 7)
const [m, occ, notes] = await Promise.all([
arcmira.momentum(id),
arcmira.occurrences({ entityIds: [id], after, limit: 10 }),
arcmira.mentions({ entityId: id, after, limit: 8 }),
]);
let quotes = await arcmira.search({ query: m.entity.name, about: [id], after, limit: 5 });
const quotesTagged = quotes.chunks.length > 0; // false: the fallback matched the words, which can be a namesake; say so
if (!quotesTagged) quotes = await arcmira.search({ query: m.entity.name, after, limit: 5 });
return {
entity: { id, name: m.entity.name, type: m.entity.type, page: m.entity.page, assumed, why },
window: occ.window,
momentum: { verdict: m.verdict, last_7d: m.volume.mentions_7d, last_30d: m.volume.mentions_30d, prior_30d: m.volume.mentions_prior_30d, as_of: m.as_of },
shows: occ.rows.map(x => ({ show: x.channel_name, channel_id: x.channel_id, episodes: x.count, times_said: x.occurrences })),
context: notes.mentions.map(x => ({ show: x.media.source_channel?.name ?? null, episode: x.media.title, date: x.media.published_at, note: x.description })),
quotes_tagged_to_entity: quotesTagged,
quotes: quotes.chunks.map(c => ({ said: c.text.slice(0, 300), show: c.channel_name, episode: c.video_title, date: c.published_at, url: c.watch_url })),
};javascript
const NAME = "Linear", CONTEXT = undefined, ID = null; // CONTEXT: the user's own words about the name, never a guess. After an ask, set ID to the picked option's id and run again
const r = ID ? null : await arcmira.resolve(NAME, { context: CONTEXT });
const e = r && (r.best ?? r.suggested);
if (r && !e) return { ask: r.ask };
const id = ID ?? e.id;
const assumed = Boolean(r?.suggested), why = r?.suggested?.evidence ?? null;
const after = arcmira.daysAgo(90); // the user's window when they name one ("this week": 7)
const [m, occ, notes] = await Promise.all([
arcmira.momentum(id),
arcmira.occurrences({ entityIds: [id], after, limit: 10 }),
arcmira.mentions({ entityId: id, after, limit: 8 }),
]);
let quotes = await arcmira.search({ query: m.entity.name, about: [id], after, limit: 5 });
const quotesTagged = quotes.chunks.length > 0; // false: the fallback matched the words, which can be a namesake; say so
if (!quotesTagged) quotes = await arcmira.search({ query: m.entity.name, after, limit: 5 });
return {
entity: { id, name: m.entity.name, type: m.entity.type, page: m.entity.page, assumed, why },
window: occ.window,
momentum: { verdict: m.verdict, last_7d: m.volume.mentions_7d, last_30d: m.volume.mentions_30d, prior_30d: m.volume.mentions_prior_30d, as_of: m.as_of },
shows: occ.rows.map(x => ({ show: x.channel_name, channel_id: x.channel_id, episodes: x.count, times_said: x.occurrences })),
context: notes.mentions.map(x => ({ show: x.media.source_channel?.name ?? null, episode: x.media.title, date: x.media.published_at, note: x.description })),
quotes_tagged_to_entity: quotesTagged,
quotes: quotes.chunks.map(c => ({ said: c.text.slice(0, 300), show: c.channel_name, episode: c.video_title, date: c.published_at, url: c.watch_url })),
};Find what to follow, and the monitors that could hold it (arcmira_execute_read)
查找要关注的对象及可容纳它们的监控项(arcmira_execute_read)
javascript
const NAMES = ["Linear", "Height"], TOPICS = ["data centers", "datacenters", "data centre"]; // the user's subjects; TOPICS: every spelling of one topic
const follow = [], unresolved = [];
for (const n of NAMES) {
const r = await arcmira.resolve(n);
const e = r.best ?? r.suggested;
if (e) follow.push({ name: e.name, id: e.id, type: e.type, assumed: Boolean(r.suggested), why: r.suggested?.evidence ?? null });
else unresolved.push({ name: n, ask: r.ask ?? null });
}
for (const t of TOPICS) {
const r = await arcmira.resolve(t, { type: "topic" });
const e = r.best ?? r.suggested;
if (e && !follow.some(f => f.id === e.id)) follow.push({ name: e.name, id: e.id, type: e.type, spelling: t });
}
const [{ monitors }, { integrations }] = await Promise.all([arcmira.monitors.list(), arcmira.integrations.slack()]);
const existing = await Promise.all(monitors.slice(0, 10).map(async m => ({
id: m.id, name: m.name, paused: m.paused, frequency: m.notify_frequency, slack: Boolean(m.notify_slack),
follows: (await arcmira.monitors.trackers(m.id)).trackers.map(t => t.display_name ?? t.entity_name),
})));
const slack = integrations.map(i => ({ slack_integration_id: i.id, workspace: i.team_name, slack_channel_id: i.default_channel_id, channel: i.channels.find(c => c.id === i.default_channel_id)?.name ?? null }));
return { follow, unresolved, monitors: existing, more_monitors: Math.max(0, monitors.length - 10), slack };javascript
const NAMES = ["Linear", "Height"], TOPICS = ["data centers", "datacenters", "data centre"]; // the user's subjects; TOPICS: every spelling of one topic
const follow = [], unresolved = [];
for (const n of NAMES) {
const r = await arcmira.resolve(n);
const e = r.best ?? r.suggested;
if (e) follow.push({ name: e.name, id: e.id, type: e.type, assumed: Boolean(r.suggested), why: r.suggested?.evidence ?? null });
else unresolved.push({ name: n, ask: r.ask ?? null });
}
for (const t of TOPICS) {
const r = await arcmira.resolve(t, { type: "topic" });
const e = r.best ?? r.suggested;
if (e && !follow.some(f => f.id === e.id)) follow.push({ name: e.name, id: e.id, type: e.type, spelling: t });
}
const [{ monitors }, { integrations }] = await Promise.all([arcmira.monitors.list(), arcmira.integrations.slack()]);
const existing = await Promise.all(monitors.slice(0, 10).map(async m => ({
id: m.id, name: m.name, paused: m.paused, frequency: m.notify_frequency, slack: Boolean(m.notify_slack),
follows: (await arcmira.monitors.trackers(m.id)).trackers.map(t => t.display_name ?? t.entity_name),
})));
const slack = integrations.map(i => ({ slack_integration_id: i.id, workspace: i.team_name, slack_channel_id: i.default_channel_id, channel: i.channels.find(c => c.id === i.default_channel_id)?.name ?? null }));
return { follow, unresolved, monitors: existing, more_monitors: Math.max(0, monitors.length - 10), slack };Save to a monitor (arcmira_execute_write)
保存到监控项(arcmira_execute_write)
javascript
const MONITOR_ID = null; // a fitting monitor's id from the first program, or null to create one
const IDS = ["ent_279443"]; // every id the user agreed to follow
const NAMES = []; // names resolve found nothing for that the user still wants followed: [{ name: "Acme Robotics", type: "organization" }]
const DELIVERY = { name: "Linear", notify_frequency: "daily" }; // the user's answers, for a new monitor
const SLACK = null; // the user chose Slack: { slack_integration_id, slack_channel_id } from the first program's slack
const slack = SLACK ? { notify_slack: true, slack_integration_id: SLACK.slack_integration_id, ...(SLACK.slack_channel_id ? { slack_channel_id: SLACK.slack_channel_id } : {}) } : {};
const monitor = MONITOR_ID
? (SLACK ? (await arcmira.monitors.update(MONITOR_ID, slack)).monitor : { id: MONITOR_ID })
: (await arcmira.monitors.create({ ...DELIVERY, ...slack })).monitor;
const { results } = IDS.length ? await arcmira.monitors.addEntities(monitor.id, IDS) : { results: [] };
const byName = [];
for (const n of NAMES) {
try { byName.push(...(await arcmira.monitors.addName(monitor.id, [n])).results); }
catch (err) { byName.push({ name: n.name, code: err.code, message: err.message }); }
}
const others = results.some(r => r.reason === "tracked_in_another_monitor") ? (await arcmira.monitors.list()).monitors : [];
return {
monitor: { id: monitor.id, name: monitor.name ?? null, created: !MONITOR_ID, slack: Boolean(SLACK) },
attached: results.filter(r => r.attached).map(r => ({ entity_id: r.canonical_entity_id ?? r.entity_id, merged_from: r.canonical_entity_id ? r.entity_id : null, new_tracker: r.created })),
not_attached: results.filter(r => !r.attached).map(r => ({ entity_id: r.entity_id, reason: r.reason, tracker_id: r.tracker_id ?? null, current_monitor_id: r.current_monitor_id ?? null, current_monitor_name: others.find(m => m.id === r.current_monitor_id)?.name ?? null })),
by_name: byName,
};javascript
const MONITOR_ID = null; // a fitting monitor's id from the first program, or null to create one
const IDS = ["ent_279443"]; // every id the user agreed to follow
const NAMES = []; // names resolve found nothing for that the user still wants followed: [{ name: "Acme Robotics", type: "organization" }]
const DELIVERY = { name: "Linear", notify_frequency: "daily" }; // the user's answers, for a new monitor
const SLACK = null; // the user chose Slack: { slack_integration_id, slack_channel_id } from the first program's slack
const slack = SLACK ? { notify_slack: true, slack_integration_id: SLACK.slack_integration_id, ...(SLACK.slack_channel_id ? { slack_channel_id: SLACK.slack_channel_id } : {}) } : {};
const monitor = MONITOR_ID
? (SLACK ? (await arcmira.monitors.update(MONITOR_ID, slack)).monitor : { id: MONITOR_ID })
: (await arcmira.monitors.create({ ...DELIVERY, ...slack })).monitor;
const { results } = IDS.length ? await arcmira.monitors.addEntities(monitor.id, IDS) : { results: [] };
const byName = [];
for (const n of NAMES) {
try { byName.push(...(await arcmira.monitors.addName(monitor.id, [n])).results); }
catch (err) { byName.push({ name: n.name, code: err.code, message: err.message }); }
}
const others = results.some(r => r.reason === "tracked_in_another_monitor") ? (await arcmira.monitors.list()).monitors : [];
return {
monitor: { id: monitor.id, name: monitor.name ?? null, created: !MONITOR_ID, slack: Boolean(SLACK) },
attached: results.filter(r => r.attached).map(r => ({ entity_id: r.canonical_entity_id ?? r.entity_id, merged_from: r.canonical_entity_id ? r.entity_id : null, new_tracker: r.created })),
not_attached: results.filter(r => !r.attached).map(r => ({ entity_id: r.entity_id, reason: r.reason, tracker_id: r.tracker_id ?? null, current_monitor_id: r.current_monitor_id ?? null, current_monitor_name: others.find(m => m.id === r.current_monitor_id)?.name ?? null })),
by_name: byName,
};A good answer
理想回答
- For what was said: opens with the entity (name, type, id), gives the verdict with the 7-day and 30-day counts and , the shows with episode counts for the stated window, and two or three quotes in the speakers' words, each with show, date and
as_of.watch_url - Names every entity and topic spelling it will follow, with ids, and any it could not resolve.
- Suggests an existing monitor only after reading the user's monitors, and says which entities it already follows.
- Confirms the monitor and its delivery before saving; for Slack, uses a connected workspace, or links the connection page and says the monitor uses email until then.
- Names every id that did not attach and why, and asks before moving a tracker another monitor holds.
- After saving, says what arrives, where and how often, and how to pause it.
- 对于“近期讨论了什么”:先说明实体(名称、类型、ID),然后给出结论、7 天和 30 天计数及 ,列出所述时间窗口内各节目的单集计数,并提供两三段说话者原话引述,每段都附节目、日期和
as_of。watch_url - 列出将要关注的所有实体和话题拼写及其 ID,并指出任何无法解析的实体。
- 只有在读取用户的监控项后,才建议使用现有监控项,并说明它已经关注哪些实体。
- 保存前确认监控项和投递方式;对于 Slack,使用已连接的工作区,或提供连接页面链接并说明在此之前监控项使用电子邮件。
- 列出每个未能附加的 ID 及其原因,并在移动其他监控项持有的追踪项前征求用户同意。
- 保存后说明将收到什么通知、在哪里接收、接收频率,以及如何暂停。
Traps
注意事项
- Counts measure the shows Arcmira indexes, not the internet. An empty window means no indexed show said it; cite before saying nothing happened. Count episodes with
as_of, never by countingoccurrencesrows.mentions - Read episode titles and notes before asserting a lone mention: a title far from the company is a homonym the catalog mislabelled.
- A monitor id comes from , never from a name the user said.
monitors.list() - : the sign-in lacks monitors:write or trackers:write; reconnecting Arcmira with monitor changes allowed lifts it.
insufficient_scope - A topic spelling that resolves to the same id as another adds nothing; keep only distinct ids.
- 计数仅统计 Arcmira 已索引的节目,而非整个互联网。窗口为空意味着没有已索引节目提到过它;在断言“没有发生任何情况”前,应引用 。始终使用
as_of统计单集数,绝不能通过统计occurrences行数来代替。mentions - 在断言某次单独提及前,应先阅读单集标题和备注:如果标题与该公司相距甚远,这可能是目录误标的同名实体。
- 监控项 ID 来自 ,绝不能使用用户提供的名称作为 ID。
monitors.list() - :当前登录缺少
insufficient_scope或monitors:write权限;重新连接 Arcmira 并允许监控项变更即可解除。trackers:write - 如果某个话题拼写解析后与其他拼写得到相同 ID,则不会增加任何内容;只保留不同的 ID。
After the answer
回答之后
Monitors can follow what a research turn found, and each alert uses 25 credits from the account's plan, then its on-demand budget.
If anything was wrong, slow, or missing for the user, send one arcmira_feedback.
监控项可以持续跟踪某次研究找到的内容,每次提醒会先从账户套餐中消耗 25 credits,然后从按需预算中扣除。
如果结果对用户而言有错误、速度过慢或存在缺失,请发送一条 。
arcmira_feedback