@teamlearners/clawops 0.5.5 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -128,6 +128,36 @@ declare function mcpServerHTTP(options: {
128
128
  headers?: Record<string, string>;
129
129
  }): MCPServerHTTP;
130
130
 
131
+ interface ProviderInfo {
132
+ provider: string;
133
+ model: string;
134
+ }
135
+ interface SessionTelemetry {
136
+ sessionType: string;
137
+ llm: ProviderInfo | null;
138
+ stt: ProviderInfo | null;
139
+ tts: ProviderInfo | null;
140
+ voice: string | null;
141
+ language: string;
142
+ greetingEnabled: boolean;
143
+ recordingEnabled: boolean;
144
+ toolCount: number;
145
+ mcpServerCount: number;
146
+ builtinTools: string[];
147
+ }
148
+ interface CallMetrics {
149
+ firstResponseMs: number | null;
150
+ turnCount: number;
151
+ toolCallCount: number;
152
+ toolErrorCount: number;
153
+ bargeInCount: number;
154
+ endReason: string | null;
155
+ errors: Array<{
156
+ type: string;
157
+ message: string;
158
+ }>;
159
+ }
160
+
131
161
  /**
132
162
  * CallSession represents an active phone call and provides methods to
133
163
  * send audio, hang up, and listen for lifecycle events.
@@ -173,6 +203,8 @@ declare class CallSession {
173
203
  private _handlers;
174
204
  private _endedPromise;
175
205
  private _resolveEnded;
206
+ private _metrics;
207
+ private _firstResponseSent;
176
208
  constructor(options: {
177
209
  callId: string;
178
210
  fromNumber: string;
@@ -184,6 +216,13 @@ declare class CallSession {
184
216
  setLogger(logger: Logger): void;
185
217
  get status(): CallStatus;
186
218
  get duration(): number;
219
+ get metrics(): Readonly<CallMetrics>;
220
+ recordFirstResponse(): void;
221
+ recordTurn(): void;
222
+ recordToolCall(): void;
223
+ recordToolError(err: Error): void;
224
+ recordBargeIn(): void;
225
+ recordEndReason(reason: string): void;
187
226
  /** Bind transport functions (called internally by the agent). */
188
227
  _bindTransport(send: SendAudioFn, clear: ClearAudioFn, hangup: HangupFn, sendDtmf?: SendDtmfFn, isConnected?: () => boolean): void;
189
228
  /** Send PCM16 or ulaw audio to the caller. */
@@ -272,6 +311,8 @@ interface Session {
272
311
  stop(): Promise<void>;
273
312
  /** Set the logger instance for this session. */
274
313
  setLogger?(logger: Logger): void;
314
+ /** Return session telemetry for reporting. */
315
+ getTelemetry?(): SessionTelemetry | null;
275
316
  }
276
317
  /**
277
318
  * Speech-to-Text provider interface.
@@ -470,6 +511,73 @@ declare class AudioRecorder {
470
511
  stop(): void;
471
512
  }
472
513
 
514
+ /**
515
+ * PipelineSession orchestrates STT -> LLM -> TTS for a voice call.
516
+ */
517
+
518
+ interface PipelineSessionOptions {
519
+ stt: STT;
520
+ llm: LLM;
521
+ tts: TTS;
522
+ /** System prompt for the LLM. */
523
+ systemPrompt?: string;
524
+ /** Send initial greeting. Default: true */
525
+ greeting?: boolean;
526
+ /** Language code. Default: 'ko' */
527
+ language?: string;
528
+ /** Tool registry for function calling. */
529
+ toolRegistry?: ToolRegistry;
530
+ /** Audio recorder for the session. */
531
+ recorder?: AudioRecorder;
532
+ /** LLM temperature. */
533
+ temperature?: number;
534
+ /** Max tokens for LLM generation. */
535
+ maxTokens?: number;
536
+ /** Sample rate for audio. Default: 8000 */
537
+ sampleRate?: number;
538
+ /** Whether to interrupt TTS when user starts speaking. Default: true */
539
+ interruptOnSpeech?: boolean;
540
+ }
541
+ declare class PipelineSession implements Session {
542
+ private _stt;
543
+ private _llm;
544
+ private _tts;
545
+ private _systemPrompt;
546
+ private _greeting;
547
+ private _language;
548
+ private _temperature;
549
+ private _maxTokens;
550
+ private _sampleRate;
551
+ private _interruptOnSpeech;
552
+ private _callSession;
553
+ private _tools;
554
+ private _recorder;
555
+ private _conversation;
556
+ private _audioBuffer;
557
+ private _running;
558
+ private _speaking;
559
+ private _builtinTools;
560
+ private _log;
561
+ constructor(options: PipelineSessionOptions);
562
+ setToolRegistry(registry: ToolRegistry): void;
563
+ setRecorder(recorder: AudioRecorder): void;
564
+ setBuiltinTools(tools: Set<BuiltinTool>): void;
565
+ getTelemetry(): SessionTelemetry;
566
+ setLogger(logger: Logger): void;
567
+ start(callSession: CallSession, tools?: ToolRegistry): Promise<void>;
568
+ feedAudio(audio: Buffer): void;
569
+ feedDtmf(digits: string): Promise<void>;
570
+ stop(): Promise<void>;
571
+ private _runSttLoop;
572
+ private _createAudioStream;
573
+ private _generateGreeting;
574
+ private _handleUserSpeech;
575
+ private _buildEffectiveTools;
576
+ private _respond;
577
+ private _handleToolCall;
578
+ private _synthesizeAndSend;
579
+ }
580
+
473
581
  /**
474
582
  * OpenAI Realtime API session (speech-to-speech).
475
583
  *
@@ -487,8 +595,13 @@ interface OpenAIRealtimeOptions {
487
595
  voice?: string;
488
596
  /** Language code (BCP 47). Default: 'ko' */
489
597
  language?: string;
490
- /** VAD eagerness: 'low', 'medium', 'high'. Default: 'high' */
491
- eagerness?: string;
598
+ /**
599
+ * Turn detection configuration. Default: semantic_vad with eagerness 'medium'.
600
+ * - `{ type: 'semantic_vad', eagerness?: 'low'|'medium'|'high'|'auto', interrupt_response?: boolean }`
601
+ * - `{ type: 'server_vad', threshold?: number, silence_duration_ms?: number, prefix_padding_ms?: number }`
602
+ * - `null` to disable turn detection
603
+ */
604
+ turnDetection?: Record<string, unknown> | null;
492
605
  /** Send initial greeting. Default: true */
493
606
  greeting?: boolean;
494
607
  }
@@ -498,21 +611,21 @@ declare class OpenAIRealtime implements Session {
498
611
  private _model;
499
612
  private _voice;
500
613
  private _language;
501
- private _eagerness;
614
+ private _turnDetection;
502
615
  private _greeting;
503
616
  private _log;
504
617
  private _builtinTools;
505
618
  setLogger(logger: Logger): void;
506
619
  setBuiltinTools(tools: Set<BuiltinTool>): void;
620
+ getTelemetry(): SessionTelemetry;
507
621
  private _ws;
508
622
  private _call;
509
623
  private _tools;
510
624
  private _recorder;
511
625
  private _closed;
512
- private _lastAssistantItem;
513
- private _responseStartTs;
514
- private _sentAudioChunks;
515
- private _audioRemainder;
626
+ private _playback;
627
+ private _latestMediaTs;
628
+ private _pendingToolCalls;
516
629
  private _responseInProgress;
517
630
  private _onResponseDone;
518
631
  constructor(options?: OpenAIRealtimeOptions);
@@ -578,6 +691,7 @@ declare class GeminiRealtime implements Session {
578
691
  setRecorder(recorder: AudioRecorder): void;
579
692
  setBuiltinTools(tools: Set<BuiltinTool>): void;
580
693
  setLogger(logger: Logger): void;
694
+ getTelemetry(): SessionTelemetry;
581
695
  start(callSession: CallSession, tools?: ToolRegistry): Promise<void>;
582
696
  feedAudio(audio: Buffer): void;
583
697
  feedDtmf(digits: string): Promise<void>;
@@ -589,72 +703,6 @@ declare class GeminiRealtime implements Session {
589
703
  private _handleToolCall;
590
704
  }
591
705
 
592
- /**
593
- * PipelineSession orchestrates STT -> LLM -> TTS for a voice call.
594
- */
595
-
596
- interface PipelineSessionOptions {
597
- stt: STT;
598
- llm: LLM;
599
- tts: TTS;
600
- /** System prompt for the LLM. */
601
- systemPrompt?: string;
602
- /** Send initial greeting. Default: true */
603
- greeting?: boolean;
604
- /** Language code. Default: 'ko' */
605
- language?: string;
606
- /** Tool registry for function calling. */
607
- toolRegistry?: ToolRegistry;
608
- /** Audio recorder for the session. */
609
- recorder?: AudioRecorder;
610
- /** LLM temperature. */
611
- temperature?: number;
612
- /** Max tokens for LLM generation. */
613
- maxTokens?: number;
614
- /** Sample rate for audio. Default: 8000 */
615
- sampleRate?: number;
616
- /** Whether to interrupt TTS when user starts speaking. Default: true */
617
- interruptOnSpeech?: boolean;
618
- }
619
- declare class PipelineSession implements Session {
620
- private _stt;
621
- private _llm;
622
- private _tts;
623
- private _systemPrompt;
624
- private _greeting;
625
- private _language;
626
- private _temperature;
627
- private _maxTokens;
628
- private _sampleRate;
629
- private _interruptOnSpeech;
630
- private _callSession;
631
- private _tools;
632
- private _recorder;
633
- private _conversation;
634
- private _audioBuffer;
635
- private _running;
636
- private _speaking;
637
- private _builtinTools;
638
- private _log;
639
- constructor(options: PipelineSessionOptions);
640
- setToolRegistry(registry: ToolRegistry): void;
641
- setRecorder(recorder: AudioRecorder): void;
642
- setBuiltinTools(tools: Set<BuiltinTool>): void;
643
- setLogger(logger: Logger): void;
644
- start(callSession: CallSession, tools?: ToolRegistry): Promise<void>;
645
- feedAudio(audio: Buffer): void;
646
- feedDtmf(digits: string): Promise<void>;
647
- stop(): Promise<void>;
648
- private _runSttLoop;
649
- private _createAudioStream;
650
- private _generateGreeting;
651
- private _handleUserSpeech;
652
- private _buildEffectiveTools;
653
- private _respond;
654
- private _handleToolCall;
655
- private _synthesizeAndSend;
656
- }
657
-
658
706
  /**
659
707
  * Deepgram STT (Speech-to-Text) provider.
660
708
  */
@@ -682,6 +730,8 @@ interface DeepgramSTTOptions {
682
730
  declare class DeepgramSTT implements STT {
683
731
  private _options;
684
732
  private _log;
733
+ get provider(): string;
734
+ get model(): string;
685
735
  setLogger(logger: Logger): void;
686
736
  constructor(options?: DeepgramSTTOptions);
687
737
  transcribe(audioStream: AsyncIterable<Buffer>, options?: {
@@ -713,6 +763,9 @@ interface ElevenLabsTTSOptions {
713
763
  declare class ElevenLabsTTS implements TTS {
714
764
  private _options;
715
765
  private _log;
766
+ get provider(): string;
767
+ get model(): string;
768
+ get voiceId(): string;
716
769
  setLogger(logger: Logger): void;
717
770
  constructor(options?: ElevenLabsTTSOptions);
718
771
  synthesize(text: string | AsyncIterable<string>, options?: {
@@ -739,6 +792,8 @@ interface OpenAILLMOptions {
739
792
  }
740
793
  declare class OpenAILLM implements LLM {
741
794
  private _options;
795
+ get provider(): string;
796
+ get model(): string;
742
797
  constructor(options?: OpenAILLMOptions);
743
798
  generate(messages: ConversationMessage[], options?: {
744
799
  tools?: ToolRegistry;
@@ -763,6 +818,8 @@ interface AnthropicLLMOptions {
763
818
  }
764
819
  declare class AnthropicLLM implements LLM {
765
820
  private _options;
821
+ get provider(): string;
822
+ get model(): string;
766
823
  constructor(options?: AnthropicLLMOptions);
767
824
  generate(messages: ConversationMessage[], options?: {
768
825
  tools?: ToolRegistry;
@@ -787,6 +844,8 @@ interface GeminiLLMOptions {
787
844
  }
788
845
  declare class GeminiLLM implements LLM {
789
846
  private _options;
847
+ get provider(): string;
848
+ get model(): string;
790
849
  constructor(options?: GeminiLLMOptions);
791
850
  generate(messages: ConversationMessage[], options?: {
792
851
  tools?: ToolRegistry;
@@ -815,6 +874,8 @@ interface OpenAICompatLLMOptions {
815
874
  }
816
875
  declare class OpenAICompatLLM implements LLM {
817
876
  private _options;
877
+ get provider(): string;
878
+ get model(): string;
818
879
  constructor(options: OpenAICompatLLMOptions);
819
880
  generate(messages: ConversationMessage[], options?: {
820
881
  tools?: ToolRegistry;
@@ -840,6 +901,8 @@ interface OllamaLLMOptions {
840
901
  }
841
902
  declare class OllamaLLM implements LLM {
842
903
  private _inner;
904
+ get provider(): string;
905
+ get model(): string;
843
906
  constructor(options?: OllamaLLMOptions);
844
907
  generate(messages: ConversationMessage[], options?: {
845
908
  tools?: ToolRegistry;
@@ -856,6 +919,8 @@ interface MistralLLMOptions {
856
919
  }
857
920
  declare class MistralLLM implements LLM {
858
921
  private _inner;
922
+ get provider(): string;
923
+ get model(): string;
859
924
  constructor(options?: MistralLLMOptions);
860
925
  generate(messages: ConversationMessage[], options?: {
861
926
  tools?: ToolRegistry;
@@ -872,6 +937,8 @@ interface GroqLLMOptions {
872
937
  }
873
938
  declare class GroqLLM implements LLM {
874
939
  private _inner;
940
+ get provider(): string;
941
+ get model(): string;
875
942
  constructor(options?: GroqLLMOptions);
876
943
  generate(messages: ConversationMessage[], options?: {
877
944
  tools?: ToolRegistry;
@@ -888,6 +955,8 @@ interface PerplexityLLMOptions {
888
955
  }
889
956
  declare class PerplexityLLM implements LLM {
890
957
  private _inner;
958
+ get provider(): string;
959
+ get model(): string;
891
960
  constructor(options?: PerplexityLLMOptions);
892
961
  generate(messages: ConversationMessage[], options?: {
893
962
  tools?: ToolRegistry;
@@ -904,6 +973,8 @@ interface TogetherLLMOptions {
904
973
  }
905
974
  declare class TogetherLLM implements LLM {
906
975
  private _inner;
976
+ get provider(): string;
977
+ get model(): string;
907
978
  constructor(options?: TogetherLLMOptions);
908
979
  generate(messages: ConversationMessage[], options?: {
909
980
  tools?: ToolRegistry;
@@ -920,6 +991,8 @@ interface FireworksLLMOptions {
920
991
  }
921
992
  declare class FireworksLLM implements LLM {
922
993
  private _inner;
994
+ get provider(): string;
995
+ get model(): string;
923
996
  constructor(options?: FireworksLLMOptions);
924
997
  generate(messages: ConversationMessage[], options?: {
925
998
  tools?: ToolRegistry;
@@ -936,6 +1009,8 @@ interface DeepSeekLLMOptions {
936
1009
  }
937
1010
  declare class DeepSeekLLM implements LLM {
938
1011
  private _inner;
1012
+ get provider(): string;
1013
+ get model(): string;
939
1014
  constructor(options?: DeepSeekLLMOptions);
940
1015
  generate(messages: ConversationMessage[], options?: {
941
1016
  tools?: ToolRegistry;
@@ -952,6 +1027,8 @@ interface XaiLLMOptions {
952
1027
  }
953
1028
  declare class XaiLLM implements LLM {
954
1029
  private _inner;
1030
+ get provider(): string;
1031
+ get model(): string;
955
1032
  constructor(options?: XaiLLMOptions);
956
1033
  generate(messages: ConversationMessage[], options?: {
957
1034
  tools?: ToolRegistry;
@@ -960,6 +1037,27 @@ declare class XaiLLM implements LLM {
960
1037
  }): AsyncGenerator<LLMChunk>;
961
1038
  }
962
1039
 
1040
+ /**
1041
+ * Built-in tool 스키마 정의, 포맷 변환, 실행 헬퍼.
1042
+ *
1043
+ * 모든 세션(PipelineSession, OpenAIRealtime, GeminiRealtime)이 공통으로 사용하는
1044
+ * 내장 도구 스키마를 한 곳에서 관리한다.
1045
+ */
1046
+
1047
+ declare const BUILTIN_TOOL_NAMES: Set<string>;
1048
+ /**
1049
+ * 활성화된 builtin tool 스키마를 요청한 포맷으로 반환.
1050
+ */
1051
+ declare function getBuiltinToolSchemas(builtinTools: Set<BuiltinTool> | null, fmt: 'chat' | 'realtime' | 'gemini'): Array<Record<string, unknown>>;
1052
+ /**
1053
+ * Builtin tool을 실행하고 결과 문자열을 반환한다.
1054
+ *
1055
+ * `funcName`이 builtin tool이 아니면 `null`을 반환한다.
1056
+ * `hang_up`의 경우 빈 문자열 `""`을 반환한다 (호출자가 종료 처리).
1057
+ */
1058
+ declare function isBuiltinTool(name: string): boolean;
1059
+ declare function executeBuiltinTool(funcName: string, args: Record<string, unknown>, call: CallSession): Promise<string | null>;
1060
+
963
1061
  /**
964
1062
  * Logger factory for the ClawOps agent module.
965
1063
  *
@@ -979,4 +1077,4 @@ declare function createAgentLogger(userLogger?: Logger): Logger;
979
1077
  */
980
1078
  declare function createPipelineLogger(parent: Logger): Logger;
981
1079
 
982
- export { type AgentEventType, AnthropicLLM, type AnthropicLLMOptions, AudioRecorder, BuiltinTool, type CallDirection, CallSession, type CallStatus, ClawOpsAgent, type ClawOpsAgentOptions, type ConversationMessage, DECODE_TABLE, DeepSeekLLM, type DeepSeekLLMOptions, DeepgramSTT, type DeepgramSTTOptions, ElevenLabsTTS, type ElevenLabsTTSOptions, FireworksLLM, type FireworksLLMOptions, type FunctionTool, GeminiLLM, type GeminiLLMOptions, GeminiRealtime, type GeminiRealtimeOptions, GroqLLM, type GroqLLMOptions, type LLM, type LLMChunk, MCPClient, type MCPServerConfig, type MCPServerHTTP, type MCPServerStdio, MistralLLM, type MistralLLMOptions, OllamaLLM, type OllamaLLMOptions, OpenAICompatLLM, type OpenAICompatLLMOptions, OpenAILLM, type OpenAILLMOptions, OpenAIRealtime, type OpenAIRealtimeOptions, type OpenAIToolDefinition, PerplexityLLM, type PerplexityLLMOptions, PipelineSession, type PipelineSessionOptions, type STT, type Session, type SpeechEvent, type TTS, TogetherLLM, type TogetherLLMOptions, ToolRegistry, type TracingConfig, XaiLLM, type XaiLLMOptions, createAgentLogger, createPipelineLogger, functionTool, getTracingConfig, mcpServerHTTP, mcpServerStdio, pcm16ToUlaw, resamplePcm16, resetTracingConfig, setTracingConfig, ulawToPcm16, zodToToolParams };
1080
+ export { type AgentEventType, AnthropicLLM, type AnthropicLLMOptions, AudioRecorder, BUILTIN_TOOL_NAMES, BuiltinTool, type CallDirection, CallSession, type CallStatus, ClawOpsAgent, type ClawOpsAgentOptions, type ConversationMessage, DECODE_TABLE, DeepSeekLLM, type DeepSeekLLMOptions, DeepgramSTT, type DeepgramSTTOptions, ElevenLabsTTS, type ElevenLabsTTSOptions, FireworksLLM, type FireworksLLMOptions, type FunctionTool, GeminiLLM, type GeminiLLMOptions, GeminiRealtime, type GeminiRealtimeOptions, GroqLLM, type GroqLLMOptions, type LLM, type LLMChunk, MCPClient, type MCPServerConfig, type MCPServerHTTP, type MCPServerStdio, MistralLLM, type MistralLLMOptions, OllamaLLM, type OllamaLLMOptions, OpenAICompatLLM, type OpenAICompatLLMOptions, OpenAILLM, type OpenAILLMOptions, OpenAIRealtime, type OpenAIRealtimeOptions, type OpenAIToolDefinition, PerplexityLLM, type PerplexityLLMOptions, PipelineSession, type PipelineSessionOptions, type STT, type Session, type SpeechEvent, type TTS, TogetherLLM, type TogetherLLMOptions, type ToolCallRequest, ToolRegistry, type TracingConfig, XaiLLM, type XaiLLMOptions, createAgentLogger, createPipelineLogger, executeBuiltinTool, functionTool, getBuiltinToolSchemas, getTracingConfig, isBuiltinTool, mcpServerHTTP, mcpServerStdio, pcm16ToUlaw, resamplePcm16, resetTracingConfig, setTracingConfig, ulawToPcm16, zodToToolParams };