@genesislcap/foundation-ai 14.455.0 → 14.455.1-GENC-1324.1
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/dist/dts/index.d.ts +2 -1
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/transports/anthropic-transport.d.ts.map +1 -1
- package/dist/dts/transports/gemini-malformed-call.d.ts +17 -0
- package/dist/dts/transports/gemini-malformed-call.d.ts.map +1 -0
- package/dist/dts/transports/gemini-transport.d.ts +10 -0
- package/dist/dts/transports/gemini-transport.d.ts.map +1 -1
- package/dist/dts/types/chat.types.d.ts +97 -9
- package/dist/dts/types/chat.types.d.ts.map +1 -1
- package/dist/dts/types/config.types.d.ts +1 -1
- package/dist/dts/types/config.types.d.ts.map +1 -1
- package/dist/dts/utils/temperature.d.ts +49 -0
- package/dist/dts/utils/temperature.d.ts.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/transports/anthropic-transport.js +32 -5
- package/dist/esm/transports/gemini-malformed-call.js +242 -0
- package/dist/esm/transports/gemini-transport.js +255 -48
- package/dist/esm/types/config.types.js +3 -0
- package/dist/esm/utils/temperature.js +56 -0
- package/dist/foundation-ai.api.json +235 -4
- package/dist/foundation-ai.d.ts +137 -10
- package/package.json +12 -11
package/dist/dts/index.d.ts
CHANGED
|
@@ -5,9 +5,10 @@ export { GeminiProvider } from './providers/gemini-provider';
|
|
|
5
5
|
export { AnthropicTransport } from './transports/anthropic-transport';
|
|
6
6
|
export { GeminiTransport, MalformedFunctionCallError } from './transports/gemini-transport';
|
|
7
7
|
export { AI_FEATURE_FLAG, isAIFeatureEnabled } from './utils/feature-flags';
|
|
8
|
+
export { ChatTemperature } from './utils/temperature';
|
|
8
9
|
export { SUPPORTED_ANTHROPIC_MODEL_IDS, SUPPORTED_GEMINI_MODEL_IDS } from './types';
|
|
9
10
|
export type { AIConfig, AIStatus, AIProviderType, AnthropicAIConfig, AnthropicModelId, ChromeAIConfig, ChromeAvailability, GeminiAIConfig, GeminiModelId, ServerAIConfig, } from './types';
|
|
10
|
-
export type { AgentPickerMode, ChatAgentConfig, ChatAgentPickerConfig, ChatAnimationsConfig, ChatAttachment, ChatConfig, ChatDriverResult, ChatInputDuringExecutionMode, ChatMessage, ChatInteraction, ChatRequestOptions, ChatRole, ChatStreamChunk, ChatToolCall, ChatToolCallUnknown, ChatToolDefinition, ChatToolHandlers, ChatToolResult, ChatUiConfig, ChatSuggestionsConfig, InteractionRequestOptions, InteractionResult, SubAgentFailureReason, SubAgentRequestOptions, } from './types/chat.types';
|
|
11
|
+
export type { AgentPickerMode, ChatAgentConfig, ChatAgentPickerConfig, ChatAnimationsConfig, ChatAttachment, ChatConfig, ChatDriverResult, ChatInputDuringExecutionMode, ChatMessage, ChatInteraction, ChatRequestOptions, ChatResponseMeta, ChatRole, ChatStreamChunk, ChatToolCall, ChatToolCallUnknown, ChatToolChoice, ChatToolDefinition, ChatToolHandlers, ChatToolResult, ChatUiConfig, ChatSuggestionsConfig, InteractionRequestOptions, InteractionResult, SubAgentFailureReason, SubAgentRequestOptions, } from './types/chat.types';
|
|
11
12
|
export { isChatToolCallUnknown } from './types/chat.types';
|
|
12
13
|
export type { ChatTransport } from './types/chat-transport.types';
|
|
13
14
|
export type { CostReportingTransport } from './types/transports.types';
|
package/dist/dts/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,UAAU,EACV,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AACpF,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1E,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,UAAU,EACV,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AACpF,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1E,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-transport.d.ts","sourceRoot":"","sources":["../../../src/transports/anthropic-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAEV,WAAW,EACX,kBAAkB,
|
|
1
|
+
{"version":3,"file":"anthropic-transport.d.ts","sourceRoot":"","sources":["../../../src/transports/anthropic-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAEV,WAAW,EACX,kBAAkB,EAGnB,MAAM,qBAAqB,CAAC;AAqE7B,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8DD;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,YAAW,WAAW,EAAE,aAAa,EAAE,sBAAsB;IAC3F,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC;;;;;OAKG;IACH,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,GAAE,wBAA6B;IAmBjD,SAAS,IAAI;QAAE,QAAQ,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,gBAAgB,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAQrF,iGAAiG;IACjG,eAAe,IAAI,MAAM;IAIzB,oFAAoF;IACpF,iBAAiB,IAAI,IAAI;IAMnB,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgDvE,eAAe,CACnB,OAAO,EAAE,WAAW,EAAE,EACtB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,WAAW,CAAC;IA2CvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAa;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IAEhD;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA0BrB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAkE3B,OAAO,CAAC,qBAAqB;IAkD7B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAK;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAO;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAO;IACzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAO;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAIxC;IACF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAQ;YAEjC,IAAI;CA8DnB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A tool call recovered from a malformed `finishMessage`: the tool name plus
|
|
3
|
+
* its decoded keyword arguments. The transport stamps an id and wraps it in a
|
|
4
|
+
* `ChatMessage` exactly as it would a well-formed call.
|
|
5
|
+
*/
|
|
6
|
+
export interface ParsedFunctionCall {
|
|
7
|
+
name: string;
|
|
8
|
+
args: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Attempts to recover a structured tool call from a Gemini
|
|
12
|
+
* `MALFORMED_FUNCTION_CALL` `finishMessage`. Returns the parsed call only when
|
|
13
|
+
* it parses cleanly AND its tool name is one of the offered tools; otherwise
|
|
14
|
+
* returns null so the caller can fall back to the existing retry path.
|
|
15
|
+
*/
|
|
16
|
+
export declare function repairMalformedFunctionCall(finishMessage: string | undefined, offeredToolNames: ReadonlySet<string>): ParsedFunctionCall | null;
|
|
17
|
+
//# sourceMappingURL=gemini-malformed-call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-malformed-call.d.ts","sourceRoot":"","sources":["../../../src/transports/gemini-malformed-call.ts"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AA+MD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,GACpC,kBAAkB,GAAG,IAAI,CAU3B"}
|
|
@@ -74,6 +74,16 @@ export declare class GeminiTransport implements AITransport, ChatTransport, Cost
|
|
|
74
74
|
private logTokenUsage;
|
|
75
75
|
private toGeminiContents;
|
|
76
76
|
private fromGeminiResponse;
|
|
77
|
+
/**
|
|
78
|
+
* Log the full shape of a blank or non-STOP response so its cause is legible
|
|
79
|
+
* without re-deriving it: a thinking-only STOP (substantial `thoughtsTokenCount`,
|
|
80
|
+
* ~0 `candidatesTokenCount`) vs a content block (`SAFETY` / `RECITATION`) vs a
|
|
81
|
+
* token cap (`MAX_TOKENS`) vs a prompt-level block (top-level
|
|
82
|
+
* `promptFeedback.blockReason`). On 2.5 Pro — which always thinks — a blank
|
|
83
|
+
* STOP carrying substantial thought tokens is the "thought, then stopped
|
|
84
|
+
* without answering" signature.
|
|
85
|
+
*/
|
|
86
|
+
private logAbnormalResponse;
|
|
77
87
|
private buildEndpoint;
|
|
78
88
|
private static readonly MAX_RETRIES;
|
|
79
89
|
private static readonly RATE_LIMIT_STATUS;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-transport.d.ts","sourceRoot":"","sources":["../../../src/transports/gemini-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC7B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAEV,WAAW,EACX,kBAAkB,
|
|
1
|
+
{"version":3,"file":"gemini-transport.d.ts","sourceRoot":"","sources":["../../../src/transports/gemini-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC7B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAEV,WAAW,EACX,kBAAkB,EAInB,MAAM,qBAAqB,CAAC;AAgI7B,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA0CD;;;;;;GAMG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IACvC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM;gBAAtB,aAAa,CAAC,EAAE,MAAM;CAI5C;AAED;;;;;;;;GAQG;AACH,qBAAa,eAAgB,YAAW,WAAW,EAAE,aAAa,EAAE,sBAAsB;IACxF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD;;;;;OAKG;IACH,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,GAAE,qBAA0B;IAc9C,SAAS,IAAI;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAQ/E,iGAAiG;IACjG,eAAe,IAAI,MAAM;IAIzB,oFAAoF;IACpF,iBAAiB,IAAI,IAAI;IAMnB,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBvE,eAAe,CACnB,OAAO,EAAE,WAAW,EAAE,EACtB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,WAAW,CAAC;IA0DvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAa;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IAEhD;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,gBAAgB;IA2ExB,OAAO,CAAC,kBAAkB;IAwJ1B;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAK;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAO;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAO;IACzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAGxC;IACF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAQ;YAEjC,IAAI;IA+DlB,OAAO,CAAC,eAAe;CAexB"}
|
|
@@ -13,6 +13,16 @@ type ChatToolCallBase = {
|
|
|
13
13
|
id: string;
|
|
14
14
|
name: string;
|
|
15
15
|
args: Record<string, unknown>;
|
|
16
|
+
/**
|
|
17
|
+
* Opaque, provider-specific state attached to this tool call that must
|
|
18
|
+
* round-trip back to the originating provider on later requests. Keyed by
|
|
19
|
+
* provider id; a transport reads only its own key and ignores the rest, so
|
|
20
|
+
* the cross-provider API stays neutral. The contents are provider-owned and
|
|
21
|
+
* are NOT part of the stable public contract — do not read them outside the
|
|
22
|
+
* owning transport. (Today this carries the Gemini reasoning signature that
|
|
23
|
+
* Gemini 3 requires replayed across multi-turn tool calls.)
|
|
24
|
+
*/
|
|
25
|
+
providerMetadata?: Record<string, unknown>;
|
|
16
26
|
/**
|
|
17
27
|
* Set by the driver when this tool call is a fold lifecycle event.
|
|
18
28
|
* Used by the template to render fold opens/closes distinctly.
|
|
@@ -150,6 +160,44 @@ export interface ChatMessage {
|
|
|
150
160
|
* cost without re-deriving rates.
|
|
151
161
|
*/
|
|
152
162
|
cost?: number;
|
|
163
|
+
/**
|
|
164
|
+
* Provider diagnostic for the request that produced this message — the raw
|
|
165
|
+
* finish reason plus, where the provider reports them, the reasoning-token
|
|
166
|
+
* count and a parts breakdown. Set by transports that expose it (Gemini); the
|
|
167
|
+
* driver folds it into the debug-log meta events (e.g. an empty-response
|
|
168
|
+
* `turn.retry`/`turn.error`) so a blank or truncated turn's cause is legible.
|
|
169
|
+
* Not shown to the user.
|
|
170
|
+
*/
|
|
171
|
+
responseMeta?: ChatResponseMeta;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Provider-reported diagnostic for a single chat response, surfaced so the
|
|
175
|
+
* driver can attribute a blank/abnormal turn without re-deriving it. All fields
|
|
176
|
+
* are optional — a transport sets only what its provider reports.
|
|
177
|
+
*
|
|
178
|
+
* @beta
|
|
179
|
+
*/
|
|
180
|
+
export interface ChatResponseMeta {
|
|
181
|
+
/**
|
|
182
|
+
* Raw provider finish reason for the turn, verbatim — e.g. Gemini `'STOP'` |
|
|
183
|
+
* `'MAX_TOKENS'` | `'SAFETY'` | `'RECITATION'`. The key signal when triaging a
|
|
184
|
+
* blank or truncated turn.
|
|
185
|
+
*/
|
|
186
|
+
finishReason?: string;
|
|
187
|
+
/**
|
|
188
|
+
* Reasoning ("thinking") tokens billed for this turn, when the provider
|
|
189
|
+
* reports them (Gemini 2.5). A high count alongside ~0 output tokens and a
|
|
190
|
+
* `'STOP'` finish is the "thought, then stopped without answering" signature.
|
|
191
|
+
*/
|
|
192
|
+
thoughtsTokens?: number;
|
|
193
|
+
/** Count of response parts by kind — distinguishes a truly empty turn from a thinking-only one. */
|
|
194
|
+
parts?: {
|
|
195
|
+
functionCall: number;
|
|
196
|
+
thought: number;
|
|
197
|
+
text: number;
|
|
198
|
+
};
|
|
199
|
+
/** Provider block reason when the prompt/response was blocked rather than generated. */
|
|
200
|
+
blockReason?: string;
|
|
153
201
|
}
|
|
154
202
|
/**
|
|
155
203
|
* JSON Schema-based tool definition for function calling.
|
|
@@ -290,6 +338,36 @@ export type ChatToolHandlers<TSubAgent extends {
|
|
|
290
338
|
*/
|
|
291
339
|
releaseAgent?: () => void;
|
|
292
340
|
}) => Promise<unknown>>;
|
|
341
|
+
/**
|
|
342
|
+
* Controls whether (and how) the model may call a tool on a given turn. Maps to
|
|
343
|
+
* each provider's "tool choice" / "function calling mode" control:
|
|
344
|
+
*
|
|
345
|
+
* - `'auto'` (the default when omitted) — the model decides whether to call a
|
|
346
|
+
* tool or answer with text. Anthropic leaves `tool_choice` unset; Gemini
|
|
347
|
+
* leaves `functionCallingConfig` unset (`AUTO`).
|
|
348
|
+
* - `'required'` — the model MUST call one of the available tools. Maps to
|
|
349
|
+
* Anthropic `tool_choice: { type: 'any' }` and Gemini
|
|
350
|
+
* `functionCallingConfig.mode: 'ANY'`.
|
|
351
|
+
* - `'none'` — the model MUST NOT call a tool (text answer only). Maps to
|
|
352
|
+
* Anthropic `tool_choice: { type: 'none' }` and Gemini
|
|
353
|
+
* `functionCallingConfig.mode: 'NONE'`.
|
|
354
|
+
* - `{ tool: name }` — the model MUST call exactly the named tool. Maps to
|
|
355
|
+
* Anthropic `tool_choice: { type: 'tool', name }` and Gemini
|
|
356
|
+
* `functionCallingConfig.mode: 'ANY', allowedFunctionNames: [name]`. Use this
|
|
357
|
+
* for surgical forcing at a single-tool juncture (e.g. force a classifier
|
|
358
|
+
* tool in an intake step) while leaving `'auto'` everywhere multi-step work
|
|
359
|
+
* happens.
|
|
360
|
+
*
|
|
361
|
+
* Forcing (`'required'` / `{ tool }`) is a no-op when no tools are advertised.
|
|
362
|
+
*
|
|
363
|
+
* NOTE: forcing is incompatible with Anthropic extended/adaptive thinking — a
|
|
364
|
+
* request must not enable both.
|
|
365
|
+
*
|
|
366
|
+
* @beta
|
|
367
|
+
*/
|
|
368
|
+
export type ChatToolChoice = 'auto' | 'required' | 'none' | {
|
|
369
|
+
tool: string;
|
|
370
|
+
};
|
|
293
371
|
/**
|
|
294
372
|
* Options for a chat request.
|
|
295
373
|
*
|
|
@@ -301,19 +379,29 @@ export interface ChatRequestOptions {
|
|
|
301
379
|
attachments?: ChatAttachment[];
|
|
302
380
|
signal?: AbortSignal;
|
|
303
381
|
/**
|
|
304
|
-
* Whether the model
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
* can only end a turn by calling a tool (e.g. its completion tool), never by
|
|
309
|
-
* emitting a free-text answer.
|
|
382
|
+
* Whether (and how) the model may call a tool this turn. Defaults to `'auto'`
|
|
383
|
+
* when omitted. Used by sub-agent loops (which force `'required'` so a turn
|
|
384
|
+
* can only end via a tool call) and configurable per agent / per agent state.
|
|
385
|
+
* See {@link ChatToolChoice}.
|
|
310
386
|
*
|
|
311
|
-
*
|
|
312
|
-
|
|
387
|
+
* @beta
|
|
388
|
+
*/
|
|
389
|
+
toolChoice?: ChatToolChoice;
|
|
390
|
+
/**
|
|
391
|
+
* Provider-agnostic sampling temperature, normalized to `0`–`1` and anchored
|
|
392
|
+
* on each provider's own default: `0` is fully deterministic, `0.5` is the
|
|
393
|
+
* provider's default, and `1` is the most random it allows. So `< 0.5` is
|
|
394
|
+
* "more focused than default" and `> 0.5` is "more random than default" on
|
|
395
|
+
* every provider, even though their native ranges differ (Anthropic
|
|
396
|
+
* `temperature` `0`–`1`, Gemini `generationConfig.temperature` `0`–`2`). Where
|
|
397
|
+
* a provider's default equals its max (Anthropic), the upper half is flat.
|
|
398
|
+
* Values outside `0`–`1` are clamped. Omit to use the provider/model default
|
|
399
|
+
* (equivalent to `0.5`). Prefer the `ChatTemperature` presets for common
|
|
400
|
+
* intents.
|
|
313
401
|
*
|
|
314
402
|
* @beta
|
|
315
403
|
*/
|
|
316
|
-
|
|
404
|
+
temperature?: number;
|
|
317
405
|
}
|
|
318
406
|
/**
|
|
319
407
|
* The result returned by a driver after processing a user turn.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.types.d.ts","sourceRoot":"","sources":["../../../src/types/chat.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,cAAc,CAAC;AAEjF;;;;GAIG;AACH,KAAK,gBAAgB,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;OAIG;IACH,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC;CAC/B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IACnD,OAAO,EAAE,IAAI,CAAC;IACd,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,GAAG,EAAE,IAAI,mBAAmB,CAEjF;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,OAAO,IAAI;IAC3C,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,GAAG,CAAC;IACV,2IAA2I;IAC3I,QAAQ,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;CACvC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.types.d.ts","sourceRoot":"","sources":["../../../src/types/chat.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ export type AIProviderType = 'openai' | 'chrome' | 'gemini' | 'anthropic' | 'non
|
|
|
9
9
|
*
|
|
10
10
|
* @beta
|
|
11
11
|
*/
|
|
12
|
-
export type GeminiModelId = 'gemini-2.5-pro' | 'gemini-2.5-flash' | 'gemini-2.5-flash-lite';
|
|
12
|
+
export type GeminiModelId = 'gemini-2.5-pro' | 'gemini-2.5-flash' | 'gemini-2.5-flash-lite' | 'gemini-3.5-flash' | 'gemini-3.1-flash-lite' | 'gemini-3.1-pro-preview';
|
|
13
13
|
/** @beta */
|
|
14
14
|
export declare const SUPPORTED_GEMINI_MODEL_IDS: readonly GeminiModelId[];
|
|
15
15
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAEnF;;;;GAIG;AACH,MAAM,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAEnF;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,gBAAgB,GAChB,kBAAkB,GAClB,uBAAuB,GACvB,kBAAkB,GAClB,uBAAuB,GAEvB,wBAAwB,CAAC;AAE7B,YAAY;AACZ,eAAO,MAAM,0BAA0B,EAAE,SAAS,aAAa,EAOrD,CAAC;AAEX;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,mBAAmB,GACnB,2BAA2B,CAAC;AAEhC,YAAY;AACZ,eAAO,MAAM,6BAA6B,EAAE,SAAS,gBAAgB,EAI3D,CAAC;AAEX;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,6DAA6D;AAC7D,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AAErE;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,YAAY,CAAC,EAAE,QAAQ,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,YAAY,EAAE,QAAQ,CAAC;IACvB,4GAA4G;IAC5G,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,YAAY,EAAE,WAAW,CAAC;IAC1B,mHAAmH;IACnH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,cAAc,GAAG,cAAc,GAAG,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translate a provider-agnostic, normalized temperature into a provider's
|
|
3
|
+
* native range, anchored on the provider's own default so the normalized scale
|
|
4
|
+
* means the same thing everywhere:
|
|
5
|
+
*
|
|
6
|
+
* - `0` → `0` (fully deterministic),
|
|
7
|
+
* - `0.5` → the provider's default temperature,
|
|
8
|
+
* - `1` → the provider's maximum.
|
|
9
|
+
*
|
|
10
|
+
* Values between the anchors interpolate linearly within each half, so `< 0.5`
|
|
11
|
+
* is "more focused than default" and `> 0.5` is "more random than default" on
|
|
12
|
+
* every provider — even though the providers' native ranges differ (Anthropic
|
|
13
|
+
* default/max `1`/`1`, Gemini `1`/`2`). Where a provider's default equals its
|
|
14
|
+
* max (Anthropic), the upper half is flat: it cannot go hotter than its default.
|
|
15
|
+
*
|
|
16
|
+
* The input is clamped to `[0, 1]` before scaling, so an out-of-range value can
|
|
17
|
+
* never produce a native temperature the provider would reject.
|
|
18
|
+
*/
|
|
19
|
+
export declare function scaleTemperature(normalized: number, { defaultTemp, maxTemp }: {
|
|
20
|
+
defaultTemp: number;
|
|
21
|
+
maxTemp: number;
|
|
22
|
+
}): number;
|
|
23
|
+
/**
|
|
24
|
+
* Provider-agnostic, normalized sampling-temperature presets in `0`–`1` space —
|
|
25
|
+
* named handles for the values most callers actually want, so intent reads
|
|
26
|
+
* better than a bare magnitude. Each maps through `scaleTemperature` to the
|
|
27
|
+
* active provider's native range, so the same preset means the same intent
|
|
28
|
+
* whichever provider services the turn:
|
|
29
|
+
*
|
|
30
|
+
* - `ChatTemperature.Deterministic` (`0`) — greedy/argmax sampling.
|
|
31
|
+
* - `ChatTemperature.Focused` (`0.25`) — low but not greedy; precise tool calls
|
|
32
|
+
* and extraction work where you still want a little slack.
|
|
33
|
+
* - `ChatTemperature.Balanced` (`0.5`) — the provider's own default.
|
|
34
|
+
* - `ChatTemperature.Creative` (`0.75`) — hotter than default, short of the ceiling.
|
|
35
|
+
* - `ChatTemperature.Maximum` (`1`) — the hottest the active provider allows.
|
|
36
|
+
*
|
|
37
|
+
* (On a provider whose default equals its max — Anthropic — `Creative` and
|
|
38
|
+
* `Maximum` coincide; see `scaleTemperature`.)
|
|
39
|
+
*
|
|
40
|
+
* @beta
|
|
41
|
+
*/
|
|
42
|
+
export declare const ChatTemperature: {
|
|
43
|
+
readonly Deterministic: 0;
|
|
44
|
+
readonly Focused: 0.25;
|
|
45
|
+
readonly Balanced: 0.5;
|
|
46
|
+
readonly Creative: 0.75;
|
|
47
|
+
readonly Maximum: 1;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=temperature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temperature.d.ts","sourceRoot":"","sources":["../../../src/utils/temperature.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjE,MAAM,CAKR;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export { GeminiProvider } from './providers/gemini-provider';
|
|
|
4
4
|
export { AnthropicTransport } from './transports/anthropic-transport';
|
|
5
5
|
export { GeminiTransport, MalformedFunctionCallError } from './transports/gemini-transport';
|
|
6
6
|
export { AI_FEATURE_FLAG, isAIFeatureEnabled } from './utils/feature-flags';
|
|
7
|
+
export { ChatTemperature } from './utils/temperature';
|
|
7
8
|
export { SUPPORTED_ANTHROPIC_MODEL_IDS, SUPPORTED_GEMINI_MODEL_IDS } from './types';
|
|
8
9
|
export { isChatToolCallUnknown } from './types/chat.types';
|
|
9
10
|
export { isSpeechRecognitionAvailable, startSpeechRecognition } from './utils/speech-to-text';
|
|
@@ -2,11 +2,28 @@ import { __awaiter } from "tslib";
|
|
|
2
2
|
import { SUPPORTED_ANTHROPIC_MODEL_IDS, } from '../types';
|
|
3
3
|
import { combineSignals } from '../utils/combine-signals';
|
|
4
4
|
import { logger } from '../utils/logger';
|
|
5
|
+
import { scaleTemperature } from '../utils/temperature';
|
|
5
6
|
const ANTHROPIC_DIRECT_URL = 'https://api.anthropic.com/v1/messages';
|
|
6
7
|
const ANTHROPIC_API_VERSION = '2023-06-01';
|
|
7
8
|
const DEFAULT_MODEL = 'claude-haiku-4-5-20251001';
|
|
8
9
|
const DEFAULT_TIMEOUT = 180000; // 3 minutes
|
|
9
10
|
const DEFAULT_MAX_TOKENS = 4096;
|
|
11
|
+
/** Anthropic's native default + ceiling temperature — https://docs.claude.com/en/api/messages */
|
|
12
|
+
const ANTHROPIC_DEFAULT_TEMPERATURE = 1;
|
|
13
|
+
const ANTHROPIC_MAX_TEMPERATURE = 1;
|
|
14
|
+
/**
|
|
15
|
+
* Map a provider-agnostic {@link ChatToolChoice} to Anthropic's `tool_choice`.
|
|
16
|
+
* Returns undefined for the default (`'auto'`) so the request omits the field.
|
|
17
|
+
*/
|
|
18
|
+
function toAnthropicToolChoice(choice) {
|
|
19
|
+
if (!choice || choice === 'auto')
|
|
20
|
+
return undefined;
|
|
21
|
+
if (choice === 'required')
|
|
22
|
+
return { type: 'any' };
|
|
23
|
+
if (choice === 'none')
|
|
24
|
+
return { type: 'none' };
|
|
25
|
+
return { type: 'tool', name: choice.tool };
|
|
26
|
+
}
|
|
10
27
|
/**
|
|
11
28
|
* Maximum input context window (tokens) per supported Claude model.
|
|
12
29
|
* Source: https://docs.claude.com/en/docs/about-claude/models/overview
|
|
@@ -149,14 +166,24 @@ export class AnthropicTransport {
|
|
|
149
166
|
input_schema: t.parameters,
|
|
150
167
|
}));
|
|
151
168
|
}
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
// turn can only end via
|
|
169
|
+
// Map the requested tool-call mode to Anthropic's tool_choice — only
|
|
170
|
+
// meaningful when tools exist. `'required'`/`{ tool }` force a tool call so
|
|
171
|
+
// a turn can only end via one (e.g. a sub-agent's completion tool).
|
|
155
172
|
// NOTE: Anthropic rejects forced tool use when extended/adaptive thinking
|
|
156
173
|
// is enabled; this transport never sets `thinking` on the chat path, so the
|
|
157
174
|
// two never collide. Keep that invariant if `thinking` is ever added here.
|
|
158
|
-
if ((
|
|
159
|
-
|
|
175
|
+
if ((_b = body.tools) === null || _b === void 0 ? void 0 : _b.length) {
|
|
176
|
+
const toolChoice = toAnthropicToolChoice(options === null || options === void 0 ? void 0 : options.toolChoice);
|
|
177
|
+
if (toolChoice)
|
|
178
|
+
body.tool_choice = toolChoice;
|
|
179
|
+
}
|
|
180
|
+
// Normalized [0,1] temperature → Anthropic's native range, anchored so 0.5
|
|
181
|
+
// maps to its default. (Default == max here, so the upper half is flat.)
|
|
182
|
+
if ((options === null || options === void 0 ? void 0 : options.temperature) != null) {
|
|
183
|
+
body.temperature = scaleTemperature(options.temperature, {
|
|
184
|
+
defaultTemp: ANTHROPIC_DEFAULT_TEMPERATURE,
|
|
185
|
+
maxTemp: ANTHROPIC_MAX_TEMPERATURE,
|
|
186
|
+
});
|
|
160
187
|
}
|
|
161
188
|
const response = yield this.post(body, options === null || options === void 0 ? void 0 : options.signal);
|
|
162
189
|
return this.fromAnthropicResponse(response);
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
// ── MALFORMED_FUNCTION_CALL repair ─────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Gemini occasionally returns `finishReason: "MALFORMED_FUNCTION_CALL"` when it
|
|
4
|
+
// has actually produced a complete, correct tool call but serialised it as a
|
|
5
|
+
// Python statement instead of the API's structured format, e.g.
|
|
6
|
+
//
|
|
7
|
+
// print(default_api.vfs_edit(new_string = "…", old_string = "…", path = "…", replace_all = true))
|
|
8
|
+
//
|
|
9
|
+
// The intended call is fully present in `candidates[0].finishMessage`. Rather
|
|
10
|
+
// than throw and burn a ChatDriver retry (a full re-roll that may regenerate
|
|
11
|
+
// something worse, or malform again), we parse the call back out and hand it to
|
|
12
|
+
// the transport as a normal structured tool call — unwrapping a wrong envelope,
|
|
13
|
+
// not guessing. The parser is deliberately fail-closed: on ANY ambiguity it
|
|
14
|
+
// returns null and the transport falls back to throwing
|
|
15
|
+
// `MalformedFunctionCallError`, leaving today's retry behaviour unchanged. It
|
|
16
|
+
// never returns a half-parsed call.
|
|
17
|
+
const MALFORMED_CALL_ANCHOR = 'default_api.';
|
|
18
|
+
const PRINT_WRAPPER_RE = /print\(\s*$/;
|
|
19
|
+
const UNICODE_ESCAPE_DIGITS = 4;
|
|
20
|
+
const HEX_ESCAPE_DIGITS = 2;
|
|
21
|
+
const HEX_RADIX = 16;
|
|
22
|
+
/**
|
|
23
|
+
* Recursive-descent scanner for a single Python-style `default_api.<tool>(...)`
|
|
24
|
+
* call. Walks the string character by character so that delimiters (commas,
|
|
25
|
+
* parens, quotes, brackets, newlines) appearing *inside* string-literal
|
|
26
|
+
* arguments don't prematurely terminate parsing. Throws on the first unexpected
|
|
27
|
+
* token; callers treat any throw as "not confidently parseable".
|
|
28
|
+
*/
|
|
29
|
+
class MalformedFunctionCallParser {
|
|
30
|
+
constructor(src) {
|
|
31
|
+
this.src = src;
|
|
32
|
+
this.pos = 0;
|
|
33
|
+
}
|
|
34
|
+
parse() {
|
|
35
|
+
const anchor = this.src.indexOf(MALFORMED_CALL_ANCHOR);
|
|
36
|
+
if (anchor === -1)
|
|
37
|
+
this.bail();
|
|
38
|
+
// Tolerate an enclosing `print(` wrapper (the observed Python form) or a
|
|
39
|
+
// bare call. Any other preamble (e.g. "Malformed function call: ") is
|
|
40
|
+
// ignored — we only anchor on `default_api.`.
|
|
41
|
+
const wrapped = PRINT_WRAPPER_RE.test(this.src.slice(0, anchor));
|
|
42
|
+
this.pos = anchor;
|
|
43
|
+
const call = this.parseCall();
|
|
44
|
+
this.skipWhitespace();
|
|
45
|
+
if (wrapped) {
|
|
46
|
+
this.expect(')');
|
|
47
|
+
this.skipWhitespace();
|
|
48
|
+
}
|
|
49
|
+
// Strict: nothing may follow the call. In particular a second
|
|
50
|
+
// `default_api.` (batched calls) bails rather than silently dropping work.
|
|
51
|
+
if (this.pos !== this.src.length)
|
|
52
|
+
this.bail();
|
|
53
|
+
return call;
|
|
54
|
+
}
|
|
55
|
+
parseCall() {
|
|
56
|
+
this.expectLiteral(MALFORMED_CALL_ANCHOR);
|
|
57
|
+
const name = this.readIdentifier();
|
|
58
|
+
this.expect('(');
|
|
59
|
+
const args = this.parseKwargs();
|
|
60
|
+
this.expect(')');
|
|
61
|
+
return { name, args };
|
|
62
|
+
}
|
|
63
|
+
parseKwargs() {
|
|
64
|
+
const args = {};
|
|
65
|
+
for (;;) {
|
|
66
|
+
this.skipWhitespace();
|
|
67
|
+
// Empty arg list, or a tolerated trailing comma before the closing paren.
|
|
68
|
+
if (this.peek() === ')')
|
|
69
|
+
break;
|
|
70
|
+
const key = this.readIdentifier();
|
|
71
|
+
this.skipWhitespace();
|
|
72
|
+
this.expect('=');
|
|
73
|
+
this.skipWhitespace();
|
|
74
|
+
const value = this.parseValue();
|
|
75
|
+
if (Object.prototype.hasOwnProperty.call(args, key))
|
|
76
|
+
this.bail();
|
|
77
|
+
args[key] = value;
|
|
78
|
+
this.skipWhitespace();
|
|
79
|
+
const next = this.peek();
|
|
80
|
+
if (next === ',') {
|
|
81
|
+
this.pos += 1;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (next === ')')
|
|
85
|
+
break;
|
|
86
|
+
this.bail();
|
|
87
|
+
}
|
|
88
|
+
return args;
|
|
89
|
+
}
|
|
90
|
+
parseValue() {
|
|
91
|
+
const ch = this.peek();
|
|
92
|
+
if (ch === '"' || ch === "'")
|
|
93
|
+
return this.readString();
|
|
94
|
+
if (ch === '-' || ch === '+' || this.isDigit(ch))
|
|
95
|
+
return this.readNumber();
|
|
96
|
+
if (/[A-Za-z]/.test(ch))
|
|
97
|
+
return this.readBareword();
|
|
98
|
+
// Unhandled value form (e.g. a list `[…]` or dict `{…}`) — bail.
|
|
99
|
+
return this.bail();
|
|
100
|
+
}
|
|
101
|
+
readString() {
|
|
102
|
+
const quote = this.src[this.pos];
|
|
103
|
+
this.pos += 1; // opening quote
|
|
104
|
+
let out = '';
|
|
105
|
+
for (;;) {
|
|
106
|
+
if (this.pos >= this.src.length)
|
|
107
|
+
this.bail(); // unterminated → truncation guard
|
|
108
|
+
const c = this.src[this.pos];
|
|
109
|
+
this.pos += 1;
|
|
110
|
+
if (c === quote)
|
|
111
|
+
return out; // closing quote
|
|
112
|
+
if (c === '\\') {
|
|
113
|
+
out += this.readEscape();
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
out += c;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
readEscape() {
|
|
120
|
+
if (this.pos >= this.src.length)
|
|
121
|
+
this.bail();
|
|
122
|
+
const e = this.src[this.pos];
|
|
123
|
+
this.pos += 1;
|
|
124
|
+
switch (e) {
|
|
125
|
+
case 'n':
|
|
126
|
+
return '\n';
|
|
127
|
+
case 't':
|
|
128
|
+
return '\t';
|
|
129
|
+
case 'r':
|
|
130
|
+
return '\r';
|
|
131
|
+
case 'b':
|
|
132
|
+
return '\b';
|
|
133
|
+
case 'f':
|
|
134
|
+
return '\f';
|
|
135
|
+
case '\\':
|
|
136
|
+
return '\\';
|
|
137
|
+
case '"':
|
|
138
|
+
return '"';
|
|
139
|
+
case "'":
|
|
140
|
+
return "'";
|
|
141
|
+
case '/':
|
|
142
|
+
return '/';
|
|
143
|
+
case 'u':
|
|
144
|
+
return this.readHexCodepoint(UNICODE_ESCAPE_DIGITS);
|
|
145
|
+
case 'x':
|
|
146
|
+
return this.readHexCodepoint(HEX_ESCAPE_DIGITS);
|
|
147
|
+
default:
|
|
148
|
+
// Unknown escape — refuse rather than risk a silent mis-decode.
|
|
149
|
+
return this.bail();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
readHexCodepoint(digits) {
|
|
153
|
+
const hex = this.src.slice(this.pos, this.pos + digits);
|
|
154
|
+
if (hex.length !== digits || !/^[0-9a-fA-F]+$/.test(hex))
|
|
155
|
+
this.bail();
|
|
156
|
+
this.pos += digits;
|
|
157
|
+
return String.fromCharCode(parseInt(hex, HEX_RADIX));
|
|
158
|
+
}
|
|
159
|
+
readNumber() {
|
|
160
|
+
const start = this.pos;
|
|
161
|
+
if (this.peek() === '-' || this.peek() === '+')
|
|
162
|
+
this.pos += 1;
|
|
163
|
+
while (this.pos < this.src.length && /[0-9.eE+-]/.test(this.src[this.pos])) {
|
|
164
|
+
this.pos += 1;
|
|
165
|
+
}
|
|
166
|
+
const value = Number(this.src.slice(start, this.pos));
|
|
167
|
+
if (!Number.isFinite(value))
|
|
168
|
+
this.bail();
|
|
169
|
+
return value;
|
|
170
|
+
}
|
|
171
|
+
readBareword() {
|
|
172
|
+
const word = this.readIdentifier();
|
|
173
|
+
switch (word) {
|
|
174
|
+
case 'true':
|
|
175
|
+
case 'True':
|
|
176
|
+
return true;
|
|
177
|
+
case 'false':
|
|
178
|
+
case 'False':
|
|
179
|
+
return false;
|
|
180
|
+
// Python serialises an omitted/optional kwarg as `None` (and sometimes a
|
|
181
|
+
// JSON-ish `null`); decode both to `null` rather than bailing the whole call.
|
|
182
|
+
case 'null':
|
|
183
|
+
case 'None':
|
|
184
|
+
return null;
|
|
185
|
+
default:
|
|
186
|
+
return this.bail();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
readIdentifier() {
|
|
190
|
+
const start = this.pos;
|
|
191
|
+
if (!/[A-Za-z_]/.test(this.peek()))
|
|
192
|
+
this.bail();
|
|
193
|
+
while (this.pos < this.src.length && /[A-Za-z0-9_]/.test(this.src[this.pos])) {
|
|
194
|
+
this.pos += 1;
|
|
195
|
+
}
|
|
196
|
+
return this.src.slice(start, this.pos);
|
|
197
|
+
}
|
|
198
|
+
isDigit(ch) {
|
|
199
|
+
return ch >= '0' && ch <= '9';
|
|
200
|
+
}
|
|
201
|
+
peek() {
|
|
202
|
+
return this.pos < this.src.length ? this.src[this.pos] : '';
|
|
203
|
+
}
|
|
204
|
+
skipWhitespace() {
|
|
205
|
+
while (this.pos < this.src.length && /\s/.test(this.src[this.pos])) {
|
|
206
|
+
this.pos += 1;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
expect(ch) {
|
|
210
|
+
if (this.src[this.pos] !== ch)
|
|
211
|
+
this.bail();
|
|
212
|
+
this.pos += 1;
|
|
213
|
+
}
|
|
214
|
+
expectLiteral(literal) {
|
|
215
|
+
if (this.src.slice(this.pos, this.pos + literal.length) !== literal)
|
|
216
|
+
this.bail();
|
|
217
|
+
this.pos += literal.length;
|
|
218
|
+
}
|
|
219
|
+
bail() {
|
|
220
|
+
throw new Error('MalformedFunctionCallParser: unexpected token');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Attempts to recover a structured tool call from a Gemini
|
|
225
|
+
* `MALFORMED_FUNCTION_CALL` `finishMessage`. Returns the parsed call only when
|
|
226
|
+
* it parses cleanly AND its tool name is one of the offered tools; otherwise
|
|
227
|
+
* returns null so the caller can fall back to the existing retry path.
|
|
228
|
+
*/
|
|
229
|
+
export function repairMalformedFunctionCall(finishMessage, offeredToolNames) {
|
|
230
|
+
if (!finishMessage)
|
|
231
|
+
return null;
|
|
232
|
+
let call;
|
|
233
|
+
try {
|
|
234
|
+
call = new MalformedFunctionCallParser(finishMessage).parse();
|
|
235
|
+
}
|
|
236
|
+
catch (_a) {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
if (!offeredToolNames.has(call.name))
|
|
240
|
+
return null;
|
|
241
|
+
return call;
|
|
242
|
+
}
|