@ai-sdk/cerebras 2.0.51 → 2.0.53

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @ai-sdk/cerebras
2
2
 
3
+ ## 2.0.53
4
+
5
+ ### Patch Changes
6
+
7
+ - e99134d: feat(cerebras): add chat language model provider
8
+
9
+ ## 2.0.52
10
+
11
+ ### Patch Changes
12
+
13
+ - 96a365b: fix(cerebras): serialize reasoning parts as 'reasoning' on assistant messages
14
+
3
15
  ## 2.0.51
4
16
 
5
17
  ### Patch Changes
package/dist/index.js CHANGED
@@ -27,13 +27,84 @@ __export(index_exports, {
27
27
  module.exports = __toCommonJS(index_exports);
28
28
 
29
29
  // src/cerebras-provider.ts
30
- var import_openai_compatible = require("@ai-sdk/openai-compatible");
31
30
  var import_provider = require("@ai-sdk/provider");
32
31
  var import_provider_utils = require("@ai-sdk/provider-utils");
32
+
33
+ // src/cerebras-chat-language-model.ts
34
+ var import_openai_compatible = require("@ai-sdk/openai-compatible");
35
+ function isStructuredOutputWithToolCallsFinishReason({
36
+ rawFinishReason,
37
+ hasText,
38
+ responseFormatType
39
+ }) {
40
+ return responseFormatType === "json" && rawFinishReason === "tool_calls" && hasText;
41
+ }
42
+ var CerebrasChatLanguageModel = class extends import_openai_compatible.OpenAICompatibleChatLanguageModel {
43
+ async doGenerate(options) {
44
+ var _a;
45
+ const result = await super.doGenerate(options);
46
+ if (!isStructuredOutputWithToolCallsFinishReason({
47
+ rawFinishReason: result.finishReason.raw,
48
+ hasText: result.content.some(
49
+ (part) => part.type === "text" && part.text.length > 0
50
+ ),
51
+ responseFormatType: (_a = options.responseFormat) == null ? void 0 : _a.type
52
+ })) {
53
+ return result;
54
+ }
55
+ return {
56
+ ...result,
57
+ // Cerebras GLM can return valid structured output text while also
58
+ // repeating a tool call. Treat that mixed response as the final answer.
59
+ content: result.content.filter((part) => part.type !== "tool-call"),
60
+ finishReason: {
61
+ ...result.finishReason,
62
+ unified: "stop"
63
+ }
64
+ };
65
+ }
66
+ async doStream(options) {
67
+ const result = await super.doStream(options);
68
+ let hasText = false;
69
+ return {
70
+ ...result,
71
+ stream: result.stream.pipeThrough(
72
+ new TransformStream({
73
+ transform(part, controller) {
74
+ var _a, _b;
75
+ if (part.type === "text-delta" && part.delta.length > 0) {
76
+ hasText = true;
77
+ }
78
+ if (part.type === "finish" && isStructuredOutputWithToolCallsFinishReason({
79
+ rawFinishReason: part.finishReason.raw,
80
+ hasText,
81
+ responseFormatType: (_a = options.responseFormat) == null ? void 0 : _a.type
82
+ })) {
83
+ controller.enqueue({
84
+ ...part,
85
+ finishReason: {
86
+ ...part.finishReason,
87
+ unified: "stop"
88
+ }
89
+ });
90
+ return;
91
+ }
92
+ if (((_b = options.responseFormat) == null ? void 0 : _b.type) === "json" && hasText && (part.type === "tool-input-start" || part.type === "tool-input-delta" || part.type === "tool-input-end" || part.type === "tool-call")) {
93
+ return;
94
+ }
95
+ controller.enqueue(part);
96
+ }
97
+ })
98
+ )
99
+ };
100
+ }
101
+ };
102
+
103
+ // src/cerebras-provider.ts
33
104
  var import_v4 = require("zod/v4");
34
105
 
35
106
  // src/version.ts
36
- var VERSION = true ? "2.0.51" : "0.0.0-test";
107
+ var VERSION = true ? "2.0.53" : "0.0.0-test";
37
108
 
38
109
  // src/cerebras-provider.ts
39
110
  var cerebrasErrorSchema = import_v4.z.object({
@@ -46,6 +117,21 @@ var cerebrasErrorStructure = {
46
117
  errorSchema: cerebrasErrorSchema,
47
118
  errorToMessage: (data) => data.message
48
119
  };
120
+ function transformCerebrasRequestBody(args) {
121
+ return {
122
+ ...args,
123
+ messages: Array.isArray(args.messages) ? args.messages.map((message) => {
124
+ if (message == null || typeof message !== "object" || message.role !== "assistant" || !("reasoning_content" in message)) {
125
+ return message;
126
+ }
127
+ const { reasoning_content, ...rest } = message;
128
+ return {
129
+ ...rest,
130
+ ...!("reasoning" in rest) && reasoning_content !== void 0 ? { reasoning: reasoning_content } : {}
131
+ };
132
+ }) : args.messages
133
+ };
134
+ }
49
135
  function createCerebras(options = {}) {
50
136
  var _a;
51
137
  const baseURL = (0, import_provider_utils.withoutTrailingSlash)(
@@ -63,13 +149,14 @@ function createCerebras(options = {}) {
63
149
  `ai-sdk/cerebras/${VERSION}`
64
150
  );
65
151
  const createLanguageModel = (modelId) => {
66
- return new import_openai_compatible.OpenAICompatibleChatLanguageModel(modelId, {
152
+ return new CerebrasChatLanguageModel(modelId, {
67
153
  provider: `cerebras.chat`,
68
154
  url: ({ path }) => `${baseURL}${path}`,
69
155
  headers: getHeaders,
70
156
  fetch: options.fetch,
71
157
  errorStructure: cerebrasErrorStructure,
72
- supportsStructuredOutputs: true
158
+ supportsStructuredOutputs: true,
159
+ transformRequestBody: transformCerebrasRequestBody
73
160
  });
74
161
  };
75
162
  const provider = (modelId) => createLanguageModel(modelId);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/cerebras-provider.ts","../src/version.ts"],"sourcesContent":["export { createCerebras, cerebras } from './cerebras-provider';\nexport type {\n CerebrasProvider,\n CerebrasProviderSettings,\n} from './cerebras-provider';\nexport type { CerebrasErrorData } from './cerebras-provider';\nexport { VERSION } from './version';\n","import {\n OpenAICompatibleChatLanguageModel,\n type ProviderErrorStructure,\n} from '@ai-sdk/openai-compatible';\nimport {\n NoSuchModelError,\n type LanguageModelV3,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport type { CerebrasChatModelId } from './cerebras-chat-options';\nimport { z } from 'zod/v4';\nimport { VERSION } from './version';\n\n// Add error schema and structure\nconst cerebrasErrorSchema = z.object({\n message: z.string(),\n type: z.string(),\n param: z.string(),\n code: z.string(),\n});\n\nexport type CerebrasErrorData = z.infer<typeof cerebrasErrorSchema>;\n\nconst cerebrasErrorStructure: ProviderErrorStructure<CerebrasErrorData> = {\n errorSchema: cerebrasErrorSchema,\n errorToMessage: data => data.message,\n};\n\nexport interface CerebrasProviderSettings {\n /**\n * Cerebras API key.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface CerebrasProvider extends ProviderV3 {\n /**\n * Creates a Cerebras model for text generation.\n */\n (modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * Creates a Cerebras model for text generation.\n */\n languageModel(modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * Creates a Cerebras chat model for text generation.\n */\n chat(modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport function createCerebras(\n options: CerebrasProviderSettings = {},\n): CerebrasProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.cerebras.ai/v1',\n );\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'CEREBRAS_API_KEY',\n description: 'Cerebras API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/cerebras/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: CerebrasChatModelId) => {\n return new OpenAICompatibleChatLanguageModel(modelId, {\n provider: `cerebras.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n errorStructure: cerebrasErrorStructure,\n supportsStructuredOutputs: true,\n });\n };\n\n const provider = (modelId: CerebrasChatModelId) =>\n createLanguageModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const cerebras = createCerebras();\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,+BAGO;AACP,sBAIO;AACP,4BAKO;AAEP,gBAAkB;;;ACdX,IAAM,UACX,OACI,WACA;;;ADeN,IAAM,sBAAsB,YAAE,OAAO;AAAA,EACnC,SAAS,YAAE,OAAO;AAAA,EAClB,MAAM,YAAE,OAAO;AAAA,EACf,OAAO,YAAE,OAAO;AAAA,EAChB,MAAM,YAAE,OAAO;AACjB,CAAC;AAID,IAAM,yBAAoE;AAAA,EACxE,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK;AAC/B;AA4CO,SAAS,eACd,UAAoC,CAAC,GACnB;AA9EpB;AA+EE,QAAM,cAAU;AAAA,KACd,aAAQ,YAAR,YAAmB;AAAA,EACrB;AACA,QAAM,aAAa,UACjB;AAAA,IACE;AAAA,MACE,eAAe,cAAU,kCAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,mBAAmB,OAAO;AAAA,EAC5B;AAEF,QAAM,sBAAsB,CAAC,YAAiC;AAC5D,WAAO,IAAI,2DAAkC,SAAS;AAAA,MACpD,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,YAChB,oBAAoB,OAAO;AAE7B,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAEhB,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AACA,WAAS,qBAAqB,SAAS;AACvC,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEO,IAAM,WAAW,eAAe;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/cerebras-provider.ts","../src/cerebras-chat-language-model.ts","../src/version.ts"],"sourcesContent":["export { createCerebras, cerebras } from './cerebras-provider';\nexport type {\n CerebrasProvider,\n CerebrasProviderSettings,\n} from './cerebras-provider';\nexport type { CerebrasErrorData } from './cerebras-provider';\nexport { VERSION } from './version';\n","import type { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport {\n NoSuchModelError,\n type LanguageModelV3,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { CerebrasChatLanguageModel } from './cerebras-chat-language-model';\nimport type { CerebrasChatModelId } from './cerebras-chat-options';\nimport { z } from 'zod/v4';\nimport { VERSION } from './version';\n\n// Add error schema and structure\nconst cerebrasErrorSchema = z.object({\n message: z.string(),\n type: z.string(),\n param: z.string(),\n code: z.string(),\n});\n\nexport type CerebrasErrorData = z.infer<typeof cerebrasErrorSchema>;\n\nconst cerebrasErrorStructure: ProviderErrorStructure<CerebrasErrorData> = {\n errorSchema: cerebrasErrorSchema,\n errorToMessage: data => data.message,\n};\n\n/**\n * Cerebras expects assistant reasoning history in the `reasoning` field, while\n * the shared OpenAI-compatible converter serializes it as `reasoning_content`.\n */\nfunction transformCerebrasRequestBody(\n args: Record<string, any>,\n): Record<string, any> {\n return {\n ...args,\n messages: Array.isArray(args.messages)\n ? args.messages.map(message => {\n if (\n message == null ||\n typeof message !== 'object' ||\n message.role !== 'assistant' ||\n !('reasoning_content' in message)\n ) {\n return message;\n }\n\n const { reasoning_content, ...rest } = message;\n\n return {\n ...rest,\n ...(!('reasoning' in rest) && reasoning_content !== undefined\n ? { reasoning: reasoning_content }\n : {}),\n };\n })\n : args.messages,\n };\n}\n\nexport interface CerebrasProviderSettings {\n /**\n * Cerebras API key.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface CerebrasProvider extends ProviderV3 {\n /**\n * Creates a Cerebras model for text generation.\n */\n (modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * Creates a Cerebras model for text generation.\n */\n languageModel(modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * Creates a Cerebras chat model for text generation.\n */\n chat(modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport function createCerebras(\n options: CerebrasProviderSettings = {},\n): CerebrasProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.cerebras.ai/v1',\n );\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'CEREBRAS_API_KEY',\n description: 'Cerebras API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/cerebras/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: CerebrasChatModelId) => {\n return new CerebrasChatLanguageModel(modelId, {\n provider: `cerebras.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n errorStructure: cerebrasErrorStructure,\n supportsStructuredOutputs: true,\n transformRequestBody: transformCerebrasRequestBody,\n });\n };\n\n const provider = (modelId: CerebrasChatModelId) =>\n createLanguageModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const cerebras = createCerebras();\n","import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n} from '@ai-sdk/provider';\n\nfunction isStructuredOutputWithToolCallsFinishReason({\n rawFinishReason,\n hasText,\n responseFormatType,\n}: {\n rawFinishReason: string | undefined;\n hasText: boolean;\n responseFormatType:\n | NonNullable<LanguageModelV3CallOptions['responseFormat']>['type']\n | undefined;\n}) {\n return (\n responseFormatType === 'json' && rawFinishReason === 'tool_calls' && hasText\n );\n}\n\nexport class CerebrasChatLanguageModel extends OpenAICompatibleChatLanguageModel {\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const result = await super.doGenerate(options);\n\n if (\n !isStructuredOutputWithToolCallsFinishReason({\n rawFinishReason: result.finishReason.raw,\n hasText: result.content.some(\n part => part.type === 'text' && part.text.length > 0,\n ),\n responseFormatType: options.responseFormat?.type,\n })\n ) {\n return result;\n }\n\n return {\n ...result,\n // Cerebras GLM can return valid structured output text while also\n // repeating a tool call. Treat that mixed response as the final answer.\n content: result.content.filter(part => part.type !== 'tool-call'),\n finishReason: {\n ...result.finishReason,\n unified: 'stop',\n },\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const result = await super.doStream(options);\n let hasText = false;\n\n return {\n ...result,\n stream: result.stream.pipeThrough(\n new TransformStream<\n LanguageModelV3StreamPart,\n LanguageModelV3StreamPart\n >({\n transform(part, controller) {\n if (part.type === 'text-delta' && part.delta.length > 0) {\n hasText = true;\n }\n\n if (\n part.type === 'finish' &&\n isStructuredOutputWithToolCallsFinishReason({\n rawFinishReason: part.finishReason.raw,\n hasText,\n responseFormatType: options.responseFormat?.type,\n })\n ) {\n controller.enqueue({\n ...part,\n finishReason: {\n ...part.finishReason,\n unified: 'stop',\n },\n });\n return;\n }\n\n if (\n options.responseFormat?.type === 'json' &&\n hasText &&\n (part.type === 'tool-input-start' ||\n part.type === 'tool-input-delta' ||\n part.type === 'tool-input-end' ||\n part.type === 'tool-call')\n ) {\n return;\n }\n\n controller.enqueue(part);\n },\n }),\n ),\n };\n }\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,4 @@
1
1
  // src/cerebras-provider.ts
2
- import {
3
- OpenAICompatibleChatLanguageModel
4
- } from "@ai-sdk/openai-compatible";
5
2
  import {
6
3
  NoSuchModelError
7
4
  } from "@ai-sdk/provider";
@@ -10,10 +7,82 @@ import {
10
7
  withoutTrailingSlash,
11
8
  withUserAgentSuffix
12
9
  } from "@ai-sdk/provider-utils";
10
+
11
+ // src/cerebras-chat-language-model.ts
12
+ import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible";
13
+ function isStructuredOutputWithToolCallsFinishReason({
14
+ rawFinishReason,
15
+ hasText,
16
+ responseFormatType
17
+ }) {
18
+ return responseFormatType === "json" && rawFinishReason === "tool_calls" && hasText;
19
+ }
20
+ var CerebrasChatLanguageModel = class extends OpenAICompatibleChatLanguageModel {
21
+ async doGenerate(options) {
22
+ var _a;
23
+ const result = await super.doGenerate(options);
24
+ if (!isStructuredOutputWithToolCallsFinishReason({
25
+ rawFinishReason: result.finishReason.raw,
26
+ hasText: result.content.some(
27
+ (part) => part.type === "text" && part.text.length > 0
28
+ ),
29
+ responseFormatType: (_a = options.responseFormat) == null ? void 0 : _a.type
30
+ })) {
31
+ return result;
32
+ }
33
+ return {
34
+ ...result,
35
+ // Cerebras GLM can return valid structured output text while also
36
+ // repeating a tool call. Treat that mixed response as the final answer.
37
+ content: result.content.filter((part) => part.type !== "tool-call"),
38
+ finishReason: {
39
+ ...result.finishReason,
40
+ unified: "stop"
41
+ }
42
+ };
43
+ }
44
+ async doStream(options) {
45
+ const result = await super.doStream(options);
46
+ let hasText = false;
47
+ return {
48
+ ...result,
49
+ stream: result.stream.pipeThrough(
50
+ new TransformStream({
51
+ transform(part, controller) {
52
+ var _a, _b;
53
+ if (part.type === "text-delta" && part.delta.length > 0) {
54
+ hasText = true;
55
+ }
56
+ if (part.type === "finish" && isStructuredOutputWithToolCallsFinishReason({
57
+ rawFinishReason: part.finishReason.raw,
58
+ hasText,
59
+ responseFormatType: (_a = options.responseFormat) == null ? void 0 : _a.type
60
+ })) {
61
+ controller.enqueue({
62
+ ...part,
63
+ finishReason: {
64
+ ...part.finishReason,
65
+ unified: "stop"
66
+ }
67
+ });
68
+ return;
69
+ }
70
+ if (((_b = options.responseFormat) == null ? void 0 : _b.type) === "json" && hasText && (part.type === "tool-input-start" || part.type === "tool-input-delta" || part.type === "tool-input-end" || part.type === "tool-call")) {
71
+ return;
72
+ }
73
+ controller.enqueue(part);
74
+ }
75
+ })
76
+ )
77
+ };
78
+ }
79
+ };
80
+
81
+ // src/cerebras-provider.ts
13
82
  import { z } from "zod/v4";
14
83
 
15
84
  // src/version.ts
16
- var VERSION = true ? "2.0.51" : "0.0.0-test";
85
+ var VERSION = true ? "2.0.53" : "0.0.0-test";
17
86
 
18
87
  // src/cerebras-provider.ts
19
88
  var cerebrasErrorSchema = z.object({
@@ -26,6 +95,21 @@ var cerebrasErrorStructure = {
26
95
  errorSchema: cerebrasErrorSchema,
27
96
  errorToMessage: (data) => data.message
28
97
  };
98
+ function transformCerebrasRequestBody(args) {
99
+ return {
100
+ ...args,
101
+ messages: Array.isArray(args.messages) ? args.messages.map((message) => {
102
+ if (message == null || typeof message !== "object" || message.role !== "assistant" || !("reasoning_content" in message)) {
103
+ return message;
104
+ }
105
+ const { reasoning_content, ...rest } = message;
106
+ return {
107
+ ...rest,
108
+ ...!("reasoning" in rest) && reasoning_content !== void 0 ? { reasoning: reasoning_content } : {}
109
+ };
110
+ }) : args.messages
111
+ };
112
+ }
29
113
  function createCerebras(options = {}) {
30
114
  var _a;
31
115
  const baseURL = withoutTrailingSlash(
@@ -43,13 +127,14 @@ function createCerebras(options = {}) {
43
127
  `ai-sdk/cerebras/${VERSION}`
44
128
  );
45
129
  const createLanguageModel = (modelId) => {
46
- return new OpenAICompatibleChatLanguageModel(modelId, {
130
+ return new CerebrasChatLanguageModel(modelId, {
47
131
  provider: `cerebras.chat`,
48
132
  url: ({ path }) => `${baseURL}${path}`,
49
133
  headers: getHeaders,
50
134
  fetch: options.fetch,
51
135
  errorStructure: cerebrasErrorStructure,
52
- supportsStructuredOutputs: true
136
+ supportsStructuredOutputs: true,
137
+ transformRequestBody: transformCerebrasRequestBody
53
138
  });
54
139
  };
55
140
  const provider = (modelId) => createLanguageModel(modelId);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cerebras-provider.ts","../src/version.ts"],"sourcesContent":["import {\n OpenAICompatibleChatLanguageModel,\n type ProviderErrorStructure,\n} from '@ai-sdk/openai-compatible';\nimport {\n NoSuchModelError,\n type LanguageModelV3,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport type { CerebrasChatModelId } from './cerebras-chat-options';\nimport { z } from 'zod/v4';\nimport { VERSION } from './version';\n\n// Add error schema and structure\nconst cerebrasErrorSchema = z.object({\n message: z.string(),\n type: z.string(),\n param: z.string(),\n code: z.string(),\n});\n\nexport type CerebrasErrorData = z.infer<typeof cerebrasErrorSchema>;\n\nconst cerebrasErrorStructure: ProviderErrorStructure<CerebrasErrorData> = {\n errorSchema: cerebrasErrorSchema,\n errorToMessage: data => data.message,\n};\n\nexport interface CerebrasProviderSettings {\n /**\n * Cerebras API key.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface CerebrasProvider extends ProviderV3 {\n /**\n * Creates a Cerebras model for text generation.\n */\n (modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * Creates a Cerebras model for text generation.\n */\n languageModel(modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * Creates a Cerebras chat model for text generation.\n */\n chat(modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport function createCerebras(\n options: CerebrasProviderSettings = {},\n): CerebrasProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.cerebras.ai/v1',\n );\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'CEREBRAS_API_KEY',\n description: 'Cerebras API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/cerebras/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: CerebrasChatModelId) => {\n return new OpenAICompatibleChatLanguageModel(modelId, {\n provider: `cerebras.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n errorStructure: cerebrasErrorStructure,\n supportsStructuredOutputs: true,\n });\n };\n\n const provider = (modelId: CerebrasChatModelId) =>\n createLanguageModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const cerebras = createCerebras();\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,SAAS;;;ACdX,IAAM,UACX,OACI,WACA;;;ADeN,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,OAAO;AAAA,EAChB,MAAM,EAAE,OAAO;AACjB,CAAC;AAID,IAAM,yBAAoE;AAAA,EACxE,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK;AAC/B;AA4CO,SAAS,eACd,UAAoC,CAAC,GACnB;AA9EpB;AA+EE,QAAM,UAAU;AAAA,KACd,aAAQ,YAAR,YAAmB;AAAA,EACrB;AACA,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,eAAe,UAAU,WAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,mBAAmB,OAAO;AAAA,EAC5B;AAEF,QAAM,sBAAsB,CAAC,YAAiC;AAC5D,WAAO,IAAI,kCAAkC,SAAS;AAAA,MACpD,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,YAChB,oBAAoB,OAAO;AAE7B,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAEhB,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AACA,WAAS,qBAAqB,SAAS;AACvC,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEO,IAAM,WAAW,eAAe;","names":[]}
1
+ {"version":3,"sources":["../src/cerebras-provider.ts","../src/cerebras-chat-language-model.ts","../src/version.ts"],"sourcesContent":["import type { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport {\n NoSuchModelError,\n type LanguageModelV3,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { CerebrasChatLanguageModel } from './cerebras-chat-language-model';\nimport type { CerebrasChatModelId } from './cerebras-chat-options';\nimport { z } from 'zod/v4';\nimport { VERSION } from './version';\n\n// Add error schema and structure\nconst cerebrasErrorSchema = z.object({\n message: z.string(),\n type: z.string(),\n param: z.string(),\n code: z.string(),\n});\n\nexport type CerebrasErrorData = z.infer<typeof cerebrasErrorSchema>;\n\nconst cerebrasErrorStructure: ProviderErrorStructure<CerebrasErrorData> = {\n errorSchema: cerebrasErrorSchema,\n errorToMessage: data => data.message,\n};\n\n/**\n * Cerebras expects assistant reasoning history in the `reasoning` field, while\n * the shared OpenAI-compatible converter serializes it as `reasoning_content`.\n */\nfunction transformCerebrasRequestBody(\n args: Record<string, any>,\n): Record<string, any> {\n return {\n ...args,\n messages: Array.isArray(args.messages)\n ? args.messages.map(message => {\n if (\n message == null ||\n typeof message !== 'object' ||\n message.role !== 'assistant' ||\n !('reasoning_content' in message)\n ) {\n return message;\n }\n\n const { reasoning_content, ...rest } = message;\n\n return {\n ...rest,\n ...(!('reasoning' in rest) && reasoning_content !== undefined\n ? { reasoning: reasoning_content }\n : {}),\n };\n })\n : args.messages,\n };\n}\n\nexport interface CerebrasProviderSettings {\n /**\n * Cerebras API key.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface CerebrasProvider extends ProviderV3 {\n /**\n * Creates a Cerebras model for text generation.\n */\n (modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * Creates a Cerebras model for text generation.\n */\n languageModel(modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * Creates a Cerebras chat model for text generation.\n */\n chat(modelId: CerebrasChatModelId): LanguageModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport function createCerebras(\n options: CerebrasProviderSettings = {},\n): CerebrasProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.cerebras.ai/v1',\n );\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'CEREBRAS_API_KEY',\n description: 'Cerebras API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/cerebras/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: CerebrasChatModelId) => {\n return new CerebrasChatLanguageModel(modelId, {\n provider: `cerebras.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n errorStructure: cerebrasErrorStructure,\n supportsStructuredOutputs: true,\n transformRequestBody: transformCerebrasRequestBody,\n });\n };\n\n const provider = (modelId: CerebrasChatModelId) =>\n createLanguageModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const cerebras = createCerebras();\n","import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n} from '@ai-sdk/provider';\n\nfunction isStructuredOutputWithToolCallsFinishReason({\n rawFinishReason,\n hasText,\n responseFormatType,\n}: {\n rawFinishReason: string | undefined;\n hasText: boolean;\n responseFormatType:\n | NonNullable<LanguageModelV3CallOptions['responseFormat']>['type']\n | undefined;\n}) {\n return (\n responseFormatType === 'json' && rawFinishReason === 'tool_calls' && hasText\n );\n}\n\nexport class CerebrasChatLanguageModel extends OpenAICompatibleChatLanguageModel {\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const result = await super.doGenerate(options);\n\n if (\n !isStructuredOutputWithToolCallsFinishReason({\n rawFinishReason: result.finishReason.raw,\n hasText: result.content.some(\n part => part.type === 'text' && part.text.length > 0,\n ),\n responseFormatType: options.responseFormat?.type,\n })\n ) {\n return result;\n }\n\n return {\n ...result,\n // Cerebras GLM can return valid structured output text while also\n // repeating a tool call. Treat that mixed response as the final answer.\n content: result.content.filter(part => part.type !== 'tool-call'),\n finishReason: {\n ...result.finishReason,\n unified: 'stop',\n },\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const result = await super.doStream(options);\n let hasText = false;\n\n return {\n ...result,\n stream: result.stream.pipeThrough(\n new TransformStream<\n LanguageModelV3StreamPart,\n LanguageModelV3StreamPart\n >({\n transform(part, controller) {\n if (part.type === 'text-delta' && part.delta.length > 0) {\n hasText = true;\n }\n\n if (\n part.type === 'finish' &&\n isStructuredOutputWithToolCallsFinishReason({\n rawFinishReason: part.finishReason.raw,\n hasText,\n responseFormatType: options.responseFormat?.type,\n })\n ) {\n controller.enqueue({\n ...part,\n finishReason: {\n ...part.finishReason,\n unified: 'stop',\n },\n });\n return;\n }\n\n if (\n options.responseFormat?.type === 'json' &&\n hasText &&\n (part.type === 'tool-input-start' ||\n part.type === 'tool-input-delta' ||\n part.type === 'tool-input-end' ||\n part.type === 'tool-call')\n ) {\n return;\n }\n\n controller.enqueue(part);\n },\n }),\n ),\n };\n }\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/cerebras",
3
- "version": "2.0.51",
3
+ "version": "2.0.53",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -29,9 +29,9 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@ai-sdk/provider": "3.0.10",
32
+ "@ai-sdk/openai-compatible": "2.0.47",
33
33
  "@ai-sdk/provider-utils": "4.0.27",
34
- "@ai-sdk/openai-compatible": "2.0.47"
34
+ "@ai-sdk/provider": "3.0.10"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "20.17.24",
@@ -0,0 +1,3 @@
1
+ export type { CerebrasChatModelId } from './cerebras-chat-options';
2
+
3
+ export type CerebrasLanguageModelChatOptions = Record<string, never>;
@@ -0,0 +1,108 @@
1
+ import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';
2
+ import type {
3
+ LanguageModelV3CallOptions,
4
+ LanguageModelV3GenerateResult,
5
+ LanguageModelV3StreamPart,
6
+ LanguageModelV3StreamResult,
7
+ } from '@ai-sdk/provider';
8
+
9
+ function isStructuredOutputWithToolCallsFinishReason({
10
+ rawFinishReason,
11
+ hasText,
12
+ responseFormatType,
13
+ }: {
14
+ rawFinishReason: string | undefined;
15
+ hasText: boolean;
16
+ responseFormatType:
17
+ | NonNullable<LanguageModelV3CallOptions['responseFormat']>['type']
18
+ | undefined;
19
+ }) {
20
+ return (
21
+ responseFormatType === 'json' && rawFinishReason === 'tool_calls' && hasText
22
+ );
23
+ }
24
+
25
+ export class CerebrasChatLanguageModel extends OpenAICompatibleChatLanguageModel {
26
+ async doGenerate(
27
+ options: LanguageModelV3CallOptions,
28
+ ): Promise<LanguageModelV3GenerateResult> {
29
+ const result = await super.doGenerate(options);
30
+
31
+ if (
32
+ !isStructuredOutputWithToolCallsFinishReason({
33
+ rawFinishReason: result.finishReason.raw,
34
+ hasText: result.content.some(
35
+ part => part.type === 'text' && part.text.length > 0,
36
+ ),
37
+ responseFormatType: options.responseFormat?.type,
38
+ })
39
+ ) {
40
+ return result;
41
+ }
42
+
43
+ return {
44
+ ...result,
45
+ // Cerebras GLM can return valid structured output text while also
46
+ // repeating a tool call. Treat that mixed response as the final answer.
47
+ content: result.content.filter(part => part.type !== 'tool-call'),
48
+ finishReason: {
49
+ ...result.finishReason,
50
+ unified: 'stop',
51
+ },
52
+ };
53
+ }
54
+
55
+ async doStream(
56
+ options: LanguageModelV3CallOptions,
57
+ ): Promise<LanguageModelV3StreamResult> {
58
+ const result = await super.doStream(options);
59
+ let hasText = false;
60
+
61
+ return {
62
+ ...result,
63
+ stream: result.stream.pipeThrough(
64
+ new TransformStream<
65
+ LanguageModelV3StreamPart,
66
+ LanguageModelV3StreamPart
67
+ >({
68
+ transform(part, controller) {
69
+ if (part.type === 'text-delta' && part.delta.length > 0) {
70
+ hasText = true;
71
+ }
72
+
73
+ if (
74
+ part.type === 'finish' &&
75
+ isStructuredOutputWithToolCallsFinishReason({
76
+ rawFinishReason: part.finishReason.raw,
77
+ hasText,
78
+ responseFormatType: options.responseFormat?.type,
79
+ })
80
+ ) {
81
+ controller.enqueue({
82
+ ...part,
83
+ finishReason: {
84
+ ...part.finishReason,
85
+ unified: 'stop',
86
+ },
87
+ });
88
+ return;
89
+ }
90
+
91
+ if (
92
+ options.responseFormat?.type === 'json' &&
93
+ hasText &&
94
+ (part.type === 'tool-input-start' ||
95
+ part.type === 'tool-input-delta' ||
96
+ part.type === 'tool-input-end' ||
97
+ part.type === 'tool-call')
98
+ ) {
99
+ return;
100
+ }
101
+
102
+ controller.enqueue(part);
103
+ },
104
+ }),
105
+ ),
106
+ };
107
+ }
108
+ }
@@ -1,7 +1,4 @@
1
- import {
2
- OpenAICompatibleChatLanguageModel,
3
- type ProviderErrorStructure,
4
- } from '@ai-sdk/openai-compatible';
1
+ import type { ProviderErrorStructure } from '@ai-sdk/openai-compatible';
5
2
  import {
6
3
  NoSuchModelError,
7
4
  type LanguageModelV3,
@@ -13,6 +10,7 @@ import {
13
10
  withUserAgentSuffix,
14
11
  type FetchFunction,
15
12
  } from '@ai-sdk/provider-utils';
13
+ import { CerebrasChatLanguageModel } from './cerebras-chat-language-model';
16
14
  import type { CerebrasChatModelId } from './cerebras-chat-options';
17
15
  import { z } from 'zod/v4';
18
16
  import { VERSION } from './version';
@@ -32,6 +30,39 @@ const cerebrasErrorStructure: ProviderErrorStructure<CerebrasErrorData> = {
32
30
  errorToMessage: data => data.message,
33
31
  };
34
32
 
33
+ /**
34
+ * Cerebras expects assistant reasoning history in the `reasoning` field, while
35
+ * the shared OpenAI-compatible converter serializes it as `reasoning_content`.
36
+ */
37
+ function transformCerebrasRequestBody(
38
+ args: Record<string, any>,
39
+ ): Record<string, any> {
40
+ return {
41
+ ...args,
42
+ messages: Array.isArray(args.messages)
43
+ ? args.messages.map(message => {
44
+ if (
45
+ message == null ||
46
+ typeof message !== 'object' ||
47
+ message.role !== 'assistant' ||
48
+ !('reasoning_content' in message)
49
+ ) {
50
+ return message;
51
+ }
52
+
53
+ const { reasoning_content, ...rest } = message;
54
+
55
+ return {
56
+ ...rest,
57
+ ...(!('reasoning' in rest) && reasoning_content !== undefined
58
+ ? { reasoning: reasoning_content }
59
+ : {}),
60
+ };
61
+ })
62
+ : args.messages,
63
+ };
64
+ }
65
+
35
66
  export interface CerebrasProviderSettings {
36
67
  /**
37
68
  * Cerebras API key.
@@ -94,13 +125,14 @@ export function createCerebras(
94
125
  );
95
126
 
96
127
  const createLanguageModel = (modelId: CerebrasChatModelId) => {
97
- return new OpenAICompatibleChatLanguageModel(modelId, {
128
+ return new CerebrasChatLanguageModel(modelId, {
98
129
  provider: `cerebras.chat`,
99
130
  url: ({ path }) => `${baseURL}${path}`,
100
131
  headers: getHeaders,
101
132
  fetch: options.fetch,
102
133
  errorStructure: cerebrasErrorStructure,
103
134
  supportsStructuredOutputs: true,
135
+ transformRequestBody: transformCerebrasRequestBody,
104
136
  });
105
137
  };
106
138
 
@@ -0,0 +1,47 @@
1
+ {
2
+ "id": "chatcmpl-d89ba80c-26b3-442c-ac3c-d7e94a99c484",
3
+ "choices": [
4
+ {
5
+ "finish_reason": "tool_calls",
6
+ "index": 0,
7
+ "message": {
8
+ "reasoning": "The user is asking about a \"magic number\". I see that I have access to a function called \"nonUsefulTool\" which \"returns a magic number\". This seems like exactly what the user is asking for. Let me call this function to get the magic number for them.",
9
+ "tool_calls": [
10
+ {
11
+ "function": {
12
+ "name": "nonUsefulTool",
13
+ "arguments": "{}"
14
+ },
15
+ "type": "function",
16
+ "id": "85e4fd267"
17
+ }
18
+ ],
19
+ "role": "assistant"
20
+ }
21
+ }
22
+ ],
23
+ "created": 1779146781,
24
+ "model": "zai-glm-4.7",
25
+ "system_fingerprint": "fp_a33c042689e969567008",
26
+ "object": "chat.completion",
27
+ "usage": {
28
+ "total_tokens": 387,
29
+ "completion_tokens": 65,
30
+ "completion_tokens_details": {
31
+ "accepted_prediction_tokens": 0,
32
+ "rejected_prediction_tokens": 0,
33
+ "reasoning_tokens": 58
34
+ },
35
+ "prompt_tokens": 322,
36
+ "prompt_tokens_details": {
37
+ "cached_tokens": 256
38
+ }
39
+ },
40
+ "time_info": {
41
+ "created": 1779146781.786984,
42
+ "queue_time": 0.002922005,
43
+ "prompt_time": 0.010518105,
44
+ "completion_time": 0.118095092,
45
+ "total_time": 0.13299274444580078
46
+ }
47
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "id": "chatcmpl-a6f2645e-5553-4ede-acde-612e0035b1cc",
3
+ "choices": [
4
+ {
5
+ "finish_reason": "tool_calls",
6
+ "index": 0,
7
+ "message": {
8
+ "content": "{\"result\":\"2026\"}",
9
+ "reasoning": "The function returned 2026 as the magic number. Now I need to return this as a JSON object matching the specified schema. The schema requires a \"result\" property of type string. So I should wrap the magic number in a string.",
10
+ "tool_calls": [
11
+ {
12
+ "function": {
13
+ "name": "nonUsefulTool",
14
+ "arguments": "{}"
15
+ },
16
+ "type": "function",
17
+ "id": "0babb4517"
18
+ }
19
+ ],
20
+ "role": "assistant"
21
+ }
22
+ }
23
+ ],
24
+ "created": 1779146782,
25
+ "model": "zai-glm-4.7",
26
+ "system_fingerprint": "fp_a33c042689e969567008",
27
+ "object": "chat.completion",
28
+ "usage": {
29
+ "total_tokens": 457,
30
+ "completion_tokens": 63,
31
+ "completion_tokens_details": {
32
+ "accepted_prediction_tokens": 0,
33
+ "rejected_prediction_tokens": 0,
34
+ "reasoning_tokens": 50
35
+ },
36
+ "prompt_tokens": 394,
37
+ "prompt_tokens_details": {
38
+ "cached_tokens": 256
39
+ }
40
+ },
41
+ "time_info": {
42
+ "created": 1779146782.19271,
43
+ "queue_time": 0.002844976,
44
+ "prompt_time": 0.012194163,
45
+ "completion_time": 0.115990643,
46
+ "total_time": 0.13260841369628906
47
+ }
48
+ }
@@ -0,0 +1,97 @@
1
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"role":"assistant"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
2
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"The"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
3
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" user is asking about a \""},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
4
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"magic number\". I"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
5
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" have"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
6
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" access"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
7
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" to"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
8
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" a function called"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
9
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" \"non"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
10
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"UsefulTool\" that \""},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
11
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"returns a"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
12
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" magic number\". Let me"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
13
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" call this"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
14
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" function to get"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
15
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" the"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
16
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" magic number for the"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
17
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" user.\n\n"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
18
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"Looking at"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
19
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" the function schema:\n"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
20
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"-"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
21
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" Function name"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
22
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":": \""},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
23
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"non"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
24
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"UsefulTool\"\n- Parameters: empty object"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
25
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" ("},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
26
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"no parameters"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
27
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" required)\n"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
28
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"- Description:"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
29
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" \"A non-useful tool that returns a magic number\"\n\nI"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
30
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" should"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
31
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" call"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
32
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":" this function to get the magic number"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
33
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"reasoning":"."},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
34
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{"tool_calls":[{"function":{"name":"nonUsefulTool","arguments":"{}"},"type":"function","id":"bbd2b9d98","index":0}]},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
35
+ {"id":"chatcmpl-9e97f9ca-9626-4ef8-8543-6e3ee7cef659","choices":[{"delta":{},"finish_reason":"tool_calls","index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk","usage":{"total_tokens":426,"completion_tokens":104,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":97},"prompt_tokens":322,"prompt_tokens_details":{"cached_tokens":256}},"time_info":{"created":1779147581.1957242,"queue_time":0.00306479,"prompt_time":0.01150595,"completion_time":0.16727912,"total_time":0.1844015121459961}}
36
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"role":"assistant"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
37
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"The"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
38
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" nonUsefulTool returned the"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
39
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" number"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
40
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" "},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
41
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"2026"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
42
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" as the"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
43
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" \""},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
44
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"magic number\"."},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
45
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" Now I need"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
46
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" to provide this"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
47
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" result in"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
48
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" the specified JSON"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
49
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" format according"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
50
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" to the"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
51
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" schema provided.\n\n"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
52
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"The schema"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
53
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" requires:\n-"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
54
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" A"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
55
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" JSON object"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
56
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" with a \"result\" property of type"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
57
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" string\n"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
58
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"- The \"result"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
59
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"\" property is required"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
60
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"\n"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
61
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"- No"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
62
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" additional"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
63
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" properties are allowed"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
64
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"\n\nSo I need"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
65
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" to"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
66
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" return"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
67
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":":\n```"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
68
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"json\n{\"result\":"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
69
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" \"2026"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
70
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"\"}\n```\n\nNote"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
71
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" that the"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
72
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" result should"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
73
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" be"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
74
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" a"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
75
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" string"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
76
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" according"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
77
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" to"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
78
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" the"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
79
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" schema"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
80
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":","},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
81
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" even"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
82
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" though"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
83
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" it"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
84
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"'s"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
85
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" a"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
86
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":" number"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
87
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"reasoning":"."},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
88
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
89
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"content":"{\""},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
90
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"content":"result"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
91
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"content":"\":"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
92
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"content":" \""},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
93
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"content":"202"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
94
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"content":"6"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
95
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"content":"\"}"},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
96
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{"tool_calls":[{"function":{"name":"nonUsefulTool","arguments":"{}"},"type":"function","id":"e0ecf32e0","index":0}]},"index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk"}
97
+ {"id":"chatcmpl-f4bd7eab-cdbc-418d-896a-ea0b8d5e44ce","choices":[{"delta":{},"finish_reason":"tool_calls","index":0}],"created":1779147581,"model":"zai-glm-4.7","system_fingerprint":"fp_a33c042689e969567008","object":"chat.completion.chunk","usage":{"total_tokens":555,"completion_tokens":122,"completion_tokens_details":{"accepted_prediction_tokens":0,"rejected_prediction_tokens":0,"reasoning_tokens":108},"prompt_tokens":433,"prompt_tokens_details":{"cached_tokens":256}},"time_info":{"created":1779147581.570175,"queue_time":0.003384742,"prompt_time":0.012728517,"completion_time":0.220198588,"total_time":0.34409451484680176}}