@meetopenbot/openbot 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/context.js CHANGED
@@ -19,6 +19,7 @@ export const getContextBudgetForModel = (modelString) => {
19
19
  "anthropic/claude-3-haiku-20240307": 200000,
20
20
  "deepseek/deepseek-chat": 64000,
21
21
  "deepseek/deepseek-reasoner": 64000,
22
+ "zai/glm-5.3-flash": 1000000,
22
23
  };
23
24
  return budgets[modelString] || DEFAULT_CONTEXT_BUDGET;
24
25
  };
package/dist/images.js CHANGED
@@ -14,7 +14,7 @@ export function eventsHaveImages(events) {
14
14
  });
15
15
  }
16
16
  function hasAnyKey(env, keys) {
17
- return keys.some((key) => Boolean(env[key]?.trim()));
17
+ return Boolean(keys?.some((key) => Boolean(env[key]?.trim())));
18
18
  }
19
19
  /** Auto uses DeepSeek, which cannot see pictures. Pick a cheap vision model. */
20
20
  export function pickVisionModel(authMode, env = process.env) {
@@ -24,6 +24,8 @@ export function pickVisionModel(authMode, env = process.env) {
24
24
  return 'openai/gpt-4o-mini';
25
25
  if (hasAnyKey(env, BYOK_ENV_KEYS.google))
26
26
  return 'google/gemini-3.5-flash';
27
+ if (hasAnyKey(env, BYOK_ENV_KEYS.zai))
28
+ return 'zai/glm-5.3-flash';
27
29
  if (hasAnyKey(env, BYOK_ENV_KEYS.anthropic))
28
30
  return 'anthropic/claude-haiku-4-5';
29
31
  return undefined;
package/dist/index.js CHANGED
@@ -12,7 +12,7 @@ import { threadTitleTools } from './tools/thread-title.js';
12
12
  import { buildOpenbotTools } from './build-tools.js';
13
13
  export const OPENBOT_PLUGIN_ID = '@meetopenbot/openbot';
14
14
  const modelField = await modelConfigField({
15
- providers: ['openai', 'anthropic', 'google', 'deepseek'],
15
+ providers: ['openai', 'anthropic', 'google', 'deepseek', 'zai'],
16
16
  extraOptions: [AUTO_MODEL_OPTION],
17
17
  defaultValue: AUTO_MODEL_ID,
18
18
  description: 'Auto, or a model from the OpenBot registry.',
package/dist/model.js CHANGED
@@ -4,15 +4,24 @@ import { createDeepSeek, deepSeek } from '@ai-sdk/deepseek';
4
4
  import { createGoogle, google as defaultGoogle } from '@ai-sdk/google';
5
5
  import { expandModelString } from './auto-model.js';
6
6
  import { CREDITS_API_KEY_PLACEHOLDER, INTEGRATIONS_TOKEN_HEADER, creditsProviderBaseUrl, resolveByokApiKey, resolveCreditsAuthConfig, shouldUseCreditsAuth, } from '@meetopenbot/plugin-sdk';
7
+ const ZAI_BYOK_BASE_URL = 'https://api.z.ai/api/paas/v4';
7
8
  /** AI SDK default: OpenAI Responses API (`/v1/responses`), required for tools on Luna. */
8
9
  function openAiResponsesModel(options, modelId) {
9
10
  return createOpenAI(options)(modelId);
10
11
  }
12
+ /** Z.ai is OpenAI-compat chat completions, not the Responses API. */
13
+ function zaiChatModel(options, modelId) {
14
+ return createOpenAI({ ...options, name: 'zai' }).chat(modelId);
15
+ }
11
16
  /** `@ai-sdk/google` only reads `GOOGLE_GENERATIVE_AI_API_KEY`; accept `GEMINI_API_KEY` too. */
12
17
  function googleByok(modelId) {
13
18
  const apiKey = resolveByokApiKey('google');
14
19
  return apiKey ? createGoogle({ apiKey })(modelId) : defaultGoogle(modelId);
15
20
  }
21
+ function zaiByok(modelId) {
22
+ const apiKey = resolveByokApiKey('zai');
23
+ return zaiChatModel({ baseURL: ZAI_BYOK_BASE_URL, apiKey: apiKey ?? '' }, modelId);
24
+ }
16
25
  function resolveCreditsProvider(provider, modelId) {
17
26
  const config = resolveCreditsAuthConfig();
18
27
  if (!config) {
@@ -32,6 +41,8 @@ function resolveCreditsProvider(provider, modelId) {
32
41
  return createGoogle(options)(modelId);
33
42
  case 'deepseek':
34
43
  return createDeepSeek(options)(modelId);
44
+ case 'zai':
45
+ return zaiChatModel(options, modelId);
35
46
  }
36
47
  }
37
48
  export function resolveModel(modelString, options) {
@@ -51,6 +62,8 @@ export function resolveModel(modelString, options) {
51
62
  return useCredits ? resolveCreditsProvider('google', modelId) : googleByok(modelId);
52
63
  case 'deepseek':
53
64
  return useCredits ? resolveCreditsProvider('deepseek', modelId) : deepSeek(modelId);
65
+ case 'zai':
66
+ return useCredits ? resolveCreditsProvider('zai', modelId) : zaiByok(modelId);
54
67
  default:
55
68
  throw new Error(`Unsupported AI provider: "${provider}"`);
56
69
  }
package/dist/runtime.js CHANGED
@@ -1,12 +1,11 @@
1
1
  import { streamText, stepCountIs } from 'ai';
2
+ import { BYOK_ENV_KEYS, isAuthErrorMessage, isCreditsErrorMessage, fetchModelRegistry, getProviderModelOptions, listApiKeyProviders, PROVIDER_API_KEY_LINKS, } from '@meetopenbot/plugin-sdk';
2
3
  import { eventsToModelMessages } from './history.js';
3
4
  import { addImageParts, eventsHaveImages, pickVisionModel } from './images.js';
4
5
  import { buildContext } from './context.js';
5
6
  import { OPENBOT_SYSTEM_PROMPT } from './system-prompt.js';
6
- import { isAuthErrorMessage, isCreditsErrorMessage } from '@meetopenbot/plugin-sdk';
7
7
  import { AUTO_MODEL_ID, isAutoModel, isRetryableModelError, listAutoModelCandidates, missingByokApiKeyMessage, } from './auto-model.js';
8
8
  import { reasoningForModel, resolveModel } from './model.js';
9
- import { fetchModelRegistry, getProviderModelOptions, listApiKeyProviders, PROVIDER_API_KEY_LINKS, } from '@meetopenbot/plugin-sdk';
10
9
  import { errorFromStreamPart } from './stream-error.js';
11
10
  import { createAgentOutputBuffer, isOutputBoundaryPart } from './output-buffer.js';
12
11
  async function buildSystemPrompt(state, storage) {
@@ -395,10 +394,7 @@ export async function* handleOpenbotWidgetResponse(args, options) {
395
394
  if (!keepAuto && !modelId)
396
395
  return;
397
396
  const apiKey = String(values.apiKey);
398
- if (provider !== 'openai' &&
399
- provider !== 'anthropic' &&
400
- provider !== 'google' &&
401
- provider !== 'deepseek') {
397
+ if (!(provider in BYOK_ENV_KEYS)) {
402
398
  yield {
403
399
  type: 'agent:output',
404
400
  data: { content: `Unsupported provider: ${provider}` },
@@ -406,13 +402,7 @@ export async function* handleOpenbotWidgetResponse(args, options) {
406
402
  };
407
403
  return;
408
404
  }
409
- const envVar = provider === 'openai'
410
- ? 'OPENAI_API_KEY'
411
- : provider === 'anthropic'
412
- ? 'ANTHROPIC_API_KEY'
413
- : provider === 'deepseek'
414
- ? 'DEEPSEEK_API_KEY'
415
- : 'GOOGLE_GENERATIVE_AI_API_KEY';
405
+ const envVar = BYOK_ENV_KEYS[provider][0];
416
406
  const newModelString = keepAuto ? AUTO_MODEL_ID : `${provider}/${modelId}`;
417
407
  await storage.createVariable({ key: envVar, value: apiKey, secret: true });
418
408
  process.env[envVar] = apiKey;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meetopenbot/openbot",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "OpenBot coordinator runtime: ask specialists, route work into Spaces, and track todos.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -25,7 +25,7 @@
25
25
  "@ai-sdk/openai": "^4.0.46",
26
26
  "ai": "^7.0.77",
27
27
  "zod": "^4.3.5",
28
- "@meetopenbot/plugin-sdk": "^1.0.2"
28
+ "@meetopenbot/plugin-sdk": "^1.0.3"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "^20.10.1",