Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions app/src/components/skills/MeetingBotsCard.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import debug from 'debug';
import { type RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react';

import { type MascotFace, RiveMascot } from '../../features/human/Mascot';
Expand Down Expand Up @@ -34,6 +35,8 @@ import { RecentCallsSection } from './RecentCallsSection';

type Toast = { type: 'success' | 'error' | 'info'; title: string; message?: string };

const log = debug('meeting-bots');

interface Props {
onToast?: (toast: Toast) => void;
}
Expand Down Expand Up @@ -251,6 +254,7 @@ function MeetingBotsInline({ onToast, hasSubmittedRef }: MeetingBotsInlineProps)
mascotColor === 'custom'
? { primaryColor: customPrimaryColor, secondaryColor: customSecondaryColor }
: undefined;
const wakePhrase = listenOnly ? undefined : `Hey ${agentName}`;

// Success ('active') is handled by the parent MeetingBotsCard, which stays
// mounted across the inline→active view swap. The error path lives here
Expand All @@ -274,6 +278,13 @@ function MeetingBotsInline({ onToast, hasSubmittedRef }: MeetingBotsInlineProps)
hasSubmittedRef.current = true;
try {
const meetingId = crypto.randomUUID();
log('join submit %o', {
active: !listenOnly,
agentChars: agentName.length,
ownerChars: respondTo.trim().length,
wakeChars: wakePhrase?.length ?? 0,
correlationId: meetingId,
});
dispatch(setBackendMeetJoining({ meetUrl: meetUrl.trim(), meetingId, listenOnly }));
await joinMeetViaBackendBot({
meetUrl,
Expand All @@ -285,6 +296,7 @@ function MeetingBotsInline({ onToast, hasSubmittedRef }: MeetingBotsInlineProps)
riveColors,
correlationId: meetingId,
respondToParticipant: respondTo.trim() || undefined,
wakePhrase,
listenOnly,
});
} catch (err) {
Expand Down
11 changes: 10 additions & 1 deletion app/src/components/skills/__tests__/MeetingBotsCard.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ describe('MeetingBotsCard', () => {
agentName: 'Tiny',
// Participant-name field is wired to the backend authorized-speaker gate.
respondToParticipant: 'Alice',
// Active mode must give the backend a wake phrase so it can emit
// bot:in_call_request when the participant addresses the bot.
wakePhrase: 'Hey Tiny',
// Active toggle defaults to checked → listen-only false.
listenOnly: false,
})
Expand Down Expand Up @@ -109,6 +112,7 @@ describe('MeetingBotsCard', () => {
meetUrl: 'https://meet.google.com/abc-defg-hij',
displayName: 'Nova',
agentName: 'Nova',
wakePhrase: 'Hey Nova',
systemPrompt: 'Calm and concise.',
mascotId: 'yellow',
riveColors: { primaryColor: '#123456', secondaryColor: '#abcdef' },
Expand Down Expand Up @@ -188,7 +192,12 @@ describe('MeetingBotsCard', () => {
fireEvent.submit(document.querySelector('form')!);

await vi.waitFor(() => {
expect(joinMock).toHaveBeenCalledWith(expect.objectContaining({ listenOnly: true }));
expect(joinMock).toHaveBeenCalledWith(
expect.objectContaining({
listenOnly: true,
wakePhrase: undefined,
})
);
});
});
});
Expand Down
27 changes: 27 additions & 0 deletions app/src/services/backendMeetService.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,33 @@ describe('joinMeetViaBackendBot', () => {
);
});

it('forwards active meeting gates to the core RPC payload', async () => {
mockCallCoreRpc.mockResolvedValueOnce({
ok: true,
meet_url: 'https://meet.google.com/abc',
platform: 'gmeet',
});

await joinMeetViaBackendBot({
meetUrl: 'https://meet.google.com/abc',
respondToParticipant: ' Alice Chen ',
wakePhrase: ' Hey Tiny ',
correlationId: ' meet-123 ',
listenOnly: false,
});

expect(mockCallCoreRpc).toHaveBeenCalledWith(
expect.objectContaining({
params: expect.objectContaining({
respond_to_participant: 'Alice Chen',
wake_phrase: 'Hey Tiny',
correlation_id: 'meet-123',
listen_only: false,
}),
})
);
});

it('forwards mascotId as mascot_id', async () => {
mockCallCoreRpc.mockResolvedValueOnce({
ok: true,
Expand Down
6 changes: 3 additions & 3 deletions docs/README.de.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

<p align="center">
<a href="https://discord.tinyhumans.ai/">Discord</a> •
<a href="https://www.reddit.com/r/tinyhumansai/">Reddit</a> •
<a href="https://github.com/tinyhumansai/openhuman/discussions">Discussions</a> •
<a href="https://x.com/intent/follow?screen_name=tinyhumansai">X/Twitter</a> •
<a href="https://tinyhumans.gitbook.io/openhuman/">Doku</a> •
<a href="https://x.com/intent/follow?screen_name=senamakel">@senamakel folgen (Creator)</a>
Expand Down Expand Up @@ -80,7 +80,7 @@ OpenHuman ist ein quelloffener, agentenbasierter Assistent, der sich in deinen A

- **[Memory Tree](https://tinyhumans.gitbook.io/openhuman/features/memory-tree) + [Obsidian-Wiki](https://tinyhumans.gitbook.io/openhuman/features/obsidian-wiki)**: eine lokal-zentrierte Wissensbasis, aufgebaut aus deinen Daten und deinen Aktivitäten. Alles, was du verbindest, wird in Markdown-Chunks von ≤3k Tokens kanonisiert, bewertet und in hierarchische Zusammenfassungs-Bäume gefaltet, gespeichert in **SQLite auf deiner Maschine**. Dieselben Chunks landen als `.md`-Dateien in einem Obsidian-kompatiblen Vault, das du öffnen, durchstöbern und editieren kannst — inspiriert von Karpathys [obsidian-wiki-Workflow](https://x.com/karpathy/status/2039805659525644595).

- **Alles eingebaut**: Web-Suche, ein Web-Fetch-[Scraper](https://tinyhumans.gitbook.io/openhuman/features/native-tools), ein vollständiges Coder-Toolset (Dateisystem, Git, Lint, Test, Grep) und [native Sprache](https://tinyhumans.gitbook.io/openhuman/features/voice) (STT als Eingabe, ElevenLabs TTS als Ausgabe, Lippensynchronisation für das Maskottchen, Live-Google-Meet-Agent) sind ab Werk verdrahtet. Standardmäßig nutzt [Model-Routing](https://tinyhumans.gitbook.io/openhuman/features/model-routing) das OpenHuman-Backend, um das passende LLM für jede Workload auszuwählen und zu proxien (Reasoning, Fast oder Vision). Ein Abo umfasst alle Modelle. Keine "erst-ein-Plugin-installieren-um-Dateien-zu-lesen"-Hürde. [Optional lokale KI über Ollama](https://tinyhumans.gitbook.io/openhuman/features/model-routing/local-ai) für On-Device-Workloads.
- **Alles eingebaut**: Web-Suche, ein Web-Fetch-[Scraper](https://tinyhumans.gitbook.io/openhuman/features/native-tools), ein vollständiges Coder-Toolset (Dateisystem, Git, Lint, Test, Grep) und [native Sprache](https://tinyhumans.gitbook.io/openhuman/features/native-tools/voice) (STT als Eingabe, ElevenLabs TTS als Ausgabe, Lippensynchronisation für das Maskottchen, Live-Google-Meet-Agent) sind ab Werk verdrahtet. Standardmäßig nutzt [Model-Routing](https://tinyhumans.gitbook.io/openhuman/features/model-routing) das OpenHuman-Backend, um das passende LLM für jede Workload auszuwählen und zu proxien (Reasoning, Fast oder Vision). Ein Abo umfasst alle Modelle. Keine "erst-ein-Plugin-installieren-um-Dateien-zu-lesen"-Hürde. [Optional lokale KI über Ollama](https://tinyhumans.gitbook.io/openhuman/features/model-routing/local-ai) für On-Device-Workloads.

- **[Smarte Token-Kompression (TokenJuice)](https://tinyhumans.gitbook.io/openhuman/features/token-compression)**: Jeder Tool-Aufruf, jedes Scrape-Ergebnis, jeder E-Mail-Text und jeder Such-Payload läuft durch eine Token-Kompressionsschicht, bevor er ein LLM-Modell erreicht. HTML wird zu Markdown konvertiert, lange URLs werden gekürzt, und ausschweifende Tool-Ausgaben werden über eine konfigurierbare Regel-Ebene dedupliziert und zusammengefasst usw. CJK, Emojis und andere Multi-Byte-Texte bleiben Graphem für Graphem erhalten — niemals abgeschnitten. Du erhältst dieselbe Information bei einem Bruchteil der Tokens. Kosten und Latenz sinken um bis zu 80%.

Expand Down Expand Up @@ -133,7 +133,7 @@ Du hostest [agentmemory](https://github.com/rohitg00/agentmemory) bereits selbst
_Baust du auch in Richtung AGI und künstlichem Bewusstsein? Setze einen Stern und hilf anderen, den Weg zu finden._

<p align="center">
<a href="https://www.star-history.com/#tinyhumansai/openhuman&type=date&legend=top-left">
<a href="https://www.star-history.com">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=tinyhumansai/openhuman&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=tinyhumansai/openhuman&type=date&legend=top-left" />
Expand Down
6 changes: 3 additions & 3 deletions docs/README.ja-JP.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

<p align="center">
<a href="https://discord.tinyhumans.ai/">Discord</a> •
<a href="https://www.reddit.com/r/tinyhumansai/">Reddit</a> •
<a href="https://github.com/tinyhumansai/openhuman/discussions">Discussions</a> •
<a href="https://x.com/intent/follow?screen_name=tinyhumansai">X/Twitter</a> •
<a href="https://tinyhumans.gitbook.io/openhuman/">ドキュメント</a> •
<a href="https://x.com/intent/follow?screen_name=senamakel">@senamakel(作者)をフォロー</a>
Expand Down Expand Up @@ -80,7 +80,7 @@ OpenHuman は、あなたの日常生活に統合されるよう設計された

- **[Memory Tree](https://tinyhumans.gitbook.io/openhuman/features/memory-tree) + [Obsidian Wiki](https://tinyhumans.gitbook.io/openhuman/features/obsidian-wiki)**: あなたのデータとアクティビティから構築されるローカルファーストのナレッジベースです。接続したすべての情報は ≤3k トークンの Markdown チャンクへ正規化され、スコアリングされ、階層的なサマリーツリーに畳み込まれて **あなたのマシン上の SQLite** に保存されます。同じチャンクは Obsidian 互換のボルトに `.md` ファイルとして配置され、開いて閲覧・編集できます。Karpathy 氏の [obsidian-wiki ワークフロー](https://x.com/karpathy/status/2039805659525644595)にインスパイアされています。

- **電池同梱(Batteries included)**: ウェブ検索、ウェブフェッチ用[スクレイパー](https://tinyhumans.gitbook.io/openhuman/features/native-tools)、フルコーダーツールセット(ファイルシステム、git、lint、test、grep)、そして[ネイティブ音声](https://tinyhumans.gitbook.io/openhuman/features/voice)(STT 入力、ElevenLabs TTS 出力、マスコットのリップシンク、ライブ Google Meet エージェント)がデフォルトで組み込まれています。デフォルトで、[モデルルーティング](https://tinyhumans.gitbook.io/openhuman/features/model-routing)は OpenHuman バックエンドを使用して各ワークロードに適切な LLM(reasoning、fast、または vision)を選択およびプロキシします。一つのサブスクリプションですべてのモデルが含まれます。「ファイル読み込みのためにプラグインをインストール」という煩わしさはありません。デバイス上のワークロード向けに [Ollama によるオプショナルなローカル AI](https://tinyhumans.gitbook.io/openhuman/features/model-routing/local-ai) も利用できます。
- **電池同梱(Batteries included)**: ウェブ検索、ウェブフェッチ用[スクレイパー](https://tinyhumans.gitbook.io/openhuman/features/native-tools)、フルコーダーツールセット(ファイルシステム、git、lint、test、grep)、そして[ネイティブ音声](https://tinyhumans.gitbook.io/openhuman/features/native-tools/voice)(STT 入力、ElevenLabs TTS 出力、マスコットのリップシンク、ライブ Google Meet エージェント)がデフォルトで組み込まれています。デフォルトで、[モデルルーティング](https://tinyhumans.gitbook.io/openhuman/features/model-routing)は OpenHuman バックエンドを使用して各ワークロードに適切な LLM(reasoning、fast、または vision)を選択およびプロキシします。一つのサブスクリプションですべてのモデルが含まれます。「ファイル読み込みのためにプラグインをインストール」という煩わしさはありません。デバイス上のワークロード向けに [Ollama によるオプショナルなローカル AI](https://tinyhumans.gitbook.io/openhuman/features/model-routing/local-ai) も利用できます。

- **[スマートトークン圧縮 (TokenJuice)](https://tinyhumans.gitbook.io/openhuman/features/token-compression)**: すべてのツール呼び出し、スクレイプ結果、メール本文、検索ペイロードは、LLM モデルに渡される前にトークン圧縮レイヤーを通過します。HTML は Markdown に変換され、長い URL は短縮され、冗長なツール出力は設定可能なルールレイヤーで重複排除と要約が行われるなど…。CJK、絵文字などのマルチバイト文字は書記素(grapheme)単位で完全に保持され、除去されることはありません。同じ情報をわずかなトークン数で得られます。コストとレイテンシを最大 80% 削減します。

Expand Down Expand Up @@ -133,7 +133,7 @@ OpenHuman はその待ち時間をスキップします。アカウントを接
_AGI と人工意識への道を進んでいますか? リポジトリにスターをつけて、他の人にも道筋を見つけてもらいましょう。_

<p align="center">
<a href="https://www.star-history.com/#tinyhumansai/openhuman&type=date&legend=top-left">
<a href="https://www.star-history.com">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=tinyhumansai/openhuman&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=tinyhumansai/openhuman&type=date&legend=top-left" />
Expand Down
6 changes: 3 additions & 3 deletions docs/README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

<p align="center">
<a href="https://discord.tinyhumans.ai/">Discord</a> •
<a href="https://www.reddit.com/r/tinyhumansai/">Reddit</a> •
<a href="https://github.com/tinyhumansai/openhuman/discussions">Discussions</a> •
<a href="https://x.com/intent/follow?screen_name=tinyhumansai">X/Twitter</a> •
<a href="https://tinyhumans.gitbook.io/openhuman/">문서</a> •
<a href="https://x.com/intent/follow?screen_name=senamakel">@senamakel(제작자) 팔로우</a>
Expand Down Expand Up @@ -79,7 +79,7 @@ OpenHuman은 일상 생활에 통합되도록 설계된 오픈 소스 에이전

- **[메모리 트리(Memory Tree)](https://tinyhumans.gitbook.io/openhuman/features/memory-tree) + [Obsidian 위키](https://tinyhumans.gitbook.io/openhuman/features/obsidian-wiki)**: 당신의 데이터와 활동을 바탕으로 구축된 로컬 우선 지식 베이스입니다. 연결된 모든 것은 3k 토큰 이하의 Markdown 청크로 규격화되고 점수가 매겨지며, **당신의 머신에 있는 SQLite**에 저장되는 계층적 요약 트리로 접힙니다. 동일한 청크는 당신이 열고, 탐색하고, 편집할 수 있는 Obsidian 호환 볼트에 `.md` 파일로 저장됩니다. 이는 Karpathy의 [obsidian-wiki 워크플로우](https://x.com/karpathy/status/2039805659525644595)에서 영감을 받았습니다.

- **모든 것이 포함됨(Batteries included)**: 웹 검색, 웹 가져오기 [스크레이퍼](https://tinyhumans.gitbook.io/openhuman/features/native-tools), 전체 코더 툴셋(파일 시스템, git, lint, test, grep), 그리고 [네이티브 음성](https://tinyhumans.gitbook.io/openhuman/features/voice)(STT 입력, ElevenLabs TTS 출력, 마스코트 립싱크, 라이브 Google Meet 에이전트)이 기본적으로 연결되어 있습니다. 기본적으로 [모델 라우팅](https://tinyhumans.gitbook.io/openhuman/features/model-routing)은 OpenHuman 백엔드를 사용하여 각 워크로드에 적합한 LLM(추론, 고속 또는 비전)을 선택하고 프록시합니다. 하나의 구독에 모든 모델이 포함됩니다. "파일을 읽기 위해 플러그인 설치"와 같은 번거로움이 없습니다. 온디바이스 워크로드를 위해 [Ollama를 통한 선택적 로컬 AI](https://tinyhumans.gitbook.io/openhuman/features/model-routing/local-ai)를 지원합니다.
- **모든 것이 포함됨(Batteries included)**: 웹 검색, 웹 가져오기 [스크레이퍼](https://tinyhumans.gitbook.io/openhuman/features/native-tools), 전체 코더 툴셋(파일 시스템, git, lint, test, grep), 그리고 [네이티브 음성](https://tinyhumans.gitbook.io/openhuman/features/native-tools/voice)(STT 입력, ElevenLabs TTS 출력, 마스코트 립싱크, 라이브 Google Meet 에이전트)이 기본적으로 연결되어 있습니다. 기본적으로 [모델 라우팅](https://tinyhumans.gitbook.io/openhuman/features/model-routing)은 OpenHuman 백엔드를 사용하여 각 워크로드에 적합한 LLM(추론, 고속 또는 비전)을 선택하고 프록시합니다. 하나의 구독에 모든 모델이 포함됩니다. "파일을 읽기 위해 플러그인 설치"와 같은 번거로움이 없습니다. 온디바이스 워크로드를 위해 [Ollama를 통한 선택적 로컬 AI](https://tinyhumans.gitbook.io/openhuman/features/model-routing/local-ai)를 지원합니다.

- **[스마트 토큰 압축(TokenJuice)](https://tinyhumans.gitbook.io/openhuman/features/token-compression)**: 모든 도구 호출, 스크레이핑 결과, 이메일 본문 및 검색 페이로드는 LLM 모델에 전달되기 전에 토큰 압축 레이어를 거칩니다. HTML은 Markdown으로 변환되고, 긴 URL은 단축되며, 장황한 도구 출력은 구성 가능한 규칙 오버레이 등을 통해 중복 제거 및 요약됩니다. CJK, 이모지 및 기타 멀티바이트 텍스트는 자소(grapheme) 단위로 보존되며 절대 삭제되지 않습니다. 동일한 정보를 훨씬 적은 토큰으로 얻을 수 있어 비용과 지연 시간을 최대 80%까지 줄일 수 있습니다.

Expand Down Expand Up @@ -132,7 +132,7 @@ OpenHuman은 기다림을 생략합니다. 계정을 연결하고, [자동 가
_AGI와 인공 의식을 향해 나아가고 계신가요? 저장소에 스타를 눌러 다른 사람들도 이 길을 찾을 수 있도록 도와주세요._

<p align="center">
<a href="https://www.star-history.com/#tinyhumansai/openhuman&type=date&legend=top-left">
<a href="https://www.star-history.com">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=tinyhumansai/openhuman&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=tinyhumansai/openhuman&type=date&legend=top-left" />
Expand Down
Loading
Loading