@chatcops/core 0.3.2 → 0.5.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.
Files changed (162) hide show
  1. package/dist/agent/chat.d.ts +13 -0
  2. package/dist/agent/chat.d.ts.map +1 -0
  3. package/dist/agent/chat.js +42 -0
  4. package/dist/agent/chat.js.map +1 -0
  5. package/dist/agent/errors.d.ts +14 -0
  6. package/dist/agent/errors.d.ts.map +1 -0
  7. package/dist/agent/errors.js +24 -0
  8. package/dist/agent/errors.js.map +1 -0
  9. package/dist/agent/index.d.ts +5 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +5 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/run-turn.d.ts +68 -0
  14. package/dist/agent/run-turn.d.ts.map +1 -0
  15. package/dist/agent/run-turn.js +344 -0
  16. package/dist/agent/run-turn.js.map +1 -0
  17. package/dist/agent/tool-registry.d.ts +28 -0
  18. package/dist/agent/tool-registry.d.ts.map +1 -0
  19. package/dist/agent/tool-registry.js +69 -0
  20. package/dist/agent/tool-registry.js.map +1 -0
  21. package/dist/analytics/index.d.ts +1 -0
  22. package/dist/analytics/index.d.ts.map +1 -1
  23. package/dist/analytics/index.js +1 -0
  24. package/dist/analytics/index.js.map +1 -1
  25. package/dist/analytics/sink.d.ts +24 -0
  26. package/dist/analytics/sink.d.ts.map +1 -0
  27. package/dist/analytics/sink.js +106 -0
  28. package/dist/analytics/sink.js.map +1 -0
  29. package/dist/conversation/index.d.ts +1 -0
  30. package/dist/conversation/index.d.ts.map +1 -1
  31. package/dist/conversation/index.js.map +1 -1
  32. package/dist/conversation/manager.d.ts +62 -6
  33. package/dist/conversation/manager.d.ts.map +1 -1
  34. package/dist/conversation/manager.js +109 -30
  35. package/dist/conversation/manager.js.map +1 -1
  36. package/dist/conversation/store.d.ts +6 -5
  37. package/dist/conversation/store.d.ts.map +1 -1
  38. package/dist/conversation/store.js +4 -0
  39. package/dist/conversation/store.js.map +1 -1
  40. package/dist/index.d.ts +18 -4
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +14 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/limits/budget.d.ts +84 -0
  45. package/dist/limits/budget.d.ts.map +1 -0
  46. package/dist/limits/budget.js +114 -0
  47. package/dist/limits/budget.js.map +1 -0
  48. package/dist/limits/rate-limit.d.ts +53 -0
  49. package/dist/limits/rate-limit.d.ts.map +1 -0
  50. package/dist/limits/rate-limit.js +68 -0
  51. package/dist/limits/rate-limit.js.map +1 -0
  52. package/dist/parts.d.ts +9 -0
  53. package/dist/parts.d.ts.map +1 -0
  54. package/dist/parts.js +17 -0
  55. package/dist/parts.js.map +1 -0
  56. package/dist/protocol/ai-sdk.d.ts +27 -0
  57. package/dist/protocol/ai-sdk.d.ts.map +1 -0
  58. package/dist/protocol/ai-sdk.js +127 -0
  59. package/dist/protocol/ai-sdk.js.map +1 -0
  60. package/dist/protocol/errors.d.ts +10 -0
  61. package/dist/protocol/errors.d.ts.map +1 -0
  62. package/dist/protocol/errors.js +42 -0
  63. package/dist/protocol/errors.js.map +1 -0
  64. package/dist/protocol/index.d.ts +9 -0
  65. package/dist/protocol/index.d.ts.map +1 -0
  66. package/dist/protocol/index.js +6 -0
  67. package/dist/protocol/index.js.map +1 -0
  68. package/dist/protocol/legacy.d.ts +18 -0
  69. package/dist/protocol/legacy.d.ts.map +1 -0
  70. package/dist/protocol/legacy.js +41 -0
  71. package/dist/protocol/legacy.js.map +1 -0
  72. package/dist/protocol/sse.d.ts +10 -0
  73. package/dist/protocol/sse.d.ts.map +1 -0
  74. package/dist/protocol/sse.js +15 -0
  75. package/dist/protocol/sse.js.map +1 -0
  76. package/dist/protocol/v1.d.ts +140 -0
  77. package/dist/protocol/v1.d.ts.map +1 -0
  78. package/dist/protocol/v1.js +15 -0
  79. package/dist/protocol/v1.js.map +1 -0
  80. package/dist/providers/base.d.ts +17 -15
  81. package/dist/providers/base.d.ts.map +1 -1
  82. package/dist/providers/base.js +43 -31
  83. package/dist/providers/base.js.map +1 -1
  84. package/dist/providers/claude.d.ts +40 -2
  85. package/dist/providers/claude.d.ts.map +1 -1
  86. package/dist/providers/claude.js +250 -113
  87. package/dist/providers/claude.js.map +1 -1
  88. package/dist/providers/gemini.d.ts +23 -3
  89. package/dist/providers/gemini.d.ts.map +1 -1
  90. package/dist/providers/gemini.js +245 -102
  91. package/dist/providers/gemini.js.map +1 -1
  92. package/dist/providers/history.d.ts +52 -0
  93. package/dist/providers/history.d.ts.map +1 -0
  94. package/dist/providers/history.js +212 -0
  95. package/dist/providers/history.js.map +1 -0
  96. package/dist/providers/index.d.ts +5 -5
  97. package/dist/providers/index.d.ts.map +1 -1
  98. package/dist/providers/index.js +5 -4
  99. package/dist/providers/index.js.map +1 -1
  100. package/dist/providers/openai.d.ts +37 -3
  101. package/dist/providers/openai.d.ts.map +1 -1
  102. package/dist/providers/openai.js +246 -140
  103. package/dist/providers/openai.js.map +1 -1
  104. package/dist/providers/registry.d.ts +7 -0
  105. package/dist/providers/registry.d.ts.map +1 -0
  106. package/dist/providers/registry.js +12 -0
  107. package/dist/providers/registry.js.map +1 -0
  108. package/dist/providers/schema.d.ts +16 -0
  109. package/dist/providers/schema.d.ts.map +1 -0
  110. package/dist/providers/schema.js +80 -0
  111. package/dist/providers/schema.js.map +1 -0
  112. package/dist/providers/tool-execution.d.ts +10 -0
  113. package/dist/providers/tool-execution.d.ts.map +1 -1
  114. package/dist/providers/tool-execution.js +38 -12
  115. package/dist/providers/tool-execution.js.map +1 -1
  116. package/dist/providers/types.d.ts +71 -0
  117. package/dist/providers/types.d.ts.map +1 -0
  118. package/dist/providers/types.js +2 -0
  119. package/dist/providers/types.js.map +1 -0
  120. package/dist/storage/adapt.d.ts +15 -0
  121. package/dist/storage/adapt.d.ts.map +1 -0
  122. package/dist/storage/adapt.js +83 -0
  123. package/dist/storage/adapt.js.map +1 -0
  124. package/dist/storage/errors.d.ts +18 -0
  125. package/dist/storage/errors.d.ts.map +1 -0
  126. package/dist/storage/errors.js +28 -0
  127. package/dist/storage/errors.js.map +1 -0
  128. package/dist/storage/index.d.ts +5 -0
  129. package/dist/storage/index.d.ts.map +1 -0
  130. package/dist/storage/index.js +4 -0
  131. package/dist/storage/index.js.map +1 -0
  132. package/dist/storage/memory.d.ts +24 -0
  133. package/dist/storage/memory.d.ts.map +1 -0
  134. package/dist/storage/memory.js +265 -0
  135. package/dist/storage/memory.js.map +1 -0
  136. package/dist/storage/types.d.ts +118 -0
  137. package/dist/storage/types.d.ts.map +1 -0
  138. package/dist/storage/types.js +2 -0
  139. package/dist/storage/types.js.map +1 -0
  140. package/dist/testing/conformance.d.ts +29 -0
  141. package/dist/testing/conformance.d.ts.map +1 -0
  142. package/dist/testing/conformance.js +335 -0
  143. package/dist/testing/conformance.js.map +1 -0
  144. package/dist/testing/index.d.ts +3 -0
  145. package/dist/testing/index.d.ts.map +1 -0
  146. package/dist/testing/index.js +5 -0
  147. package/dist/testing/index.js.map +1 -0
  148. package/dist/testing/provider.d.ts +45 -0
  149. package/dist/testing/provider.d.ts.map +1 -0
  150. package/dist/testing/provider.js +82 -0
  151. package/dist/testing/provider.js.map +1 -0
  152. package/dist/tools/base.d.ts +14 -4
  153. package/dist/tools/base.d.ts.map +1 -1
  154. package/dist/tools/base.js +4 -2
  155. package/dist/tools/base.js.map +1 -1
  156. package/dist/tools/lead-capture.d.ts +3 -1
  157. package/dist/tools/lead-capture.d.ts.map +1 -1
  158. package/dist/tools/lead-capture.js +6 -1
  159. package/dist/tools/lead-capture.js.map +1 -1
  160. package/dist/types.d.ts +168 -4
  161. package/dist/types.d.ts.map +1 -1
  162. package/package.json +53 -5
@@ -0,0 +1,212 @@
1
+ import { partsOf } from '../parts.js';
2
+ /**
3
+ * Turns stored messages into a history every provider accepts: it starts with
4
+ * a user turn and alternates between user and assistant.
5
+ *
6
+ * - System messages and empty messages are dropped.
7
+ * - Leading assistant turns are dropped (history trimming can leave one first).
8
+ * - Consecutive turns with the same role are merged with a blank line, for
9
+ * example a user message saved before a provider call that then failed.
10
+ */
11
+ export function normalizeHistory(messages) {
12
+ const normalized = [];
13
+ for (const message of messages) {
14
+ if (message.role !== 'user' && message.role !== 'assistant')
15
+ continue;
16
+ if (!message.content.trim())
17
+ continue;
18
+ if (normalized.length === 0 && message.role !== 'user')
19
+ continue;
20
+ const previous = normalized.at(-1);
21
+ if (previous && previous.role === message.role) {
22
+ previous.content += `\n\n${message.content}`;
23
+ }
24
+ else {
25
+ normalized.push({ role: message.role, content: message.content });
26
+ }
27
+ }
28
+ return normalized;
29
+ }
30
+ /** Stands in for a tool result that was never recorded, so the call isn't left open. */
31
+ const NOT_RUN = 'The tool was not run.';
32
+ function isTurnPart(part) {
33
+ switch (part.type) {
34
+ case 'text':
35
+ // Blank text is dropped unless it carries a signature the provider wants back.
36
+ return part.text.trim() !== '' || part.providerMetadata !== undefined;
37
+ case 'reasoning':
38
+ case 'tool-call':
39
+ case 'tool-result':
40
+ return true;
41
+ default:
42
+ return false;
43
+ }
44
+ }
45
+ function notRun(call) {
46
+ return { type: 'tool-result', toolCallId: call.toolCallId, toolName: call.toolName, error: NOT_RUN };
47
+ }
48
+ /**
49
+ * The parts of one message as the model should see them. Every tool call gets
50
+ * a result: calls whose result was never recorded (a cancelled turn) get a
51
+ * "not run" error, and results without a matching call are dropped, because
52
+ * every provider rejects either kind of loose end.
53
+ */
54
+ function turnParts(message) {
55
+ let parts = partsOf(message).filter(isTurnPart);
56
+ // An aborted reply ends in half a sentence. Keep the finished tool steps
57
+ // before it and drop the text after the last result.
58
+ if (message.status === 'aborted') {
59
+ let lastResult = -1;
60
+ parts.forEach((part, i) => {
61
+ if (part.type === 'tool-result')
62
+ lastResult = i;
63
+ });
64
+ parts = parts.filter((part, i) => i <= lastResult || part.type === 'tool-call');
65
+ }
66
+ const out = [];
67
+ const known = new Set();
68
+ let open = [];
69
+ let inResults = false;
70
+ const closeOpenCalls = () => {
71
+ for (const call of open)
72
+ out.push(notRun(call));
73
+ open = [];
74
+ };
75
+ for (const part of parts) {
76
+ if (part.type === 'tool-result') {
77
+ if (!known.has(part.toolCallId))
78
+ continue;
79
+ known.delete(part.toolCallId);
80
+ open = open.filter((call) => call.toolCallId !== part.toolCallId);
81
+ out.push(part);
82
+ inResults = true;
83
+ continue;
84
+ }
85
+ // A model part after results starts the next step, so any call from the
86
+ // last step that still has no result never ran.
87
+ if (inResults) {
88
+ closeOpenCalls();
89
+ inResults = false;
90
+ }
91
+ if (part.type === 'tool-call') {
92
+ known.add(part.toolCallId);
93
+ open.push(part);
94
+ }
95
+ out.push(part);
96
+ }
97
+ closeOpenCalls();
98
+ return out;
99
+ }
100
+ /**
101
+ * Like `normalizeHistory`, but keeps message parts, so tool calls, their
102
+ * results and reasoning signatures from earlier steps go back to the model.
103
+ *
104
+ * - System messages, empty messages and leading assistant turns are dropped.
105
+ * - Sources, captured leads and handoff notes are dropped; they're for people.
106
+ * - Turns with the same role in a row are merged, and text that meets across
107
+ * the join is combined with a blank line, as `normalizeHistory` does.
108
+ */
109
+ export function normalizeTurns(messages) {
110
+ const turns = [];
111
+ for (const message of messages) {
112
+ if (message.role !== 'user' && message.role !== 'assistant')
113
+ continue;
114
+ const parts = turnParts(message);
115
+ if (parts.length === 0)
116
+ continue;
117
+ if (turns.length === 0 && message.role !== 'user')
118
+ continue;
119
+ const previous = turns.at(-1);
120
+ if (!previous || previous.role !== message.role) {
121
+ turns.push({ role: message.role, parts });
122
+ continue;
123
+ }
124
+ const last = previous.parts.at(-1);
125
+ const [first, ...rest] = parts;
126
+ if (last?.type === 'text' && first.type === 'text') {
127
+ previous.parts[previous.parts.length - 1] = { ...last, text: `${last.text}\n\n${first.text}` };
128
+ previous.parts.push(...rest);
129
+ }
130
+ else {
131
+ previous.parts.push(...parts);
132
+ }
133
+ }
134
+ return turns;
135
+ }
136
+ function partLength(part) {
137
+ switch (part.type) {
138
+ case 'text':
139
+ case 'reasoning':
140
+ return part.text.length;
141
+ case 'tool-call':
142
+ return part.toolName.length + jsonLength(part.input);
143
+ case 'tool-result':
144
+ return jsonLength(part.output) + (part.error?.length ?? 0);
145
+ default:
146
+ return 0;
147
+ }
148
+ }
149
+ function jsonLength(value) {
150
+ if (value === undefined)
151
+ return 0;
152
+ try {
153
+ return JSON.stringify(value)?.length ?? 0;
154
+ }
155
+ catch {
156
+ return 0;
157
+ }
158
+ }
159
+ /**
160
+ * A rough token count for budgeting, on the high side: about 3.5 characters
161
+ * per token for English, plus a few tokens of per-message overhead. Real
162
+ * counts differ by model; this only has to keep a long conversation from
163
+ * growing without bound. Messages with parts are counted by their parts, so
164
+ * tool inputs and results count too.
165
+ */
166
+ export function estimateTokens(message) {
167
+ const length = message.parts
168
+ ? message.parts.reduce((sum, part) => sum + partLength(part), 0)
169
+ : message.content.length;
170
+ return Math.ceil(length / 3.5) + 4;
171
+ }
172
+ /** History budget used when nothing else is configured. */
173
+ export const DEFAULT_MAX_HISTORY_TOKENS = 32_000;
174
+ /**
175
+ * Keeps a conversation within a token budget before it goes to the model.
176
+ * The first user message stays (it usually says what the visitor came for),
177
+ * then as many of the newest messages as fit. The result never starts with
178
+ * an assistant turn. System messages are left out, since the system prompt
179
+ * is sent separately.
180
+ *
181
+ * Nothing stored changes; this only shapes what the model sees.
182
+ */
183
+ export function trimHistory(messages, maxTokens = DEFAULT_MAX_HISTORY_TOKENS) {
184
+ const turns = messages.filter((m) => m.role === 'user' || m.role === 'assistant');
185
+ const total = turns.reduce((sum, m) => sum + estimateTokens(m), 0);
186
+ if (total <= maxTokens)
187
+ return turns;
188
+ const firstUserIndex = turns.findIndex((m) => m.role === 'user');
189
+ if (firstUserIndex === -1)
190
+ return [];
191
+ const firstUser = turns[firstUserIndex];
192
+ let budget = maxTokens - estimateTokens(firstUser);
193
+ const recent = [];
194
+ for (let i = turns.length - 1; i > firstUserIndex; i--) {
195
+ const cost = estimateTokens(turns[i]);
196
+ if (cost > budget)
197
+ break;
198
+ budget -= cost;
199
+ recent.unshift(turns[i]);
200
+ }
201
+ // Start the kept tail on a user turn, so the model doesn't see the first
202
+ // question followed by an answer to something it never saw.
203
+ while (recent.length > 0 && recent[0].role !== 'user')
204
+ recent.shift();
205
+ // Always keep the latest message, even when it alone is over the budget:
206
+ // without it there's nothing to answer.
207
+ const latest = turns.at(-1);
208
+ if (recent.length === 0 && latest && latest !== firstUser)
209
+ return [firstUser, latest];
210
+ return [firstUser, ...recent];
211
+ }
212
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/providers/history.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- export type { AIProvider } from './base.js';
2
- export { createProvider, toProviderMessages, toClaudeTools, toOpenAITools, toGeminiTools } from './base.js';
3
- export { ClaudeProvider } from './claude.js';
4
- export { OpenAIProvider } from './openai.js';
5
- export { GeminiProvider } from './gemini.js';
1
+ export type { AIProvider, NormalizedMessage, NormalizedTurn, TurnPart } from './base.js';
2
+ export type { FinishReason, ProviderEvent, ProviderStepParams } from './types.js';
3
+ export { createProvider, isAIProvider, normalizeHistory, normalizeTurns, trimHistory, estimateTokens, toProviderMessages, toClaudeTools, toOpenAITools, toGeminiTools, DEFAULT_MAX_TOKENS, } from './base.js';
4
+ export { registerProvider, type ProviderFactory } from './registry.js';
5
+ export { toolInputSchema, legacyParametersToSchema, validateTools, ToolDefinitionError } from './schema.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACzF,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EACL,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -1,5 +1,6 @@
1
- export { createProvider, toProviderMessages, toClaudeTools, toOpenAITools, toGeminiTools } from './base.js';
2
- export { ClaudeProvider } from './claude.js';
3
- export { OpenAIProvider } from './openai.js';
4
- export { GeminiProvider } from './gemini.js';
1
+ export { createProvider, isAIProvider, normalizeHistory, normalizeTurns, trimHistory, estimateTokens, toProviderMessages, toClaudeTools, toOpenAITools, toGeminiTools, DEFAULT_MAX_TOKENS, } from './base.js';
2
+ // ClaudeProvider, OpenAIProvider and GeminiProvider are deliberately not exported
3
+ // here. Each one imports its SDK, which would load for every importer of core.
4
+ export { registerProvider } from './registry.js';
5
+ export { toolInputSchema, legacyParametersToSchema, validateTools, ToolDefinitionError } from './schema.js';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,kFAAkF;AAClF,+EAA+E;AAC/E,OAAO,EAAE,gBAAgB,EAAwB,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -1,11 +1,45 @@
1
- import type { ProviderConfig, ProviderChatParams } from '../types.js';
1
+ import OpenAI from 'openai';
2
+ import type { ChatMessage, ProviderChatParams, ProviderConfig } from '../types.js';
2
3
  import type { AIProvider } from './base.js';
4
+ import type { ProviderEvent, ProviderStepParams } from './types.js';
5
+ /**
6
+ * OpenAI reasoning models (o-series, GPT-5 and later) take `reasoning_effort`
7
+ * and reject a non-default `temperature`. Models behind a custom `baseURL`
8
+ * are treated as regular chat models.
9
+ */
10
+ export declare function isOpenAIReasoningModel(model: string, baseURL?: string): boolean;
11
+ type MessageParam = OpenAI.Chat.ChatCompletionMessageParam;
12
+ /**
13
+ * Stored history as OpenAI chat messages: the system prompt first, then for
14
+ * each step an assistant message with its `tool_calls`, followed by one
15
+ * `tool` message per result in call order. Reasoning isn't sent back; the
16
+ * chat completions API has no field for it.
17
+ */
18
+ export declare function toOpenAIStepMessages(systemPrompt: string, messages: ChatMessage[]): MessageParam[];
3
19
  export declare class OpenAIProvider implements AIProvider {
4
20
  name: string;
5
21
  private client;
6
- private model;
7
- constructor(config: ProviderConfig);
22
+ readonly model: string;
23
+ private reasoning;
24
+ private effort;
25
+ private maxTokensParam;
26
+ private supportsTools;
27
+ /** Set once a server rejects `stream_options`; usage isn't asked for after that. */
28
+ private streamUsage;
29
+ constructor(config: ProviderConfig, options?: {
30
+ compatible?: boolean;
31
+ });
32
+ private request;
33
+ private openStream;
34
+ /** One model request: streams text, then reports tool calls, usage and why it stopped. */
35
+ step(params: ProviderStepParams): AsyncGenerator<ProviderEvent>;
36
+ /**
37
+ * A turn with tools run through `params.toolExecutor`, as text.
38
+ * @deprecated Use `runTurn()`, which also returns the reply's parts, status and usage.
39
+ */
8
40
  chat(params: ProviderChatParams): AsyncGenerator<string>;
41
+ /** @deprecated Use `runTurn()`. */
9
42
  chatSync(params: ProviderChatParams): Promise<string>;
10
43
  }
44
+ export {};
11
45
  //# sourceMappingURL=openai.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAkB5C,qBAAa,cAAe,YAAW,UAAU;IAC/C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,cAAc;IAK3B,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC;IAsGzD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CA4D5D"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EACV,WAAW,EAEX,kBAAkB,EAClB,cAAc,EAGf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAK5C,OAAO,KAAK,EAAgB,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAUlF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAG/E;AAED,KAAK,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC;AAE3D;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,YAAY,EAAE,CA4ClG;AAuCD,qBAAa,cAAe,YAAW,UAAU;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,MAAM,CAAS;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,aAAa,CAAU;IAC/B,oFAAoF;IACpF,OAAO,CAAC,WAAW,CAAQ;gBAEf,MAAM,EAAE,cAAc,EAAE,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO;IAsB1E,OAAO,CAAC,OAAO;YA6BD,UAAU;IAqBxB,0FAA0F;IACnF,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,aAAa,CAAC;IA6EtE;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC;IAIxD,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CAGtD"}