@ arbidocs/ 反应
用于构建ARBI动力应用软件的反钩和提供商. 包括 @arbidocs/sdk 财务报告和审定财务报表 @tanstack/react-query -一个装置就能让你得到一切.
快速启动
npm install @arbidocs/react
1. 设立东道机构
import { QueryClientProvider } from '@tanstack/react-query'
import { ArbiHost, createArbiQueryClient } from '@arbidocs/react'
import { Arbi } from '@arbidocs/sdk/browser'
const { queryClient } = createArbiQueryClient()
const arbi = new Arbi({ url: 'https://www.arbidocs.com' })
function App() {
return (
<QueryClientProvider client={queryClient}>
<ArbiHost config={{ arbi }}>
<Chat />
</ArbiHost>
</QueryClientProvider>
)
}
<ArbiHost config> 是主机将配置交给钩子的地方: arbi,以及
可选择 session, (中文(简体) ), documents, (中文(简体) ), calendar, (中文(简体) ), mail, (中文(简体) ), account 财务报告和审定财务报表 dictate (每个加一个)
默认). @arbidocs/blocks 与块域一起再导出; 块址使用该块域
(见其研究).
assistantName 人们在聊天时称助理为: @<name>
在引用菜单中,一个共享线程的草稿开始,一个消息的名称被路由到
助理人员useAssistantName()) (中文(简体) ). 它默认为"ARBI". 以另一个名称键入
@ARBI 仍可联系助理(assistantLabels),并提及以更早的名字存储
仍然显示为筹码.
2. 建立流畅的聊天
import { useState, useRef } from 'react'
import { useArbi, useDocuments, useAssistantQuery } from '@arbidocs/react'
function Chat() {
const arbi = useArbi()
const [workspaceId, setWorkspaceId] = useState<string>()
if (!workspaceId) {
return (
<button
onClick={async () => {
await arbi.login('[email protected]', 'password')
const ws = await arbi.workspaces.list()
await arbi.selectWorkspace(ws[0].external_id)
setWorkspaceId(ws[0].external_id)
}}
>
Connect
</button>
)
}
return <ChatWindow workspaceId={workspaceId} />
}
function ChatWindow({ workspaceId }: { workspaceId: string }) {
const { data: docs } = useDocuments(workspaceId)
const mutation = useAssistantQuery()
const [input, setInput] = useState('')
const [response, setResponse] = useState('')
const lastId = useRef<string | null>(null)
return (
<div>
<div>{response}</div>
<form
onSubmit={(e) => {
e.preventDefault()
setResponse('')
mutation.mutate({
question: input,
docIds: docs?.map((d) => d.external_id) ?? [],
previousResponseId: lastId.current,
onToken: (t) => setResponse((r) => r + t),
onStreamStart: ({ assistant_message_ext_id }) => {
lastId.current = assistant_message_ext_id
},
})
setInput('')
}}
>
<input value={input} onChange={(e) => setInput(e.target.value)} />
<button type="submit" disabled={mutation.isPending}>
Send
</button>
</form>
</div>
)
}
就是这样——三个钩子,你有一个流畅的RAG聊天.
钩子
| 钩子 | 回返 | 自动启用时 |
|---|---|---|
useArbi() | Arbi 实例 | 永远 |
useWorkspaces() | 用户的工作空间 | 登录 |
useCurrentWorkspace() | 选定的工作空间( E)workspaceId, (中文(简体) ), workspaceStatus,其列表条目)和我 role 编号 : isMember 在其中( e) | 登录 |
useActiveConfigId() | 配置新工作与( 所选的, 否则是回复信件的, 否则是最后一个) | 永远 |
useShellWorkspaces(options) | 同样,在一个列表和 select 提供(不需要供应商) | 永远 |
useDocuments(workspaceId) | 工作空间文件 | 选择工作空间 |
useConversations(workspaceId) | 工作空间对话 | 选择工作空间 |
useTags(workspaceId) | 工作空间标签 | 选择工作空间 |
useTags(workspaceId, { kind, parentId, ids, include: ['links'], linksLimit }) | 标记已过滤, 包含每个人的文档、 事实和线索( 表格行) | 选择工作空间 |
useTagKindSchema(kind) 编号 : useUpdateTagKindSchema() | 工作空间中的一类字段( 表列); 设置 | 选择工作空间 |
useSetTagValues() | 将标记的值合并到同类字段 | 打电话 .mutate() |
useFactsSearch({ workspaceId }) | 事实 Smart Search: 查询框,上次搜索的点击(hybrid), search() 财务报告和审定财务报表 clear(),为本届会议保留 FACTS_SEARCH_VIEW | 选择工作空间 |
useAssistantQuery() | 流变 | 打电话 .mutate() |
useHealth() | 后端状态 | 过 { enabled: true } |
useProfile() 编号 : useUpdateProfile() | 用户名称、图片和电子邮件; 保存名称或图片 | 登录 |
useRequestEmailChange() 编号 : useConfirmEmailChange() | 通过校验码进行电子邮件更改 | 打电话 .mutate() |
usePasswordChange() | 更改主密码( 一个请求: 密码只包入账户密钥) | 打电话 .mutate() |
useNotificationPreferences(keys) | 电子邮件通知开关, 乐观保存 | 登录 |
useSessions() 编号 : useTerminateSession() 编号 : useLogoutAllSessions() | 活跃的会话,一端,在任何地方签名 | 登录 |
useDeleteAccount() | 关闭账户( 软删除) | 打电话 .mutate() |
useModelConnections() 编号 : useDirectModelUsage() | 主代理的模型连接(box and personal)和过去30天的直接通话 | 登录 |
useSaveModelConnection() 编号 : useRemoveModelConnection() 编号 : useUnlockModelConnections() | 保存个人连接( 其密钥被封入身份后, 在此会话上解锁) , 删除一个, 解锁个人密钥 | 打电话 .mutate() |
useFeature(name) 编号 : useFeatureSwitch(name) | 用户是否打开一个功能( T)<ArbiHost config={{ features }}>; 未列出:在),以及如何切换 | 永远 |
账户钩子对没有主机的SDK无控制器 arbi (单位:千美元)useNameEditor, (中文(简体) ),
useEmailChange, (中文(简体) ), usePasswordChangeForm, (中文(简体) ), useDeleteAccountFlow, (中文(简体) ), useAvatarCrop, (中文(简体) ),
toNotificationPreferences:他们拥有表态,并将保存作为函数. 块
/connect 条目将批量编成设置页面(见设置页面配方
docs/design/blocks-package.md) (中文(简体) ).
特征. 主机列出用户可以切换的产品部分,以及每个切换器在哪里
保存 : 用户设置的布尔字段( 跟着用户) 或此设备
(单位:千美元)createLocalFeatureStore({ key, migrate }),同步读取 localStorage· ; migrate
将一个早期的建筑的值带入一次). useFeature(name) 任意读取; 主机特性
因此,没有列出任何内容的网站.
const device = createLocalFeatureStore({ key: 'my-site-features' })
<ArbiHost config={{ features: {
skills: { userSetting: 'show_skills', default: false },
calls: { local: device, default: false },
} }}>
选中的工作空间 . 会议 workspaceId 财务报告和审定财务报表 workspaceStatus 住在工作区
存储; useSwitchWorkspace 移动它们 useOpenSelectedWorkspace 选择后重新打开
重装 给每分页保存的会话一个, 重新装入保留在工作区
(单位:千美元)createArbiSessionStore({}, { workspace: createArbiWorkspaceStore({ storage: browserWorkspaceStorage() }) })(三);
reset() 签到后,下一个人开始 工作空间列表. readWorkspaceLastOpened()
命令“最近的工作空间”列表.
线索分页. 公开对话是布局的 tabs.threads (按打开的顺序,于
多数 MAX_THREAD_TABS),与 tabs.activeThread 屏幕上的那个threadTabId它的对话,
或者说 new) (中文(简体) ). 每个标签都保留它留给的作曲家(ArbiThreadTabView:它的行,编辑,模型
和卷轴位置,它的草稿是聊天的,每对话一次) selectThreadTab 把它带回来
财务报告和审定财务报表 openThreadTab 打开最新消息的线索。 他们被保存在交叉 重装与
版式为 persist从来没有用什么打字.
说吧. 公开对话及其作曲家 每次对话的转折
上下文文档和事实,以及代理栏的队列和运行控制在聊天店中直播
(单位:千美元)createArbiChatStore({ layout, persist, draftStorage })),它随布局线条标签移动
并告诉读者每个标签更改一次。 与一个 persist (单位:千美元)createStoragePersist({ parse: parseSavedChat })公开对话及其台词、上下文、每个代理聊天的代理和
被选中的模型在重新装入后幸存下来; 草稿被分开保存, 被密封到个人身上
(单位:千美元)createSealedDraftStorage),并且只用于打开标签. createArbiSessionStore 在记忆中使用。 A 类
东道主自有状态的会话由各部分组成(composeArbiSessionStore({ layout, workspace, chat, documents })) (中文(简体) ).
文档. 正在查看的文档和查看者自己的状态(其标签、比较、标签)
请求的文本大小、 要打开的文字注释、 未保存的编辑、 弹出窗口、 文档
选中并选择一旦列出的文档、 粘贴在聊天上的文档、 草稿开始于
客户端( e)startDraftDocument(kind), (中文(简体) ), updateDraftDocument, (中文(简体) ), setDraftDocumentKind, (中文(简体) ),
clearDraftDocument),取景器中取取出段落的引文("取取取取")setPassageCitation)和
相关文档在文档存储处(createArbiDocumentSessionStore({ persist, showViewer })) (中文(简体) ). showViewer 是主机如何显示会议刚刚获得的文件的查看器(一个新的
草案, showNewDocument )),用于聊天文档. 与一个 persist (单位:千美元)load 是同步的,从
localStorage 例如,与 parseSavedDocuments),视图文件及其
页面、 被绑定的文档、 查看器的标签和文本大小会在任何内容之前重新装入
使。 。 .
对话设置. useConversationSettings() 是公开对话的标题和分享
(单位:千美元)saveTitle, (中文(简体) ), share, (中文(简体) ), unshare页:1 PATCH 中,服务器从
对话的工作空间)和配置模型的下个回合运行(resetToDefaults 滴数
被选中的那个).
人工活性编辑( I)@arbidocs/react/artifacts(中文(简体) )
useArtifactSession({ workspaceId, docId }) 装入一个文物, 持有编辑缓冲器, 保存为
新的不可更改版本(儿童文件通过 parent_ext_id),列出版本行并比较
有音轨变化的任何两个版本。 它返回道具为 @arbidocs/blocks/artifacts 组件 :
view (计: ArtifactEditor, (中文(简体) ), editorProps 财务报告和审定财务报表 redlineProps。下面的碎片是
SDK自由并可以自行使用: useArtifactEditSession (缓冲、基线、下流、拯救、),
比较), useRedline (用可插接的、有能力工作的) RedlineEngine, (中文(简体) ), buildVersionChain
财务报告和审定财务报表 versionLabel。 。 。 . useArtifactText, (中文(简体) ), useArtifactVersions 财务报告和审定财务报表 useSaveArtifactVersion 这是
SDK装订.
useArtifactText(docId) 返回干净的标记下和 a status (单位:千美元)loading, (中文(简体) ), parsing, (中文(简体) ), ready, (中文(简体) ),
error:新鲜上传被解析了几秒钟,其间后端回答404,422或
500,所以它以越来越大的延后(限制)进行回击 并且无法逃脱后端的被击倒
(单位:千美元)unescapeMarkdown;只用于从马克下沉储存的文物). useStreamedArtifact({ artifacts, workspaceId, settled }) 覆盖代理草稿的流、持久性和编辑寿命(phase数字 :
streaming, (中文(简体) ), persisting, (中文(简体) ), parsing, (中文(简体) ), ready, (中文(简体) ), error),将草案与
cleanDraftMarkdown (单位:千美元)unwrapCitationLinks, (中文(简体) ), stripAgentPreamble, (中文(简体) ), promoteBoldTitle在此之前
存储.
PDF 文档工具@arbidocs/react/document-tools(中文(简体) )
注释、标记、冻结、电子签名、签名检查和制作套件的数据方面:
DocumentToolsProvider (主机的API客户端,用户和回调; deploymentDomain 默认为
主机 arbi因为, useDeploymentDomain(), (中文(简体) ), fetchDocumentPdf (一个版本的) /view
PDF , (中文(简体) ), useDocumentMarkup, (中文(简体) ), createMarkupStore (单位:千美元) AnnotationStore 在服务器上标记
409合并),,, fetchMarkupPdf, (中文(简体) ), useDocumentSignatures, (中文(简体) ), useSignDocument, (中文(简体) ),
useSignatureVerification 财务报告和审定财务报表 buildProduction 编号 : saveProductionFiles。UI是 @arbidocs/blocks/document-tools; 见
“在另一个前端使用文档工具” @arbidocs/blocks 读取.
流回调
把这些递给 mutation.mutate() 并行 question 财务报告和审定财务报表 docIds数字 :
| 回电 | 说明 |
|---|---|
onToken(token) | 每个文本随其流而块化 |
onStreamStart({ assistant_message_ext_id }) | Stream 开始 —— 保存ID 用于后续查询 |
onAgentStep(step) | 代理工具的使用(搜索、阅读等) |
onError(message) | 流出时出错 |
onComplete() | 流线完成 |
查询客户端
createArbiQueryClient() 是每个ARBI主机股票的客户端(ARBI前端,以及块站点)
结束 defaultHost: 读取新鲜5分钟并保留了30个,用后退重试了两次,但从未
4xx(除408/429外)或读出退出; 写作从未重审; 写作被拒绝时
账户的删除正在等待,或者被客户端的设置断开器删除,告诉用户.
签了字就空了 queryClient.clear() (同一个例子,所以每个钩子都留着).
createArbiQueryClient({ persist: true }) ưμ㼯a persistOptions 页:1
<PersistQueryClientProvider> (单位:千美元)@tanstack/react-query-persist-client:文档元数据,
工作空间列表、设置、项目和应享权利都保存在这个设备上,用于离线启动
(从不包含文档内容),已排队下线(registerArbiMutationDefaults) (中文(简体) ). 打电话
claimOfflineQueue(userExtId) 在每个登录时, 所以一个前一个账户的队列里不会重播 .
ArbiWebSocketProvider 继续回放查询 onlineManager 与浏览器的网络同步
现场连接( 启动后一个空投的套接字计数) 和该人的“ 工作离线”
选择(useWorkOffline,一个短暂的会话视图, WORK_OFFLINE_VIEW) (中文(简体) ). useReconnect 拿着
最便宜的回路:它清除了"工作下线",说没有网络,或者重新装入.
离线邮件和日历
邮件保存在设备上, 封存到用户的密钥上, 绑入账户
只能由他们读取:在线阅读和搜索最近的信件(默认为最后7天);
每个设备,关闭 / 1 / 7 / 30 / 90天, useOfflineMailSettings),一个发送信号的收发箱
完全一次并按顺序重接(每个都保留其 request_id),稿件下线,以及
已下线的更改( 读取、 标记、 移动、 回收站、 删除) : queueMailChange, (中文(简体) ),
usePendingMailChanges, (中文(简体) ),
重新连接时按顺序应用。 在"工作离线"下面什么也没有 默认邮件客户端( 无)
东道主 mail(已读取) offlineMailReads,以及 defaultHost 内 @arbidocs/blocks
挂载运行时间, 并在签出时擦除邮件 。 一个拥有自己客户端和会话的主机添加
三块:
import { createMailClient, offlineMailReads, useOfflineMailRuntime, wipeOfflineMail } from '@arbidocs/react'
const client = createMailClient((path, init) => getArbi().mail.fetch(path, init), {
...offlineMailReads(getArbi), // reads answer from the device offline
})
useOfflineMailRuntime({ openOutbox }) // mounted once: sends the Outbox, applies changes, syncs
await wipeOfflineMail() // at sign-out
谈话(useMailConversations, (中文(简体) ), useMailThread设备上的逐行组合为
服务器是groupMailConversations, (中文(简体) ), mailConversationKey(三); useNativeThreadKeys 旧密钥
在背景中将本地邮件输入对话 .
邮箱用到 offlineMailSupport (单位:千美元)@arbidocs/blocks/connect作为设备存储器
默认; 每设备设置为 ConnectedMailOfflineSettings。 。 。 .
日历保存方式相同(它自己的被封存的数据库):读取由设备解答 离线, 和事件写出离线 等待在一个发件箱中, 重新播放一次 回到网上.
import { calendarOfflineSupport, useCalendarOfflineRuntime, wipeCalendarOffline } from '@arbidocs/react'
<ArbiHost config={{ calendar: { offline: calendarOfflineSupport } }}>…</ArbiHost>
useCalendarOfflineRuntime() // mounted once: replays the outbox on reconnect
await wipeCalendarOffline() // at sign-out
实时连接
<ArbiWebSocketProvider> 持有重新连接的套接字并应用每个站点的应用:
- 任务和存在;
- 聊天和打电话;
- 通知行;
- 完成运行( e)
response_complete:对话停止产生,后续离开 队列框, 背景运行被保存的文档被再次读取, 运行失败的 AI 使用 转到聊天主机onQuotaExceeded· ; - 对话、邮件草稿和技能活动.
转动后的信件会从服务器到达该人的其他标签(conversation.message_posted) (中文(简体) ).
主机处理其他信件类型 handlers类型,在 useArbiWebSocket
订阅者 :
<ArbiWebSocketProvider enabled={signedIn} handlers={useRemoteControlHandlers()}>
遥控. 一个 agt-… 请求驱动 UI 的助手( E)remote_control)是经同意的.
它的状态是一个会话瞬间视图( E)REMOTE_CONTROL_VIEW,从未保存;块的远程控制
在每次登录、签出、到期和用户变更时重新发送: useRemoteControl(selector) 读取
这, remoteControlActions(session) 改变它(reset() 回到开始,
财务报告和审定财务报表 toRemoteControlRequest(message, isSequenceId) 将信件缩小为可运行的请求。 这个
操作者、迅速同意和引导光标是 @arbidocs/blocks'
(单位:千美元)useRemoteControlHandlers, (中文(简体) ), ConnectedRemoteControlConsent) (中文(简体) ).
缓存无效
import { arbiQueryKeys } from '@arbidocs/react'
import { useQueryClient } from '@tanstack/react-query'
const queryClient = useQueryClient()
queryClient.invalidateQueries({ queryKey: arbiQueryKeys.documents(workspaceId) })
同伴依赖关系
react第18条
任务、代理、技能、联系人和人工智能的使用
Hooks for a "AI workers" and a message screen. 虎克为"AI 劳动力"和一条信息屏. 写入无效通过 arbiQueryKeys这样
useTasks, (中文(简体) ), useAgents, (中文(简体) ), useConfigs 财务报告和审定财务报表 useChats 自己来刷新.
const create = useCreateTask() // mutateAsync(CreateTaskRequest) -> TaskResponse
const run = useRunTask() // approves a run parked for access (temporary grant), then runs
const runs = useTaskRuns(taskId) // polls while a run is in flight
const save = useSaveAgentConfig() // { agentExtId, sections: { Agents: { PERSONA, ... } } }
const grant = useGrantAgentAccess() // { agentExtId, workspaceId, mode?: { kind: 'standing' | 'temporary' } }
const contacts = useContacts() // + useInviteContacts(), useCreateContact(), useUpdateContact(), useDeleteContact()
表格对请求绘图taskComposerToCreateRequest, (中文(简体) ), composePersona, ) 属于
@arbidocs/blocks/agents. AI的使用报告于 英镑 (按增值税计算),不是美元:使用
formatGbp(n) (单位:千美元)£0.47, (中文(简体) ), £12.40,整磅为 £10)和 metered 打开旗子 useProjectUsage
(单位:千美元)false = 此部署不记录使用。 信使(a)
边面板,或信件页面上的列表和线程部分)是 ConnectedMessenger 内
@arbidocs/blocks/connect。见 docs/design/blocks-package.md
("hooks and maping a host 不应重写").
useSessionPageTab(page, fallback) 读取和写入主机会话中选中的页面标签
views.tabs保存在导航和再装入中 主机提供默认标签 .
使用 useSessionView(key, fallback) 持续页面首选项和 useTransientView 页:1
只有会话过滤器或一拍请求 。 三者都使用与工具包相同的会话布局.