@capekai/core 1.0.6 → 1.0.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capekai/core",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "Bun-native composable agent runtime and framework for Capek.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -8,6 +8,7 @@ import {
8
8
  type Tool,
9
9
  } from 'ai';
10
10
  import { getModelWithMetadata } from '../core/model-utils';
11
+ import { openAiModelOmitsTemperature } from '../core/provider-utils';
11
12
  import type { ModelFactoryResult } from '../providers/types';
12
13
 
13
14
  export interface TextModelRequest {
@@ -21,7 +22,7 @@ export interface TextModelRequest {
21
22
  }
22
23
 
23
24
  export async function runTextModel(request: TextModelRequest): Promise<string> {
24
- const { model, omitMaxOutputTokens, providerOptions, useProviderInstructions } = await getModelWithMetadata({
25
+ const { model, omitMaxOutputTokens, omitTemperature, providerOptions, useProviderInstructions } = await getModelWithMetadata({
25
26
  modelId: request.modelId,
26
27
  providerId: request.providerId,
27
28
  systemPrompt: request.systemPrompt,
@@ -34,7 +35,7 @@ export async function runTextModel(request: TextModelRequest): Promise<string> {
34
35
  ...(omitMaxOutputTokens || request.maxOutputTokens === undefined
35
36
  ? {}
36
37
  : { maxOutputTokens: request.maxOutputTokens }),
37
- temperature: request.temperature,
38
+ ...(omitTemperature ? {} : { temperature: request.temperature }),
38
39
  providerOptions: providerOptions as Parameters<typeof streamText>[0]['providerOptions'],
39
40
  });
40
41
  return stream.text;
@@ -57,6 +58,7 @@ export function createOpenAiResponsesModel(request: OpenAiResponsesModelRequest)
57
58
  model: openai.responses(request.modelId) as unknown as LanguageModel,
58
59
  useProviderInstructions: true,
59
60
  omitMaxOutputTokens: true,
61
+ omitTemperature: openAiModelOmitsTemperature(request.modelId),
60
62
  providerOptions: {
61
63
  openai: {
62
64
  instructions: request.systemPrompt || 'You are a helpful assistant.',
package/src/core/agent.ts CHANGED
@@ -141,7 +141,7 @@ export async function* streamChat(options: ChatOptions): AsyncGenerator<MessageE
141
141
  selfDelegationAvailable,
142
142
  });
143
143
 
144
- const { model, useProviderInstructions, omitMaxOutputTokens, providerOptions: baseProviderOptions } =
144
+ const { model, useProviderInstructions, omitMaxOutputTokens, omitTemperature, providerOptions: baseProviderOptions } =
145
145
  await getModelWithMetadata({
146
146
  modelId: resolvedModelId,
147
147
  providerId,
@@ -199,7 +199,7 @@ export async function* streamChat(options: ChatOptions): AsyncGenerator<MessageE
199
199
  tools: aiTools,
200
200
  maxOutputTokens: omitMaxOutputTokens ? undefined : getMaxOutputTokens(resolvedModelId),
201
201
  providerOptions: streamConfig.providerOptions as Parameters<typeof streamText>[0]['providerOptions'],
202
- temperature: streamConfig.temperature,
202
+ ...(omitTemperature ? {} : { temperature: streamConfig.temperature }),
203
203
  stopWhen: stepCountIs(streamConfig.maxSteps),
204
204
  abortSignal: abortController.signal,
205
205
  experimental_onStepStart,
@@ -682,10 +682,21 @@ export async function handleChat<Origin>(
682
682
  return;
683
683
  }
684
684
 
685
- if (result.isFatal || result.interrupted) {
685
+ if (result.isFatal) {
686
686
  return;
687
687
  }
688
688
 
689
+ if (result.interrupted) {
690
+ // The old turn has finished cleanup; queued input starts a fresh turn.
691
+ const next = await drainQueue(ctx, sessionId);
692
+ if (!next) {
693
+ return;
694
+ }
695
+ currentContent = next.content;
696
+ currentAttachments = next.attachments;
697
+ continue;
698
+ }
699
+
689
700
  if (result.isQueueDrainable) {
690
701
  const next = await drainQueue(ctx, sessionId);
691
702
  if (next) {
@@ -1,6 +1,6 @@
1
1
  import { type LanguageModel } from 'ai';
2
2
  import { createOpenAI } from '@ai-sdk/openai';
3
- import { findProviderFromModel, parseModelSpecifier } from './provider-utils';
3
+ import { findProviderFromModel, openAiModelOmitsTemperature, parseModelSpecifier } from './provider-utils';
4
4
  import { findModel, getApiKeyForProvider, getLLMBaseUrl, getModelsConfig } from '../configuration/runtime';
5
5
  import { createModelForProvider, getProvider } from '../providers/registry';
6
6
  import { isSandboxActive } from '../runtime/host-dependencies';
@@ -9,6 +9,7 @@ export interface ModelWithMetadata {
9
9
  model: LanguageModel;
10
10
  useProviderInstructions?: boolean;
11
11
  omitMaxOutputTokens?: boolean;
12
+ omitTemperature?: boolean;
12
13
  providerOptions?: Record<string, Record<string, unknown>>;
13
14
  }
14
15
 
@@ -46,6 +47,7 @@ export async function getModelWithMetadata(
46
47
  model: result.model,
47
48
  useProviderInstructions: result.useProviderInstructions,
48
49
  omitMaxOutputTokens: result.omitMaxOutputTokens,
50
+ omitTemperature: result.omitTemperature,
49
51
  providerOptions: result.providerOptions,
50
52
  };
51
53
  }
@@ -77,6 +79,7 @@ export async function getModelWithMetadata(
77
79
  model: result.model,
78
80
  useProviderInstructions: result.useProviderInstructions,
79
81
  omitMaxOutputTokens: result.omitMaxOutputTokens,
82
+ omitTemperature: result.omitTemperature,
80
83
  providerOptions: result.providerOptions,
81
84
  };
82
85
  }
@@ -132,6 +135,7 @@ export async function getModelWithMetadata(
132
135
  });
133
136
  return {
134
137
  model: openai.responses(model) as unknown as LanguageModel,
138
+ omitTemperature: openAiModelOmitsTemperature(model),
135
139
  providerOptions: {
136
140
  openai: {
137
141
  promptCacheKey: options.sessionId,
@@ -19,6 +19,10 @@ const PROVIDER_PREFIXES: Array<{ test: (m: string) => boolean; provider: string
19
19
  { test: (m) => m.startsWith('deepseek-'), provider: 'deepseek' },
20
20
  ];
21
21
 
22
+ export function openAiModelOmitsTemperature(modelId: string): boolean {
23
+ return modelId.startsWith('gpt-6');
24
+ }
25
+
22
26
  export interface ParsedModelSpecifier {
23
27
  modelId: string;
24
28
  providerId?: string;
@@ -12,6 +12,7 @@ export interface ModelFactoryResult {
12
12
  model: LanguageModel;
13
13
  useProviderInstructions?: boolean;
14
14
  omitMaxOutputTokens?: boolean;
15
+ omitTemperature?: boolean;
15
16
  providerOptions?: Record<string, Record<string, unknown>>;
16
17
  }
17
18