@docyrus/docyrus 0.0.32 → 0.0.33

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/agent-loader.js CHANGED
@@ -1336,7 +1336,7 @@ function createCustomOpenAiProviderConfig(params) {
1336
1336
  function createAzureProviderConfig(params) {
1337
1337
  const providerConfig = {
1338
1338
  baseUrl: params.baseUrl,
1339
- apiKey: "env:AZURE_OPENAI_API_KEY"
1339
+ apiKey: "AZURE_OPENAI_API_KEY"
1340
1340
  };
1341
1341
  if (params.useCustomModel) {
1342
1342
  providerConfig.api = "azure-openai-responses";
@@ -1365,6 +1365,22 @@ function trimOrUndefined(value) {
1365
1365
  const trimmed = value?.trim();
1366
1366
  return trimmed && trimmed.length > 0 ? trimmed : void 0;
1367
1367
  }
1368
+ function normalizeAzureBaseUrl(baseUrl) {
1369
+ const trimmed = baseUrl.trim().replace(/\/+$/, "");
1370
+ try {
1371
+ const url = new URL(trimmed);
1372
+ url.search = "";
1373
+ url.hash = "";
1374
+ if (url.pathname.endsWith("/openai/v1")) {
1375
+ url.pathname = url.pathname.slice(0, -3);
1376
+ } else if (url.pathname.endsWith("/openai/responses")) {
1377
+ url.pathname = url.pathname.slice(0, -10);
1378
+ }
1379
+ return url.toString().replace(/\/+$/, "");
1380
+ } catch {
1381
+ return trimmed.replace(/\/openai\/v1$/i, "/openai").replace(/\/openai\/responses$/i, "/openai");
1382
+ }
1383
+ }
1368
1384
  async function saveGenericApiKey(params) {
1369
1385
  params.authStorage.set(params.providerId, {
1370
1386
  type: "api_key",
@@ -1391,6 +1407,7 @@ async function saveCustomOpenAiConfig(params) {
1391
1407
  async function saveAzureConfig(params) {
1392
1408
  const modelId = params.modelId.trim();
1393
1409
  const useCustomModel = params.useCustomModel ?? false;
1410
+ const normalizedBaseUrl = normalizeAzureBaseUrl(params.baseUrl);
1394
1411
  params.authStorage.set("azure-openai-responses", {
1395
1412
  type: "api_key",
1396
1413
  key: params.apiKey.trim()
@@ -1415,7 +1432,7 @@ async function saveAzureConfig(params) {
1415
1432
  }
1416
1433
  await params.envStore.setMany(envValues);
1417
1434
  await upsertModelsProvider(params.modelsJsonPath, "azure-openai-responses", createAzureProviderConfig({
1418
- baseUrl: params.baseUrl.trim(),
1435
+ baseUrl: normalizedBaseUrl,
1419
1436
  modelId,
1420
1437
  useCustomModel
1421
1438
  }));
@@ -1679,7 +1696,7 @@ function getProviderFormFields(params) {
1679
1696
  title: "Azure OpenAI base URL",
1680
1697
  required: true,
1681
1698
  component: "text",
1682
- placeholder: "https://my-resource.openai.azure.com/openai/v1",
1699
+ placeholder: "https://my-resource.openai.azure.com/openai",
1683
1700
  dependsOn: { field: "configMode", equals: "base-url" }
1684
1701
  },
1685
1702
  {
@@ -1708,8 +1725,8 @@ function getProviderFormFields(params) {
1708
1725
  name: "apiVersion",
1709
1726
  title: "API version",
1710
1727
  component: "text",
1711
- defaultValue: "2025-03-01-preview",
1712
- placeholder: "2025-03-01-preview"
1728
+ defaultValue: "2025-04-01-preview",
1729
+ placeholder: "2025-04-01-preview"
1713
1730
  }
1714
1731
  ];
1715
1732
  case "amazon-bedrock":
@@ -1783,9 +1800,14 @@ function getProviderFormFields(params) {
1783
1800
  }
1784
1801
  }
1785
1802
  async function refreshSessionAfterCredentialChange(params) {
1803
+ await params.envStore?.hydrateProcessEnv(process.env);
1786
1804
  params.modelRegistry.refresh();
1787
1805
  const availableModels = params.modelRegistry.getAvailable();
1788
1806
  const preferredModel = params.preferredProviderId && params.preferredModelId ? availableModels.find((model) => model.provider === params.preferredProviderId && model.id === params.preferredModelId) : params.preferredProviderId ? availableModels.find((model) => model.provider === params.preferredProviderId) : void 0;
1807
+ if (preferredModel) {
1808
+ await params.session.setModel(preferredModel);
1809
+ return;
1810
+ }
1789
1811
  const currentModel = params.session.model;
1790
1812
  const currentModelStillAvailable = currentModel ? availableModels.some((model) => model.provider === currentModel.provider && model.id === currentModel.id) : false;
1791
1813
  if (currentModel && !currentModelStillAvailable) {
@@ -1874,11 +1896,12 @@ async function showInput(mode, title, placeholder) {
1874
1896
  });
1875
1897
  });
1876
1898
  }
1877
- async function refreshAfterCredentialChange(mode, preferredProviderId, preferredModelId) {
1899
+ async function refreshAfterCredentialChange(mode, envStore, preferredProviderId, preferredModelId) {
1878
1900
  const modeAny = modeAsAny(mode);
1879
1901
  await refreshSessionAfterCredentialChange({
1880
1902
  session: modeAny.session,
1881
1903
  modelRegistry: modeAny.session.modelRegistry,
1904
+ envStore,
1882
1905
  preferredProviderId,
1883
1906
  preferredModelId
1884
1907
  });
@@ -1916,7 +1939,7 @@ async function runApiKeyProviderFlow(mode, dependencies, provider) {
1916
1939
  apiKey,
1917
1940
  modelId
1918
1941
  });
1919
- await refreshAfterCredentialChange(mode, "custom-openai", modelId);
1942
+ await refreshAfterCredentialChange(mode, dependencies.envStore, "custom-openai", modelId);
1920
1943
  modeAny.showStatus(`Configured ${provider.label}`);
1921
1944
  return;
1922
1945
  }
@@ -1949,7 +1972,7 @@ async function runApiKeyProviderFlow(mode, dependencies, provider) {
1949
1972
  } else {
1950
1973
  const resourceName = await showInput(mode, resourceNameField?.title || "Azure resource name", resourceNameField?.placeholder);
1951
1974
  if (resourceName) {
1952
- baseUrl = `https://${resourceName}.openai.azure.com/openai/v1`;
1975
+ baseUrl = `https://${resourceName}.openai.azure.com/openai`;
1953
1976
  }
1954
1977
  }
1955
1978
  if (!baseUrl) {
@@ -1974,7 +1997,7 @@ async function runApiKeyProviderFlow(mode, dependencies, provider) {
1974
1997
  apiVersion,
1975
1998
  useCustomModel: !builtInModelIds.has(modelId)
1976
1999
  });
1977
- await refreshAfterCredentialChange(mode, "azure-openai-responses", modelId);
2000
+ await refreshAfterCredentialChange(mode, dependencies.envStore, "azure-openai-responses", modelId);
1978
2001
  modeAny.showStatus(`Configured ${provider.label}`);
1979
2002
  return;
1980
2003
  }
@@ -2037,7 +2060,7 @@ async function runApiKeyProviderFlow(mode, dependencies, provider) {
2037
2060
  secretAccessKey,
2038
2061
  sessionToken
2039
2062
  });
2040
- await refreshAfterCredentialChange(mode, "amazon-bedrock", modelId);
2063
+ await refreshAfterCredentialChange(mode, dependencies.envStore, "amazon-bedrock", modelId);
2041
2064
  modeAny.showStatus(`Configured ${provider.label}`);
2042
2065
  return;
2043
2066
  }
@@ -2052,7 +2075,7 @@ async function runApiKeyProviderFlow(mode, dependencies, provider) {
2052
2075
  providerId: provider.id,
2053
2076
  apiKey
2054
2077
  });
2055
- await refreshAfterCredentialChange(mode, provider.id);
2078
+ await refreshAfterCredentialChange(mode, dependencies.envStore, provider.id);
2056
2079
  modeAny.showStatus(`Configured ${provider.label}`);
2057
2080
  }
2058
2081
  }
@@ -2111,7 +2134,7 @@ async function handleInteractiveLogout(mode, dependencies) {
2111
2134
  ...dependencies,
2112
2135
  providerId
2113
2136
  });
2114
- await refreshAfterCredentialChange(mode);
2137
+ await refreshAfterCredentialChange(mode, dependencies.envStore);
2115
2138
  modeAny.showStatus(`Removed ${getProviderLabel(providerId)}`);
2116
2139
  } catch (error) {
2117
2140
  modeAny.showError(`Failed to remove ${getProviderLabel(providerId)}: ${error instanceof Error ? error.message : String(error)}`);
@@ -2327,7 +2350,7 @@ async function runAzureFlow(clack, pico, dependencies) {
2327
2350
  if (configMode === "base-url") {
2328
2351
  const baseUrlInput = await clack.text({
2329
2352
  message: "Azure OpenAI base URL:",
2330
- placeholder: "https://my-resource.openai.azure.com/openai/v1",
2353
+ placeholder: "https://my-resource.openai.azure.com/openai",
2331
2354
  validate: (value) => value?.trim() ? void 0 : "Base URL is required"
2332
2355
  });
2333
2356
  if (clack.isCancel(baseUrlInput) || !baseUrlInput) {
@@ -2343,7 +2366,7 @@ async function runAzureFlow(clack, pico, dependencies) {
2343
2366
  if (clack.isCancel(resourceName) || !resourceName) {
2344
2367
  return false;
2345
2368
  }
2346
- baseUrl = `https://${String(resourceName).trim()}.openai.azure.com/openai/v1`;
2369
+ baseUrl = `https://${String(resourceName).trim()}.openai.azure.com/openai`;
2347
2370
  }
2348
2371
  const modelId = await clack.text({
2349
2372
  message: "Model ID to use:",
@@ -2362,7 +2385,7 @@ async function runAzureFlow(clack, pico, dependencies) {
2362
2385
  }
2363
2386
  const apiVersion = await clack.text({
2364
2387
  message: `API version ${pico.dim("(leave blank to use pi's default)")}:`,
2365
- placeholder: "2025-03-01-preview"
2388
+ placeholder: "2025-04-01-preview"
2366
2389
  });
2367
2390
  if (clack.isCancel(apiVersion)) {
2368
2391
  return false;