@yourgpt/llm-sdk 1.5.1 → 1.5.3

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 YourGPT
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.d.mts CHANGED
@@ -413,6 +413,29 @@ interface HandleRequestOptions {
413
413
  */
414
414
  onFinish?: (result: HandleRequestResult) => Promise<void> | void;
415
415
  }
416
+ /**
417
+ * Options for runtime.generate()
418
+ *
419
+ * @example
420
+ * ```typescript
421
+ * const result = await runtime.generate(body, {
422
+ * onFinish: async ({ messages }) => {
423
+ * await db.saveMessages(messages);
424
+ * },
425
+ * });
426
+ * ```
427
+ */
428
+ interface GenerateOptions {
429
+ /** AbortSignal for cancellation */
430
+ signal?: AbortSignal;
431
+ /** HTTP request for extracting headers (auth context) */
432
+ httpRequest?: Request;
433
+ /**
434
+ * Called after generation completes successfully.
435
+ * Use for server-side persistence.
436
+ */
437
+ onFinish?: (result: HandleRequestResult) => Promise<void> | void;
438
+ }
416
439
 
417
440
  /**
418
441
  * StreamResult - Industry-standard streaming result object
@@ -447,6 +470,13 @@ interface HandleRequestOptions {
447
470
  interface StreamResultOptions {
448
471
  /** Additional headers to include in response */
449
472
  headers?: Record<string, string>;
473
+ /**
474
+ * Include token usage in response (default: false)
475
+ * Set to true for raw API access where you need usage data.
476
+ * When false, usage is stripped from client-facing responses
477
+ * but still available in onFinish callback for billing.
478
+ */
479
+ includeUsage?: boolean;
450
480
  }
451
481
  /**
452
482
  * Result passed to onFinish callback
@@ -598,11 +628,14 @@ declare class StreamResult {
598
628
  *
599
629
  * @example
600
630
  * ```typescript
631
+ * // Default: usage stripped for client-facing responses
601
632
  * const { text, messages, toolCalls } = await runtime.stream(body).collect();
602
- * console.log('Response:', text);
633
+ *
634
+ * // Raw: include usage for server-side processing
635
+ * const { text, usage } = await runtime.stream(body).collect({ includeUsage: true });
603
636
  * ```
604
637
  */
605
- collect(): Promise<CollectedResult>;
638
+ collect(options?: StreamResultOptions): Promise<CollectedResult>;
606
639
  /**
607
640
  * Get final text (convenience method)
608
641
  *
@@ -650,6 +683,11 @@ declare class StreamResult {
650
683
  * Call registered event handlers
651
684
  */
652
685
  private callEventHandlers;
686
+ /**
687
+ * Strip usage from result (usage is server-side only for billing)
688
+ * Client-facing APIs should not expose token usage
689
+ */
690
+ private stripUsageFromResult;
653
691
  }
654
692
  /**
655
693
  * Create a StreamResult from an async generator
@@ -662,6 +700,118 @@ declare class StreamResult {
662
700
  */
663
701
  declare function createStreamResult(generator: AsyncGenerator<StreamEvent>): StreamResult;
664
702
 
703
+ /**
704
+ * GenerateResult - Result from non-streaming generation
705
+ *
706
+ * Similar to Vercel AI SDK's generateText() result.
707
+ * Provides both raw access and formatted response methods.
708
+ *
709
+ * @example
710
+ * ```typescript
711
+ * const result = await runtime.generate(body);
712
+ *
713
+ * // Raw access
714
+ * console.log(result.text);
715
+ * console.log(result.toolCalls);
716
+ *
717
+ * // CopilotChat format
718
+ * res.json(result.toResponse());
719
+ * ```
720
+ */
721
+
722
+ interface GenerateResultData {
723
+ text: string;
724
+ messages: DoneEventMessage[];
725
+ toolCalls: Array<{
726
+ id: string;
727
+ name: string;
728
+ args: Record<string, unknown>;
729
+ }>;
730
+ toolResults: Array<{
731
+ id: string;
732
+ result: unknown;
733
+ }>;
734
+ requiresAction: boolean;
735
+ error?: {
736
+ message: string;
737
+ code?: string;
738
+ };
739
+ }
740
+ /**
741
+ * Response format compatible with CopilotChat
742
+ */
743
+ interface CopilotChatResponse {
744
+ success: boolean;
745
+ content: string;
746
+ messages?: DoneEventMessage[];
747
+ toolCalls?: Array<{
748
+ id: string;
749
+ name: string;
750
+ args: Record<string, unknown>;
751
+ }>;
752
+ toolResults?: Array<{
753
+ id: string;
754
+ result: unknown;
755
+ }>;
756
+ requiresAction?: boolean;
757
+ error?: {
758
+ message: string;
759
+ code?: string;
760
+ };
761
+ }
762
+ /**
763
+ * GenerateResult - Non-streaming generation result
764
+ */
765
+ declare class GenerateResult {
766
+ private data;
767
+ constructor(data: GenerateResultData);
768
+ /**
769
+ * Generated text content
770
+ */
771
+ get text(): string;
772
+ /**
773
+ * All messages from the conversation
774
+ */
775
+ get messages(): DoneEventMessage[];
776
+ /**
777
+ * Tool calls made during generation
778
+ */
779
+ get toolCalls(): GenerateResultData["toolCalls"];
780
+ /**
781
+ * Results from tool executions
782
+ */
783
+ get toolResults(): GenerateResultData["toolResults"];
784
+ /**
785
+ * Whether client action is required (e.g., tool approval)
786
+ */
787
+ get requiresAction(): boolean;
788
+ /**
789
+ * Error if generation failed
790
+ */
791
+ get error(): GenerateResultData["error"];
792
+ /**
793
+ * Whether generation was successful
794
+ */
795
+ get success(): boolean;
796
+ /**
797
+ * Convert to CopilotChat-compatible JSON response
798
+ *
799
+ * @example
800
+ * ```typescript
801
+ * // Express
802
+ * res.json(result.toResponse());
803
+ *
804
+ * // Next.js
805
+ * return Response.json(result.toResponse());
806
+ * ```
807
+ */
808
+ toResponse(): CopilotChatResponse;
809
+ /**
810
+ * Convert to raw object (without methods)
811
+ */
812
+ toJSON(): GenerateResultData;
813
+ }
814
+
665
815
  /**
666
816
  * Copilot SDK Runtime
667
817
  *
@@ -845,23 +995,42 @@ declare class Runtime {
845
995
  * console.log('Response:', text);
846
996
  * res.json({ response: text });
847
997
  *
848
- * // With onFinish for usage tracking
849
- * const result = await runtime.chat(body, {
850
- * onFinish: ({ usage }) => console.log('Tokens:', usage?.totalTokens)
851
- * });
998
+ * // Usage is included in result - strip before sending to client
999
+ * const { usage, ...clientResult } = await runtime.chat(body);
1000
+ * await billing.record(usage);
1001
+ * res.json(clientResult);
852
1002
  * ```
853
1003
  */
854
1004
  chat(request: ChatRequest, options?: {
855
1005
  signal?: AbortSignal;
856
- onFinish?: (result: {
857
- messages: DoneEventMessage[];
858
- usage?: {
859
- promptTokens: number;
860
- completionTokens: number;
861
- totalTokens: number;
862
- };
863
- }) => Promise<void> | void;
864
1006
  }): Promise<CollectedResult>;
1007
+ /**
1008
+ * Generate a complete response (non-streaming)
1009
+ *
1010
+ * Like Vercel AI SDK's generateText() - clean, non-streaming API.
1011
+ * Returns GenerateResult with .toResponse() for CopilotChat format.
1012
+ *
1013
+ * @example
1014
+ * ```typescript
1015
+ * // Simple usage
1016
+ * const result = await runtime.generate(body);
1017
+ * console.log(result.text);
1018
+ *
1019
+ * // CopilotChat format response (Express)
1020
+ * res.json(result.toResponse());
1021
+ *
1022
+ * // CopilotChat format response (Next.js)
1023
+ * return Response.json(result.toResponse());
1024
+ *
1025
+ * // With persistence callback
1026
+ * const result = await runtime.generate(body, {
1027
+ * onFinish: async ({ messages }) => {
1028
+ * await db.saveMessages(messages);
1029
+ * },
1030
+ * });
1031
+ * ```
1032
+ */
1033
+ generate(request: ChatRequest, options?: GenerateOptions): Promise<GenerateResult>;
865
1034
  /**
866
1035
  * Create Express-compatible handler middleware
867
1036
  *
@@ -1164,4 +1333,4 @@ declare function generateThreadId(): string;
1164
1333
  */
1165
1334
  declare function generateToolCallId(): string;
1166
1335
 
1167
- export { AIProvider, ActionDefinition, type ActionRequest, AgentLoopConfig, type AgentLoopOptions, type ChatRequest, type CollectedResult, DEFAULT_MAX_ITERATIONS, DoneEventMessage, GenerateTextParams, GenerateTextResult, LLMAdapter, Message, type RequestContext, Runtime, type RuntimeConfig, StreamEvent, StreamResult, type StreamResultOptions, StreamTextParams, StreamTextResult, TokenUsageRaw, Tool, ToolCallInfo, ToolContext, ToolDefinition, ToolResponse, createEventStream, createExpressHandler, createExpressMiddleware, createHonoApp, createNextHandler, createNodeHandler, createRuntime, createSSEHeaders, createSSEResponse, createStreamResult, createTextStreamHeaders, createTextStreamResponse, formatSSEData, formatToolsForAnthropic, formatToolsForGoogle, formatToolsForOpenAI, generateMessageId, generateText, generateThreadId, generateToolCallId, pipeSSEToResponse, pipeTextToResponse, runAgentLoop, streamText, tool };
1336
+ export { AIProvider, ActionDefinition, type ActionRequest, AgentLoopConfig, type AgentLoopOptions, type ChatRequest, type CollectedResult, type CopilotChatResponse, DEFAULT_MAX_ITERATIONS, DoneEventMessage, GenerateResult, type GenerateResultData, GenerateTextParams, GenerateTextResult, LLMAdapter, Message, type RequestContext, Runtime, type RuntimeConfig, StreamEvent, StreamResult, type StreamResultOptions, StreamTextParams, StreamTextResult, TokenUsageRaw, Tool, ToolCallInfo, ToolContext, ToolDefinition, ToolResponse, createEventStream, createExpressHandler, createExpressMiddleware, createHonoApp, createNextHandler, createNodeHandler, createRuntime, createSSEHeaders, createSSEResponse, createStreamResult, createTextStreamHeaders, createTextStreamResponse, formatSSEData, formatToolsForAnthropic, formatToolsForGoogle, formatToolsForOpenAI, generateMessageId, generateText, generateThreadId, generateToolCallId, pipeSSEToResponse, pipeTextToResponse, runAgentLoop, streamText, tool };
package/dist/index.d.ts CHANGED
@@ -413,6 +413,29 @@ interface HandleRequestOptions {
413
413
  */
414
414
  onFinish?: (result: HandleRequestResult) => Promise<void> | void;
415
415
  }
416
+ /**
417
+ * Options for runtime.generate()
418
+ *
419
+ * @example
420
+ * ```typescript
421
+ * const result = await runtime.generate(body, {
422
+ * onFinish: async ({ messages }) => {
423
+ * await db.saveMessages(messages);
424
+ * },
425
+ * });
426
+ * ```
427
+ */
428
+ interface GenerateOptions {
429
+ /** AbortSignal for cancellation */
430
+ signal?: AbortSignal;
431
+ /** HTTP request for extracting headers (auth context) */
432
+ httpRequest?: Request;
433
+ /**
434
+ * Called after generation completes successfully.
435
+ * Use for server-side persistence.
436
+ */
437
+ onFinish?: (result: HandleRequestResult) => Promise<void> | void;
438
+ }
416
439
 
417
440
  /**
418
441
  * StreamResult - Industry-standard streaming result object
@@ -447,6 +470,13 @@ interface HandleRequestOptions {
447
470
  interface StreamResultOptions {
448
471
  /** Additional headers to include in response */
449
472
  headers?: Record<string, string>;
473
+ /**
474
+ * Include token usage in response (default: false)
475
+ * Set to true for raw API access where you need usage data.
476
+ * When false, usage is stripped from client-facing responses
477
+ * but still available in onFinish callback for billing.
478
+ */
479
+ includeUsage?: boolean;
450
480
  }
451
481
  /**
452
482
  * Result passed to onFinish callback
@@ -598,11 +628,14 @@ declare class StreamResult {
598
628
  *
599
629
  * @example
600
630
  * ```typescript
631
+ * // Default: usage stripped for client-facing responses
601
632
  * const { text, messages, toolCalls } = await runtime.stream(body).collect();
602
- * console.log('Response:', text);
633
+ *
634
+ * // Raw: include usage for server-side processing
635
+ * const { text, usage } = await runtime.stream(body).collect({ includeUsage: true });
603
636
  * ```
604
637
  */
605
- collect(): Promise<CollectedResult>;
638
+ collect(options?: StreamResultOptions): Promise<CollectedResult>;
606
639
  /**
607
640
  * Get final text (convenience method)
608
641
  *
@@ -650,6 +683,11 @@ declare class StreamResult {
650
683
  * Call registered event handlers
651
684
  */
652
685
  private callEventHandlers;
686
+ /**
687
+ * Strip usage from result (usage is server-side only for billing)
688
+ * Client-facing APIs should not expose token usage
689
+ */
690
+ private stripUsageFromResult;
653
691
  }
654
692
  /**
655
693
  * Create a StreamResult from an async generator
@@ -662,6 +700,118 @@ declare class StreamResult {
662
700
  */
663
701
  declare function createStreamResult(generator: AsyncGenerator<StreamEvent>): StreamResult;
664
702
 
703
+ /**
704
+ * GenerateResult - Result from non-streaming generation
705
+ *
706
+ * Similar to Vercel AI SDK's generateText() result.
707
+ * Provides both raw access and formatted response methods.
708
+ *
709
+ * @example
710
+ * ```typescript
711
+ * const result = await runtime.generate(body);
712
+ *
713
+ * // Raw access
714
+ * console.log(result.text);
715
+ * console.log(result.toolCalls);
716
+ *
717
+ * // CopilotChat format
718
+ * res.json(result.toResponse());
719
+ * ```
720
+ */
721
+
722
+ interface GenerateResultData {
723
+ text: string;
724
+ messages: DoneEventMessage[];
725
+ toolCalls: Array<{
726
+ id: string;
727
+ name: string;
728
+ args: Record<string, unknown>;
729
+ }>;
730
+ toolResults: Array<{
731
+ id: string;
732
+ result: unknown;
733
+ }>;
734
+ requiresAction: boolean;
735
+ error?: {
736
+ message: string;
737
+ code?: string;
738
+ };
739
+ }
740
+ /**
741
+ * Response format compatible with CopilotChat
742
+ */
743
+ interface CopilotChatResponse {
744
+ success: boolean;
745
+ content: string;
746
+ messages?: DoneEventMessage[];
747
+ toolCalls?: Array<{
748
+ id: string;
749
+ name: string;
750
+ args: Record<string, unknown>;
751
+ }>;
752
+ toolResults?: Array<{
753
+ id: string;
754
+ result: unknown;
755
+ }>;
756
+ requiresAction?: boolean;
757
+ error?: {
758
+ message: string;
759
+ code?: string;
760
+ };
761
+ }
762
+ /**
763
+ * GenerateResult - Non-streaming generation result
764
+ */
765
+ declare class GenerateResult {
766
+ private data;
767
+ constructor(data: GenerateResultData);
768
+ /**
769
+ * Generated text content
770
+ */
771
+ get text(): string;
772
+ /**
773
+ * All messages from the conversation
774
+ */
775
+ get messages(): DoneEventMessage[];
776
+ /**
777
+ * Tool calls made during generation
778
+ */
779
+ get toolCalls(): GenerateResultData["toolCalls"];
780
+ /**
781
+ * Results from tool executions
782
+ */
783
+ get toolResults(): GenerateResultData["toolResults"];
784
+ /**
785
+ * Whether client action is required (e.g., tool approval)
786
+ */
787
+ get requiresAction(): boolean;
788
+ /**
789
+ * Error if generation failed
790
+ */
791
+ get error(): GenerateResultData["error"];
792
+ /**
793
+ * Whether generation was successful
794
+ */
795
+ get success(): boolean;
796
+ /**
797
+ * Convert to CopilotChat-compatible JSON response
798
+ *
799
+ * @example
800
+ * ```typescript
801
+ * // Express
802
+ * res.json(result.toResponse());
803
+ *
804
+ * // Next.js
805
+ * return Response.json(result.toResponse());
806
+ * ```
807
+ */
808
+ toResponse(): CopilotChatResponse;
809
+ /**
810
+ * Convert to raw object (without methods)
811
+ */
812
+ toJSON(): GenerateResultData;
813
+ }
814
+
665
815
  /**
666
816
  * Copilot SDK Runtime
667
817
  *
@@ -845,23 +995,42 @@ declare class Runtime {
845
995
  * console.log('Response:', text);
846
996
  * res.json({ response: text });
847
997
  *
848
- * // With onFinish for usage tracking
849
- * const result = await runtime.chat(body, {
850
- * onFinish: ({ usage }) => console.log('Tokens:', usage?.totalTokens)
851
- * });
998
+ * // Usage is included in result - strip before sending to client
999
+ * const { usage, ...clientResult } = await runtime.chat(body);
1000
+ * await billing.record(usage);
1001
+ * res.json(clientResult);
852
1002
  * ```
853
1003
  */
854
1004
  chat(request: ChatRequest, options?: {
855
1005
  signal?: AbortSignal;
856
- onFinish?: (result: {
857
- messages: DoneEventMessage[];
858
- usage?: {
859
- promptTokens: number;
860
- completionTokens: number;
861
- totalTokens: number;
862
- };
863
- }) => Promise<void> | void;
864
1006
  }): Promise<CollectedResult>;
1007
+ /**
1008
+ * Generate a complete response (non-streaming)
1009
+ *
1010
+ * Like Vercel AI SDK's generateText() - clean, non-streaming API.
1011
+ * Returns GenerateResult with .toResponse() for CopilotChat format.
1012
+ *
1013
+ * @example
1014
+ * ```typescript
1015
+ * // Simple usage
1016
+ * const result = await runtime.generate(body);
1017
+ * console.log(result.text);
1018
+ *
1019
+ * // CopilotChat format response (Express)
1020
+ * res.json(result.toResponse());
1021
+ *
1022
+ * // CopilotChat format response (Next.js)
1023
+ * return Response.json(result.toResponse());
1024
+ *
1025
+ * // With persistence callback
1026
+ * const result = await runtime.generate(body, {
1027
+ * onFinish: async ({ messages }) => {
1028
+ * await db.saveMessages(messages);
1029
+ * },
1030
+ * });
1031
+ * ```
1032
+ */
1033
+ generate(request: ChatRequest, options?: GenerateOptions): Promise<GenerateResult>;
865
1034
  /**
866
1035
  * Create Express-compatible handler middleware
867
1036
  *
@@ -1164,4 +1333,4 @@ declare function generateThreadId(): string;
1164
1333
  */
1165
1334
  declare function generateToolCallId(): string;
1166
1335
 
1167
- export { AIProvider, ActionDefinition, type ActionRequest, AgentLoopConfig, type AgentLoopOptions, type ChatRequest, type CollectedResult, DEFAULT_MAX_ITERATIONS, DoneEventMessage, GenerateTextParams, GenerateTextResult, LLMAdapter, Message, type RequestContext, Runtime, type RuntimeConfig, StreamEvent, StreamResult, type StreamResultOptions, StreamTextParams, StreamTextResult, TokenUsageRaw, Tool, ToolCallInfo, ToolContext, ToolDefinition, ToolResponse, createEventStream, createExpressHandler, createExpressMiddleware, createHonoApp, createNextHandler, createNodeHandler, createRuntime, createSSEHeaders, createSSEResponse, createStreamResult, createTextStreamHeaders, createTextStreamResponse, formatSSEData, formatToolsForAnthropic, formatToolsForGoogle, formatToolsForOpenAI, generateMessageId, generateText, generateThreadId, generateToolCallId, pipeSSEToResponse, pipeTextToResponse, runAgentLoop, streamText, tool };
1336
+ export { AIProvider, ActionDefinition, type ActionRequest, AgentLoopConfig, type AgentLoopOptions, type ChatRequest, type CollectedResult, type CopilotChatResponse, DEFAULT_MAX_ITERATIONS, DoneEventMessage, GenerateResult, type GenerateResultData, GenerateTextParams, GenerateTextResult, LLMAdapter, Message, type RequestContext, Runtime, type RuntimeConfig, StreamEvent, StreamResult, type StreamResultOptions, StreamTextParams, StreamTextResult, TokenUsageRaw, Tool, ToolCallInfo, ToolContext, ToolDefinition, ToolResponse, createEventStream, createExpressHandler, createExpressMiddleware, createHonoApp, createNextHandler, createNodeHandler, createRuntime, createSSEHeaders, createSSEResponse, createStreamResult, createTextStreamHeaders, createTextStreamResponse, formatSSEData, formatToolsForAnthropic, formatToolsForGoogle, formatToolsForOpenAI, generateMessageId, generateText, generateThreadId, generateToolCallId, pipeSSEToResponse, pipeTextToResponse, runAgentLoop, streamText, tool };