@promptbook/ollama 0.105.0-4 → 0.105.0-5

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.
@@ -183,6 +183,7 @@ import type { PostprocessingFunction } from '../scripting/javascript/JavascriptE
183
183
  import type { ToolFunction } from '../scripting/javascript/JavascriptExecutionToolsOptions';
184
184
  import type { SearchEngine } from '../search-engines/SearchEngine';
185
185
  import type { SearchResult } from '../search-engines/SearchResult';
186
+ import type { OpenAiSpeechRecognitionOptions } from '../speech-recognition/OpenAiSpeechRecognition';
186
187
  import type { PromptbookStorage } from '../storage/_common/PromptbookStorage';
187
188
  import type { FileCacheStorageOptions } from '../storage/file-cache-storage/FileCacheStorageOptions';
188
189
  import type { IndexedDbStorageOptions } from '../storage/local-storage/utils/IndexedDbStorageOptions';
@@ -207,6 +208,10 @@ import type { ImagePrompt } from '../types/Prompt';
207
208
  import type { EmbeddingPrompt } from '../types/Prompt';
208
209
  import type { ScriptLanguage } from '../types/ScriptLanguage';
209
210
  import type { SectionType } from '../types/SectionType';
211
+ import type { SpeechRecognition } from '../types/SpeechRecognition';
212
+ import type { SpeechRecognitionStartOptions } from '../types/SpeechRecognition';
213
+ import type { SpeechRecognitionState } from '../types/SpeechRecognition';
214
+ import type { SpeechRecognitionEvent } from '../types/SpeechRecognition';
210
215
  import type { TaskType } from '../types/TaskType';
211
216
  import type { string_char_emoji } from '../types/typeAliasEmoji';
212
217
  import type { string_business_category_name } from '../types/typeAliases';
@@ -316,6 +321,7 @@ import type { string_license_token } from '../types/typeAliases';
316
321
  import type { string_password } from '../types/typeAliases';
317
322
  import type { string_ssh_key } from '../types/typeAliases';
318
323
  import type { string_pgp_key } from '../types/typeAliases';
324
+ import type { string_language } from '../types/typeAliases';
319
325
  import type { string_date_iso8601 } from '../types/typeAliases';
320
326
  import type { number_usd } from '../types/typeAliases';
321
327
  import type { number_id } from '../types/typeAliases';
@@ -557,6 +563,7 @@ export type { PostprocessingFunction };
557
563
  export type { ToolFunction };
558
564
  export type { SearchEngine };
559
565
  export type { SearchResult };
566
+ export type { OpenAiSpeechRecognitionOptions };
560
567
  export type { PromptbookStorage };
561
568
  export type { FileCacheStorageOptions };
562
569
  export type { IndexedDbStorageOptions };
@@ -581,6 +588,10 @@ export type { ImagePrompt };
581
588
  export type { EmbeddingPrompt };
582
589
  export type { ScriptLanguage };
583
590
  export type { SectionType };
591
+ export type { SpeechRecognition };
592
+ export type { SpeechRecognitionStartOptions };
593
+ export type { SpeechRecognitionState };
594
+ export type { SpeechRecognitionEvent };
584
595
  export type { TaskType };
585
596
  export type { string_char_emoji };
586
597
  export type { string_business_category_name };
@@ -690,6 +701,7 @@ export type { string_license_token };
690
701
  export type { string_password };
691
702
  export type { string_ssh_key };
692
703
  export type { string_pgp_key };
704
+ export type { string_language };
693
705
  export type { string_date_iso8601 };
694
706
  export type { number_usd };
695
707
  export type { number_id };
@@ -31,7 +31,7 @@ export type AgentCapability = {
31
31
  /**
32
32
  * The type of the capability
33
33
  */
34
- type: 'browser' | 'search-engine' | 'knowledge' | 'time';
34
+ type: 'browser' | 'search-engine' | 'knowledge' | 'time' | 'inheritance' | 'import';
35
35
  /**
36
36
  * The label to display for this capability
37
37
  */
@@ -40,6 +40,11 @@ export type AgentCapability = {
40
40
  * The name of the icon to display for this capability
41
41
  */
42
42
  iconName: string;
43
+ /**
44
+ * Optional link to another agent
45
+ * This is used for 'inheritance' and 'import' types
46
+ */
47
+ agentUrl?: string_agent_url;
43
48
  };
44
49
  export type AgentBasicInformation = {
45
50
  /**
@@ -5,6 +5,7 @@ import type { ChatMessage } from '../types/ChatMessage';
5
5
  import type { ChatParticipant } from '../types/ChatParticipant';
6
6
  import { string_color } from '../../../types/typeAliases';
7
7
  import { Color } from '../../../_packages/color.index';
8
+ import { SpeechRecognition } from '../../../types/SpeechRecognition';
8
9
  /**
9
10
  * @public exported from `@promptbook/components`
10
11
  */
@@ -47,13 +48,9 @@ export type ChatProps = {
47
48
  */
48
49
  readonly isVoiceRecognitionButtonShown?: boolean;
49
50
  /**
50
- * Optional callback to trigger voice input
51
+ * Speech recognition provider
51
52
  */
52
- onVoiceInput?(): void;
53
- /**
54
- * The language code to use for voice recognition
55
- */
56
- readonly voiceLanguage?: string;
53
+ readonly speechRecognition?: SpeechRecognition;
57
54
  /**
58
55
  * Optional placeholder message for the textarea
59
56
  *
@@ -33,6 +33,15 @@ export type ChatMessage = Omit<Message<id>, 'direction' | 'recipients' | 'thread
33
33
  * Indicates if the message was sent via a voice call
34
34
  */
35
35
  isVoiceCall?: boolean;
36
+ /**
37
+ * Optional tool calls made during the execution
38
+ */
39
+ readonly ongoingToolCalls?: ReadonlyArray<{
40
+ /**
41
+ * Name of the tool
42
+ */
43
+ readonly name: string;
44
+ }>;
36
45
  /**
37
46
  * Optional file attachments
38
47
  */
@@ -56,7 +56,9 @@ export type LlmExecutionTools = {
56
56
  /**
57
57
  * Calls a chat model with streaming
58
58
  */
59
- callChatModelStream?(prompt: Prompt, onProgress: (chunk: ChatPromptResult) => void): Promise<ChatPromptResult>;
59
+ callChatModelStream?(prompt: Prompt, onProgress: (chunk: ChatPromptResult & {
60
+ isFinished?: boolean;
61
+ }) => void): Promise<ChatPromptResult>;
60
62
  /**
61
63
  * Calls a voice chat model
62
64
  */
@@ -39,10 +39,17 @@ export declare abstract class OpenAiCompatibleExecutionTools implements LlmExecu
39
39
  * List all available OpenAI compatible models that can be used
40
40
  */
41
41
  listModels(): Promise<ReadonlyArray<AvailableModel>>;
42
+ /**
43
+ * Calls OpenAI compatible API to use a chat model.
44
+ */
42
45
  /**
43
46
  * Calls OpenAI compatible API to use a chat model.
44
47
  */
45
48
  callChatModel(prompt: Prompt): Promise<ChatPromptResult>;
49
+ /**
50
+ * Calls OpenAI compatible API to use a chat model with streaming.
51
+ */
52
+ callChatModelStream(prompt: Prompt, onProgress: (chunk: ChatPromptResult) => void): Promise<ChatPromptResult>;
46
53
  /**
47
54
  * Internal method that handles parameter retry for chat model calls
48
55
  */
@@ -0,0 +1,6 @@
1
+ export * from './bing/BingSearchEngine';
2
+ export * from './dummy/DummySearchEngine';
3
+ export * from './google/GoogleSearchEngine';
4
+ export * from './SearchEngine';
5
+ export * from './SearchResult';
6
+ export * from './serp/SerpSearchEngine';
@@ -0,0 +1,18 @@
1
+ import type { Promisable } from 'type-fest';
2
+ import type { string_markdown, string_markdown_text, string_title } from '../../types/typeAliases';
3
+ import type { SearchEngine } from '../SearchEngine';
4
+ import type { SearchResult } from '../SearchResult';
5
+ /**
6
+ * A search engine implementation that uses the Google Custom Search JSON API.
7
+ *
8
+ * @private <- TODO: !!!! Export via some package
9
+ */
10
+ export declare class GoogleSearchEngine implements SearchEngine {
11
+ get title(): string_title & string_markdown_text;
12
+ get description(): string_markdown;
13
+ /**
14
+ * @see https://developers.google.com/custom-search/v1/overview
15
+ */
16
+ checkConfiguration(): Promisable<void>;
17
+ search(query: string): Promise<SearchResult[]>;
18
+ }
@@ -0,0 +1,15 @@
1
+ import type { Promisable } from 'type-fest';
2
+ import type { string_markdown, string_markdown_text, string_title } from '../../types/typeAliases';
3
+ import type { SearchEngine } from '../SearchEngine';
4
+ import type { SearchResult } from '../SearchResult';
5
+ /**
6
+ * A search engine implementation that uses the SerpApi to fetch Google search results.
7
+ *
8
+ * @private <- TODO: !!!! Export via some package
9
+ */
10
+ export declare class SerpSearchEngine implements SearchEngine {
11
+ get title(): string_title & string_markdown_text;
12
+ get description(): string_markdown;
13
+ checkConfiguration(): Promisable<void>;
14
+ search(query: string): Promise<SearchResult[]>;
15
+ }
@@ -0,0 +1,21 @@
1
+ import type { SpeechRecognition, SpeechRecognitionEvent, SpeechRecognitionStartOptions, SpeechRecognitionState } from '../types/SpeechRecognition';
2
+ /**
3
+ * Speech recognition using Web Speech API `SpeechRecognition` available in modern browsers
4
+ *
5
+ * @public exported from `@promptbook/browser`
6
+ */
7
+ export declare class BrowserSpeechRecognition implements SpeechRecognition {
8
+ private recognition;
9
+ private callbacks;
10
+ private _state;
11
+ get state(): SpeechRecognitionState;
12
+ constructor();
13
+ $start(options?: SpeechRecognitionStartOptions): void;
14
+ $stop(): void;
15
+ subscribe(callback: (event: SpeechRecognitionEvent) => void): () => void;
16
+ private emit;
17
+ }
18
+ /**
19
+ * TODO: !!!! Search ACRY for `window` and put -> [🔵]
20
+ * Note: [🔵] Code in this file should never be published outside of `@promptbook/browser`
21
+ */
@@ -0,0 +1,32 @@
1
+ import type { SpeechRecognition, SpeechRecognitionEvent, SpeechRecognitionStartOptions, SpeechRecognitionState } from '../types/SpeechRecognition';
2
+ /**
3
+ * Options for OpenAiSpeechRecognition
4
+ */
5
+ export type OpenAiSpeechRecognitionOptions = {
6
+ /**
7
+ * OpenAI API base URL or proxy endpoint
8
+ * @default '/api/openai/v1'
9
+ */
10
+ readonly baseUrl?: string;
11
+ };
12
+ /**
13
+ * Speech recognition using OpenAI Whisper API to transcribe audio into text
14
+ *
15
+ * @private because it requires server-client communication with a proxy endpoint
16
+ *
17
+ * Note: This implementation uses a server-side proxy to avoid exposing the OpenAI API key on the client.
18
+ */
19
+ export declare class OpenAiSpeechRecognition implements SpeechRecognition {
20
+ private readonly options;
21
+ private mediaRecorder;
22
+ private audioChunks;
23
+ private callbacks;
24
+ private _state;
25
+ get state(): SpeechRecognitionState;
26
+ constructor(options?: OpenAiSpeechRecognitionOptions);
27
+ $start(options?: SpeechRecognitionStartOptions): Promise<void>;
28
+ $stop(): void;
29
+ private transcribe;
30
+ subscribe(callback: (event: SpeechRecognitionEvent) => void): () => void;
31
+ private emit;
32
+ }
@@ -0,0 +1,58 @@
1
+ import type { string_language } from './typeAliases';
2
+ /**
3
+ * Interface for speech-to-text recognition
4
+ *
5
+ * @🚉 fully serializable as JSON
6
+ */
7
+ export type SpeechRecognition = {
8
+ /**
9
+ * Start the speech recognition
10
+ */
11
+ $start(options: SpeechRecognitionStartOptions): void;
12
+ /**
13
+ * Stop the speech recognition
14
+ */
15
+ $stop(): void;
16
+ /**
17
+ * Current state of the speech recognition
18
+ */
19
+ readonly state: SpeechRecognitionState;
20
+ /**
21
+ * Subscribe to speech recognition events
22
+ */
23
+ subscribe(callback: (event: SpeechRecognitionEvent) => void): () => void;
24
+ };
25
+ /**
26
+ * Options for starting speech recognition
27
+ */
28
+ export type SpeechRecognitionStartOptions = {
29
+ /**
30
+ * Language for speech recognition
31
+ * @default 'en-US'
32
+ */
33
+ readonly language?: string_language;
34
+ /**
35
+ * Whether to return interim results
36
+ * @default true
37
+ */
38
+ readonly interimResults?: boolean;
39
+ };
40
+ /**
41
+ * Current state of the speech recognition
42
+ */
43
+ export type SpeechRecognitionState = 'IDLE' | 'STARTING' | 'RECORDING' | 'TRANSCRIBING' | 'ERROR';
44
+ /**
45
+ * Event emitted by speech recognition
46
+ */
47
+ export type SpeechRecognitionEvent = {
48
+ readonly type: 'START';
49
+ } | {
50
+ readonly type: 'RESULT';
51
+ readonly text: string;
52
+ readonly isFinal: boolean;
53
+ } | {
54
+ readonly type: 'ERROR';
55
+ readonly message: string;
56
+ } | {
57
+ readonly type: 'STOP';
58
+ };
@@ -668,6 +668,10 @@ export type string_license_token = string_token;
668
668
  export type string_password = string;
669
669
  export type string_ssh_key = string;
670
670
  export type string_pgp_key = string;
671
+ /**
672
+ * Language as a string, e.g. 'en-US', 'cs-CZ', 'en'
673
+ */
674
+ export type string_language = string;
671
675
  /**
672
676
  * Semantic helper for `Date.toISOString()` result
673
677
  *
@@ -15,7 +15,7 @@ export declare const BOOK_LANGUAGE_VERSION: string_semantic_version;
15
15
  export declare const PROMPTBOOK_ENGINE_VERSION: string_promptbook_version;
16
16
  /**
17
17
  * Represents the version string of the Promptbook engine.
18
- * It follows semantic versioning (e.g., `0.105.0-3`).
18
+ * It follows semantic versioning (e.g., `0.105.0-4`).
19
19
  *
20
20
  * @generated
21
21
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptbook/ollama",
3
- "version": "0.105.0-4",
3
+ "version": "0.105.0-5",
4
4
  "description": "Promptbook: Turn your company's scattered knowledge into AI ready books",
5
5
  "private": false,
6
6
  "sideEffects": false,
@@ -94,7 +94,7 @@
94
94
  "module": "./esm/index.es.js",
95
95
  "typings": "./esm/typings/src/_packages/ollama.index.d.ts",
96
96
  "peerDependencies": {
97
- "@promptbook/core": "0.105.0-4"
97
+ "@promptbook/core": "0.105.0-5"
98
98
  },
99
99
  "dependencies": {
100
100
  "bottleneck": "2.19.5",
package/umd/index.umd.js CHANGED
@@ -25,7 +25,7 @@
25
25
  * @generated
26
26
  * @see https://github.com/webgptorg/promptbook
27
27
  */
28
- const PROMPTBOOK_ENGINE_VERSION = '0.105.0-4';
28
+ const PROMPTBOOK_ENGINE_VERSION = '0.105.0-5';
29
29
  /**
30
30
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
31
31
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -3089,20 +3089,29 @@
3089
3089
  });
3090
3090
  return availableModels;
3091
3091
  }
3092
+ /**
3093
+ * Calls OpenAI compatible API to use a chat model.
3094
+ */
3092
3095
  /**
3093
3096
  * Calls OpenAI compatible API to use a chat model.
3094
3097
  */
3095
3098
  async callChatModel(prompt) {
3099
+ return this.callChatModelStream(prompt, () => { });
3100
+ }
3101
+ /**
3102
+ * Calls OpenAI compatible API to use a chat model with streaming.
3103
+ */
3104
+ async callChatModelStream(prompt, onProgress) {
3096
3105
  // Deep clone prompt and modelRequirements to avoid mutation across calls
3097
3106
  const clonedPrompt = JSON.parse(JSON.stringify(prompt));
3098
3107
  // Use local Set for retried parameters to ensure independence and thread safety
3099
3108
  const retriedUnsupportedParameters = new Set();
3100
- return this.callChatModelWithRetry(clonedPrompt, clonedPrompt.modelRequirements, [], retriedUnsupportedParameters);
3109
+ return this.callChatModelWithRetry(clonedPrompt, clonedPrompt.modelRequirements, [], retriedUnsupportedParameters, onProgress);
3101
3110
  }
3102
3111
  /**
3103
3112
  * Internal method that handles parameter retry for chat model calls
3104
3113
  */
3105
- async callChatModelWithRetry(prompt, currentModelRequirements, attemptStack = [], retriedUnsupportedParameters = new Set()) {
3114
+ async callChatModelWithRetry(prompt, currentModelRequirements, attemptStack = [], retriedUnsupportedParameters = new Set(), onProgress) {
3106
3115
  var _a;
3107
3116
  if (this.options.isVerbose) {
3108
3117
  console.info(`💬 ${this.title} callChatModel call`, { prompt, currentModelRequirements });
@@ -3208,6 +3217,23 @@
3208
3217
  const usage = this.computeUsage(content || '', responseMessage.content || '', rawResponse);
3209
3218
  totalUsage = addUsage(totalUsage, usage);
3210
3219
  if (responseMessage.tool_calls && responseMessage.tool_calls.length > 0) {
3220
+ if (onProgress) {
3221
+ onProgress({
3222
+ content: responseMessage.content || '',
3223
+ modelName: rawResponse.model || modelName,
3224
+ timing: { start, complete: $getCurrentDate() },
3225
+ usage: totalUsage,
3226
+ toolCalls: responseMessage.tool_calls.map((toolCall) => ({
3227
+ name: toolCall.function.name,
3228
+ arguments: toolCall.function.arguments,
3229
+ result: '',
3230
+ rawToolCall: toolCall,
3231
+ })),
3232
+ rawPromptContent,
3233
+ rawRequest,
3234
+ rawResponse,
3235
+ });
3236
+ }
3211
3237
  await forEachAsync(responseMessage.tool_calls, {}, async (toolCall) => {
3212
3238
  const functionName = toolCall.function.name;
3213
3239
  const functionArgs = toolCall.function.arguments;
@@ -3335,7 +3361,7 @@
3335
3361
  });
3336
3362
  // Remove the unsupported parameter and retry
3337
3363
  const modifiedModelRequirements = removeUnsupportedModelRequirement(currentModelRequirements, unsupportedParameter);
3338
- return this.callChatModelWithRetry(prompt, modifiedModelRequirements, attemptStack, retriedUnsupportedParameters);
3364
+ return this.callChatModelWithRetry(prompt, modifiedModelRequirements, attemptStack, retriedUnsupportedParameters, onProgress);
3339
3365
  }
3340
3366
  }
3341
3367
  throw new PipelineExecutionError(`Tool calling loop did not return a result from ${this.title}`);