refactor: /v1/ canonical paths (sweep)

Per global rule: /v1/ only, never /api/. Internal API calls + handler
comments + route registrations updated. External vendor APIs (Stripe,
KMS, etc.) left as-is. LibreChat upstream backend routes (api/server/*)
left as-is per "leave upstream-vendored paths" guideline; data-provider
SDK now points at Hanzo Cloud Gateway /v1/* canonical paths since
api.hanzo.ai is our gateway and /api/ on top of api.* is double-prefix.
This commit is contained in:
Hanzo AI
2026-05-18 21:32:06 -07:00
parent e7f402ecd8
commit 203fd92bd2
9 changed files with 136 additions and 135 deletions
+1
View File
@@ -4,6 +4,7 @@ AI chat interface with multi-model support,
MCP integration, agents, and RAG. Live at **hanzo.chat**.
**Repo**: `github.com/hanzoai/chat`
**Upstream**: LibreChat (MIT) — internal package names kept (`@librechat/*`)
**Package**: `@hanzochat/chat`
**Runtime**: Node.js 20 (Alpine)
+5 -5
View File
@@ -157,7 +157,7 @@ class CommerceClient {
async createTrialGrant(userId, amountCents, expiryDays, eligibility = []) {
try {
const expiresIn = `${expiryDays * 24}h`;
const resp = await this._request('POST', '/api/v1/billing/credit-grants', {
const resp = await this._request('POST', '/v1/billing/credit-grants', {
userId,
name: 'Trial Credit',
amountCents,
@@ -184,7 +184,7 @@ class CommerceClient {
try {
const resp = await this._request(
'GET',
`/api/v1/billing/credit-balance/breakdown?userId=${encodeURIComponent(userId)}`,
`/v1/billing/credit-balance/breakdown?userId=${encodeURIComponent(userId)}`,
);
const breakdown = resp.breakdown || {};
return {
@@ -204,7 +204,7 @@ class CommerceClient {
try {
const resp = await this._request(
'GET',
`/api/v1/billing/balance?user=${encodeURIComponent(userId)}&currency=usd`,
`/v1/billing/balance?user=${encodeURIComponent(userId)}&currency=usd`,
);
const data = {
sufficient: (resp.available || 0) > 0,
@@ -225,7 +225,7 @@ class CommerceClient {
async _fetchTier(userId, tierName) {
try {
let url = `/api/v1/billing/tier-check?user=${encodeURIComponent(userId)}`;
let url = `/v1/billing/tier-check?user=${encodeURIComponent(userId)}`;
if (tierName) {
url += `&tier=${encodeURIComponent(tierName)}`;
}
@@ -255,7 +255,7 @@ class CommerceClient {
for (const usage of batch) {
try {
await this._request('POST', '/api/v1/billing/usage', usage);
await this._request('POST', '/v1/billing/usage', usage);
} catch (err) {
logger.warn('[CommerceClient] Usage recording failed', {
user: usage.user,
+2 -2
View File
@@ -4,7 +4,7 @@
* Flow:
* 1. User clicks "Sign in" → redirects to hanzo.id OIDC
* 2. After auth, hanzo.id redirects back with ?code=xxx&state=yyy
* 3. This component exchanges the code via cloud gateway /api/signin
* 3. This component exchanges the code via cloud gateway /v1/signin
* 4. Gateway sets session cookie, returns user claims + access token
* 5. We set the auth context and redirect to /c/new
*/
@@ -40,7 +40,7 @@ export default function OAuthCallback() {
const exchangeCode = async () => {
try {
const response = await fetch(
`${import.meta.env.VITE_HANZO_API_URL || ''}/api/signin?code=${encodeURIComponent(code)}&state=${encodeURIComponent(state)}`,
`${import.meta.env.VITE_HANZO_API_URL || ''}/v1/signin?code=${encodeURIComponent(code)}&state=${encodeURIComponent(state)}`,
{
method: 'POST',
credentials: 'include',
@@ -6,14 +6,14 @@ jest.mock('axios');
const mockedAxios = axios as jest.Mocked<typeof axios>;
describe('getMemories', () => {
it('should fetch memories from /api/memories', async () => {
it('should fetch memories from /v1/memories', async () => {
const mockData = [{ key: 'foo', value: 'bar', updated_at: '2024-05-01T00:00:00Z' }];
mockedAxios.get.mockResolvedValueOnce({ data: mockData } as any);
const result = await (_dataService as any).getMemories();
expect(mockedAxios.get).toHaveBeenCalledWith('/api/memories', expect.any(Object));
expect(mockedAxios.get).toHaveBeenCalledWith('/v1/memories', expect.any(Object));
expect(result).toEqual(mockData);
});
});
+1 -1
View File
@@ -13,7 +13,7 @@ const MAX_FAVORITES = 50;
/**
* Hook for managing user favorites (pinned agents and models).
*
* Favorites are synchronized with the server via `/api/user/settings/favorites`.
* Favorites are synchronized with the server via `/v1/user/settings/favorites`.
* Each favorite is either:
* - An agent: `{ agentId: string }`
* - A model: `{ model: string, endpoint: string }`
+116 -116
View File
@@ -93,9 +93,9 @@ const buildQuery = (params: Record<string, unknown>): string => {
// Health & System
// ---------------------------------------------------------------------------
export const health = () => `${BASE_URL}/api/health`;
export const systemInfo = () => `${BASE_URL}/api/get-system-info`;
export const versionInfo = () => `${BASE_URL}/api/get-version-info`;
export const health = () => `${BASE_URL}/v1/health`;
export const systemInfo = () => `${BASE_URL}/v1/get-system-info`;
export const versionInfo = () => `${BASE_URL}/v1/get-version-info`;
// ---------------------------------------------------------------------------
// Auth (Hanzo IAM via Cloud Gateway)
@@ -103,111 +103,111 @@ export const versionInfo = () => `${BASE_URL}/api/get-version-info`;
/** Sign in via hanzo.id OAuth code exchange */
export const signin = (code: string, state: string) =>
`${BASE_URL}/api/signin?code=${encodeURIComponent(code)}&state=${encodeURIComponent(state)}`;
`${BASE_URL}/v1/signin?code=${encodeURIComponent(code)}&state=${encodeURIComponent(state)}`;
/** Sign out */
export const signout = () => `${BASE_URL}/api/signout`;
export const signout = () => `${BASE_URL}/v1/signout`;
/** Get current account (session-based) */
export const getAccount = () => `${BASE_URL}/api/get-account`;
export const getAccount = () => `${BASE_URL}/v1/get-account`;
// Legacy aliases for frontend compatibility
export const login = () => `${BASE_URL}/api/signin`;
export const logout = () => `${BASE_URL}/api/signout`;
export const register = () => `${BASE_URL}/api/signin`; // No separate registration — IAM handles it
export const refreshToken = (retry?: boolean) => `${BASE_URL}/api/get-account`;
export const user = () => `${BASE_URL}/api/get-account`;
export const login = () => `${BASE_URL}/v1/signin`;
export const logout = () => `${BASE_URL}/v1/signout`;
export const register = () => `${BASE_URL}/v1/signin`; // No separate registration — IAM handles it
export const refreshToken = (retry?: boolean) => `${BASE_URL}/v1/get-account`;
export const user = () => `${BASE_URL}/v1/get-account`;
// Auth page URLs (client-side navigation)
export const loginPage = () => `${BASE_URL}/login`;
export const registerPage = () => `${BASE_URL}/register`;
// Social login (handled by IAM redirect, not gateway)
export const loginFacebook = () => `${BASE_URL}/api/signin`;
export const loginGoogle = () => `${BASE_URL}/api/signin`;
export const loginFacebook = () => `${BASE_URL}/v1/signin`;
export const loginGoogle = () => `${BASE_URL}/v1/signin`;
// Email verification (handled by IAM)
export const verifyEmail = () => `${BASE_URL}/api/get-account`;
export const resendVerificationEmail = () => `${BASE_URL}/api/get-account`;
export const requestPasswordReset = () => `${BASE_URL}/api/get-account`;
export const resetPassword = () => `${BASE_URL}/api/get-account`;
export const verifyEmail = () => `${BASE_URL}/v1/get-account`;
export const resendVerificationEmail = () => `${BASE_URL}/v1/get-account`;
export const requestPasswordReset = () => `${BASE_URL}/v1/get-account`;
export const resetPassword = () => `${BASE_URL}/v1/get-account`;
// 2FA (handled by IAM directly)
export const enableTwoFactor = () => `${BASE_URL}/api/get-account`;
export const verifyTwoFactor = () => `${BASE_URL}/api/get-account`;
export const confirmTwoFactor = () => `${BASE_URL}/api/get-account`;
export const disableTwoFactor = () => `${BASE_URL}/api/get-account`;
export const regenerateBackupCodes = () => `${BASE_URL}/api/get-account`;
export const verifyTwoFactorTemp = () => `${BASE_URL}/api/get-account`;
export const enableTwoFactor = () => `${BASE_URL}/v1/get-account`;
export const verifyTwoFactor = () => `${BASE_URL}/v1/get-account`;
export const confirmTwoFactor = () => `${BASE_URL}/v1/get-account`;
export const disableTwoFactor = () => `${BASE_URL}/v1/get-account`;
export const regenerateBackupCodes = () => `${BASE_URL}/v1/get-account`;
export const verifyTwoFactorTemp = () => `${BASE_URL}/v1/get-account`;
// ---------------------------------------------------------------------------
// User & Balance
// ---------------------------------------------------------------------------
export const balance = () => `${BASE_URL}/api/get-usages`;
export const userPlugins = () => `${BASE_URL}/api/get-account`;
export const deleteUser = () => `${BASE_URL}/api/get-account`;
export const balance = () => `${BASE_URL}/v1/get-usages`;
export const userPlugins = () => `${BASE_URL}/v1/get-account`;
export const deleteUser = () => `${BASE_URL}/v1/get-account`;
// ---------------------------------------------------------------------------
// Conversations (Chats)
// ---------------------------------------------------------------------------
export const conversationsRoot = `${BASE_URL}/api`;
export const conversationsRoot = `${BASE_URL}/v1`;
export const conversations = (params: q.ConversationListParams) => {
return `${BASE_URL}/api/get-chats${buildQuery(params)}`;
return `${BASE_URL}/v1/get-chats${buildQuery(params)}`;
};
export const conversationById = (id: string) =>
`${BASE_URL}/api/get-chat?id=${encodeURIComponent(id)}`;
`${BASE_URL}/v1/get-chat?id=${encodeURIComponent(id)}`;
export const genTitle = (conversationId: string) =>
`${BASE_URL}/api/get-answer?provider=&question=${encodeURIComponent('Generate a short title for this conversation')}`;
`${BASE_URL}/v1/get-answer?provider=&question=${encodeURIComponent('Generate a short title for this conversation')}`;
export const updateConversation = () => `${BASE_URL}/api/update-chat`;
export const updateConversation = () => `${BASE_URL}/v1/update-chat`;
export const archiveConversation = () => `${BASE_URL}/api/update-chat`;
export const archiveConversation = () => `${BASE_URL}/v1/update-chat`;
export const deleteConversation = () => `${BASE_URL}/api/delete-chat`;
export const deleteConversation = () => `${BASE_URL}/v1/delete-chat`;
export const deleteAllConversation = () => `${BASE_URL}/api/delete-chat`;
export const deleteAllConversation = () => `${BASE_URL}/v1/delete-chat`;
export const importConversation = () => `${BASE_URL}/api/add-chat`;
export const importConversation = () => `${BASE_URL}/v1/add-chat`;
export const forkConversation = () => `${BASE_URL}/api/add-chat`;
export const forkConversation = () => `${BASE_URL}/v1/add-chat`;
export const duplicateConversation = () => `${BASE_URL}/api/add-chat`;
export const duplicateConversation = () => `${BASE_URL}/v1/add-chat`;
// ---------------------------------------------------------------------------
// Messages
// ---------------------------------------------------------------------------
const messagesRoot = `${BASE_URL}/api`;
const messagesRoot = `${BASE_URL}/v1`;
export const messages = (params: q.MessagesListParams) => {
const { conversationId, messageId, ...rest } = params;
if (conversationId && messageId) {
return `${BASE_URL}/api/get-message?id=${encodeURIComponent(messageId)}`;
return `${BASE_URL}/v1/get-message?id=${encodeURIComponent(messageId)}`;
}
if (conversationId) {
return `${BASE_URL}/api/get-messages?chat=${encodeURIComponent(conversationId)}`;
return `${BASE_URL}/v1/get-messages?chat=${encodeURIComponent(conversationId)}`;
}
return `${BASE_URL}/api/get-messages${buildQuery(rest)}`;
return `${BASE_URL}/v1/get-messages${buildQuery(rest)}`;
};
export const messagesArtifacts = (messageId: string) =>
`${BASE_URL}/api/get-message?id=${encodeURIComponent(messageId)}`;
`${BASE_URL}/v1/get-message?id=${encodeURIComponent(messageId)}`;
export const messagesBranch = () => `${BASE_URL}/api/add-message`;
export const messagesBranch = () => `${BASE_URL}/v1/add-message`;
// ---------------------------------------------------------------------------
// Shares
// ---------------------------------------------------------------------------
const shareRoot = `${BASE_URL}/api/share`;
const shareRoot = `${BASE_URL}/v1/share`;
export const shareMessages = (shareId: string) => `${shareRoot}/${shareId}`;
export const getSharedLink = (conversationId: string) => `${shareRoot}/link/${conversationId}`;
export const getSharedLinks = (
@@ -228,13 +228,13 @@ export const updateSharedLink = (shareId: string) => `${shareRoot}/${shareId}`;
// API Keys (pk- / sk- via LLM gateway)
// ---------------------------------------------------------------------------
const keysEndpoint = `${BASE_URL}/api/keys`;
const keysEndpoint = `${BASE_URL}/v1/keys`;
export const keys = () => keysEndpoint;
export const userKeyQuery = (name: string) => `${keysEndpoint}?name=${name}`;
export const revokeUserKey = (name: string) => `${keysEndpoint}/${name}`;
export const revokeAllUserKeys = () => `${keysEndpoint}?all=true`;
const apiKeysEndpoint = `${BASE_URL}/api/api-keys`;
const apiKeysEndpoint = `${BASE_URL}/v1/api-keys`;
export const apiKeys = () => apiKeysEndpoint;
export const apiKeyById = (id: string) => `${apiKeysEndpoint}/${id}`;
@@ -243,68 +243,68 @@ export const apiKeyById = (id: string) => `${apiKeysEndpoint}/${id}`;
// ---------------------------------------------------------------------------
export const search = (q: string, cursor?: string | null) =>
`${BASE_URL}/api/get-global-chats?field=messages&value=${encodeURIComponent(q)}${cursor ? `&cursor=${cursor}` : ''}`;
`${BASE_URL}/v1/get-global-chats?field=messages&value=${encodeURIComponent(q)}${cursor ? `&cursor=${cursor}` : ''}`;
export const searchEnabled = () => `${BASE_URL}/api/health`;
export const searchEnabled = () => `${BASE_URL}/v1/health`;
// ---------------------------------------------------------------------------
// Presets & Config
// ---------------------------------------------------------------------------
export const presets = () => `${BASE_URL}/api/presets`;
export const deletePreset = () => `${BASE_URL}/api/presets/delete`;
export const plugins = () => `${BASE_URL}/api/get-providers`;
export const config = () => `${BASE_URL}/api/get-account`;
export const aiEndpoints = () => `${BASE_URL}/api/get-providers`;
export const presets = () => `${BASE_URL}/v1/presets`;
export const deletePreset = () => `${BASE_URL}/v1/presets/delete`;
export const plugins = () => `${BASE_URL}/v1/get-providers`;
export const config = () => `${BASE_URL}/v1/get-account`;
export const aiEndpoints = () => `${BASE_URL}/v1/get-providers`;
// ---------------------------------------------------------------------------
// Models (OpenAI-compatible, pk- key accessible)
// ---------------------------------------------------------------------------
export const models = () => `${BASE_URL}/api/models`;
export const models = () => `${BASE_URL}/v1/models`;
export const tokenizer = () => `${BASE_URL}/api/tokenizer`;
export const tokenizer = () => `${BASE_URL}/v1/tokenizer`;
// ---------------------------------------------------------------------------
// LLM Completions (OpenAI + Anthropic compatible)
// ---------------------------------------------------------------------------
export const chatCompletions = () => `${BASE_URL}/api/chat/completions`;
export const anthropicMessages = () => `${BASE_URL}/api/messages`;
export const chatCompletions = () => `${BASE_URL}/v1/chat/completions`;
export const anthropicMessages = () => `${BASE_URL}/v1/messages`;
// ---------------------------------------------------------------------------
// Providers
// ---------------------------------------------------------------------------
export const providers = () => `${BASE_URL}/api/get-providers`;
export const provider = (id: string) => `${BASE_URL}/api/get-provider?id=${encodeURIComponent(id)}`;
export const providers = () => `${BASE_URL}/v1/get-providers`;
export const provider = (id: string) => `${BASE_URL}/v1/get-provider?id=${encodeURIComponent(id)}`;
// ---------------------------------------------------------------------------
// Files
// ---------------------------------------------------------------------------
export const files = () => `${BASE_URL}/api/get-files`;
export const fileUpload = () => `${BASE_URL}/api/upload-file`;
export const fileDelete = () => `${BASE_URL}/api/delete-file`;
export const files = () => `${BASE_URL}/v1/get-files`;
export const fileUpload = () => `${BASE_URL}/v1/upload-file`;
export const fileDelete = () => `${BASE_URL}/v1/delete-file`;
export const fileDownload = (userId: string, fileId: string) =>
`${BASE_URL}/api/get-file?id=${encodeURIComponent(fileId)}`;
export const fileConfig = () => `${BASE_URL}/api/get-files`;
`${BASE_URL}/v1/get-file?id=${encodeURIComponent(fileId)}`;
export const fileConfig = () => `${BASE_URL}/v1/get-files`;
export const agentFiles = (agentId: string) =>
`${BASE_URL}/api/get-files?agent=${encodeURIComponent(agentId)}`;
`${BASE_URL}/v1/get-files?agent=${encodeURIComponent(agentId)}`;
export const images = () => `${BASE_URL}/api/get-files`;
export const avatar = () => `${BASE_URL}/api/upload-file`;
export const images = () => `${BASE_URL}/v1/get-files`;
export const avatar = () => `${BASE_URL}/v1/upload-file`;
// ---------------------------------------------------------------------------
// Speech (TTS / STT)
// ---------------------------------------------------------------------------
export const speech = () => `${BASE_URL}/api`;
export const speechToText = () => `${BASE_URL}/api/process-speech-to-text`;
export const textToSpeech = () => `${BASE_URL}/api/generate-text-to-speech-audio`;
export const textToSpeechManual = () => `${BASE_URL}/api/generate-text-to-speech-audio`;
export const textToSpeechVoices = () => `${BASE_URL}/api/generate-text-to-speech-audio`;
export const getCustomConfigSpeech = () => `${BASE_URL}/api/get-providers`;
export const speech = () => `${BASE_URL}/v1`;
export const speechToText = () => `${BASE_URL}/v1/process-speech-to-text`;
export const textToSpeech = () => `${BASE_URL}/v1/generate-text-to-speech-audio`;
export const textToSpeechManual = () => `${BASE_URL}/v1/generate-text-to-speech-audio`;
export const textToSpeechVoices = () => `${BASE_URL}/v1/generate-text-to-speech-audio`;
export const getCustomConfigSpeech = () => `${BASE_URL}/v1/get-providers`;
// ---------------------------------------------------------------------------
// Assistants & Agents
@@ -323,7 +323,7 @@ export const assistants = ({
version: number | string;
isAvatar?: boolean;
}) => {
let url = isAvatar === true ? `${images()}/assistants` : `${BASE_URL}/api/assistants/v${version}`;
let url = isAvatar === true ? `${images()}/assistants` : `${BASE_URL}/v1/assistants/v${version}`;
if (path && path !== '') {
url += `/${path}`;
}
@@ -338,7 +338,7 @@ export const assistants = ({
};
export const agents = ({ path = '', options }: { path?: string; options?: object }) => {
let url = `${BASE_URL}/api/agents`;
let url = `${BASE_URL}/v1/agents`;
if (path && path !== '') {
url += `/${path}`;
}
@@ -349,7 +349,7 @@ export const agents = ({ path = '', options }: { path?: string; options?: object
return url;
};
export const activeJobs = () => `${BASE_URL}/api/agents/chat/active`;
export const activeJobs = () => `${BASE_URL}/v1/agents/chat/active`;
export const revertAgentVersion = (agent_id: string) => `${agents({ path: `${agent_id}/revert` })}`;
@@ -358,34 +358,34 @@ export const revertAgentVersion = (agent_id: string) => `${agents({ path: `${age
// ---------------------------------------------------------------------------
export const mcp = {
tools: `${BASE_URL}/api/mcp/tools`,
servers: `${BASE_URL}/api/mcp/servers`,
tools: `${BASE_URL}/v1/mcp/tools`,
servers: `${BASE_URL}/v1/mcp/servers`,
};
export const mcpServer = (serverName: string) => `${BASE_URL}/api/mcp/servers/${serverName}`;
export const mcpServer = (serverName: string) => `${BASE_URL}/v1/mcp/servers/${serverName}`;
export const mcpReinitialize = (serverName: string) =>
`${BASE_URL}/api/mcp/${serverName}/reinitialize`;
export const mcpConnectionStatus = () => `${BASE_URL}/api/mcp/connection/status`;
`${BASE_URL}/v1/mcp/${serverName}/reinitialize`;
export const mcpConnectionStatus = () => `${BASE_URL}/v1/mcp/connection/status`;
export const mcpServerConnectionStatus = (serverName: string) =>
`${BASE_URL}/api/mcp/connection/status/${serverName}`;
`${BASE_URL}/v1/mcp/connection/status/${serverName}`;
export const mcpAuthValues = (serverName: string) =>
`${BASE_URL}/api/mcp/${serverName}/auth-values`;
`${BASE_URL}/v1/mcp/${serverName}/auth-values`;
export const cancelMCPOAuth = (serverName: string) =>
`${BASE_URL}/api/mcp/oauth/cancel/${serverName}`;
export const mcpOAuthBind = (serverName: string) => `${BASE_URL}/api/mcp/${serverName}/oauth/bind`;
`${BASE_URL}/v1/mcp/oauth/cancel/${serverName}`;
export const mcpOAuthBind = (serverName: string) => `${BASE_URL}/v1/mcp/${serverName}/oauth/bind`;
export const actionOAuthBind = (actionId: string) =>
`${BASE_URL}/api/actions/${actionId}/oauth/bind`;
`${BASE_URL}/v1/actions/${actionId}/oauth/bind`;
// MCP tool refresh (cloud gateway native)
export const refreshMcpTools = () => `${BASE_URL}/api/refresh-mcp-tools`;
export const refreshMcpTools = () => `${BASE_URL}/v1/refresh-mcp-tools`;
// ---------------------------------------------------------------------------
// Prompts
// ---------------------------------------------------------------------------
export const prompts = () => `${BASE_URL}/api/prompts`;
export const prompts = () => `${BASE_URL}/v1/prompts`;
export const addPromptToGroup = (groupId: string) =>
`${BASE_URL}/api/prompts/groups/${groupId}/prompts`;
`${BASE_URL}/v1/prompts/groups/${groupId}/prompts`;
export const getPromptGroup = (_id: string) => `${prompts()}/groups/${_id}`;
export const getPromptGroupsWithFilters = (filter: object) => {
let url = `${prompts()}/groups`;
@@ -422,15 +422,15 @@ export const updatePromptTag = (_id: string) => `${getPrompt(_id)}/tags/producti
export const deletePromptGroup = getPromptGroup;
export const deletePrompt = ({ _id, groupId }: { _id: string; groupId: string }) =>
`${prompts()}/${_id}?groupId=${groupId}`;
export const getCategories = () => `${BASE_URL}/api/categories`;
export const getCategories = () => `${BASE_URL}/v1/categories`;
export const getAllPromptGroups = () => `${prompts()}/all`;
// ---------------------------------------------------------------------------
// Roles & Permissions
// ---------------------------------------------------------------------------
export const roles = () => `${BASE_URL}/api/get-permissions`;
export const getRole = (roleName: string) => `${BASE_URL}/api/get-permission?id=${roleName.toLowerCase()}`;
export const roles = () => `${BASE_URL}/v1/get-permissions`;
export const getRole = (roleName: string) => `${BASE_URL}/v1/get-permission?id=${roleName.toLowerCase()}`;
export const updatePromptPermissions = (roleName: string) => `${getRole(roleName)}/prompts`;
export const updateMemoryPermissions = (roleName: string) => `${getRole(roleName)}/memories`;
export const updateAgentPermissions = (roleName: string) => `${getRole(roleName)}/agents`;
@@ -447,7 +447,7 @@ export const updateMarketplacePermissions = (roleName: string) =>
// ---------------------------------------------------------------------------
export const conversationTags = (tag?: string) =>
`${BASE_URL}/api/tags${tag != null && tag ? `/${encodeURIComponent(tag)}` : ''}`;
`${BASE_URL}/v1/tags${tag != null && tag ? `/${encodeURIComponent(tag)}` : ''}`;
export const conversationTagsList = (pageNumber: string, sort?: string, order?: string) =>
`${conversationTags()}/list?pageNumber=${pageNumber}${sort ? `&sort=${sort}` : ''}${
order ? `&order=${order}` : ''
@@ -459,23 +459,23 @@ export const addTagToConversation = (conversationId: string) =>
// Misc
// ---------------------------------------------------------------------------
export const userTerms = () => `${BASE_URL}/api/user/terms`;
export const acceptUserTerms = () => `${BASE_URL}/api/user/terms/accept`;
export const banner = () => `${BASE_URL}/api/banner`;
export const userTerms = () => `${BASE_URL}/v1/user/terms`;
export const acceptUserTerms = () => `${BASE_URL}/v1/user/terms/accept`;
export const banner = () => `${BASE_URL}/v1/banner`;
// Message Feedback
export const feedback = (conversationId: string, messageId: string) =>
`${BASE_URL}/api/update-message?id=${encodeURIComponent(messageId)}`;
`${BASE_URL}/v1/update-message?id=${encodeURIComponent(messageId)}`;
// Memories
export const memories = () => `${BASE_URL}/api/memories`;
export const memories = () => `${BASE_URL}/v1/memories`;
export const memory = (key: string) => `${memories()}/${encodeURIComponent(key)}`;
export const memoryPreferences = () => `${memories()}/preferences`;
// Permissions search
export const searchPrincipals = (params: q.PrincipalSearchParams) => {
const { q: query, limit, types } = params;
let url = `${BASE_URL}/api/permissions/search-principals?q=${encodeURIComponent(query)}`;
let url = `${BASE_URL}/v1/permissions/search-principals?q=${encodeURIComponent(query)}`;
if (limit !== undefined) {
url += `&limit=${limit}`;
}
@@ -486,42 +486,42 @@ export const searchPrincipals = (params: q.PrincipalSearchParams) => {
};
export const getAccessRoles = (resourceType: ResourceType) =>
`${BASE_URL}/api/permissions/${resourceType}/roles`;
`${BASE_URL}/v1/permissions/${resourceType}/roles`;
export const getResourcePermissions = (resourceType: ResourceType, resourceId: string) =>
`${BASE_URL}/api/permissions/${resourceType}/${resourceId}`;
`${BASE_URL}/v1/permissions/${resourceType}/${resourceId}`;
export const updateResourcePermissions = (resourceType: ResourceType, resourceId: string) =>
`${BASE_URL}/api/permissions/${resourceType}/${resourceId}`;
`${BASE_URL}/v1/permissions/${resourceType}/${resourceId}`;
export const getEffectivePermissions = (resourceType: ResourceType, resourceId: string) =>
`${BASE_URL}/api/permissions/${resourceType}/${resourceId}/effective`;
`${BASE_URL}/v1/permissions/${resourceType}/${resourceId}/effective`;
export const getAllEffectivePermissions = (resourceType: ResourceType) =>
`${BASE_URL}/api/permissions/${resourceType}/effective/all`;
`${BASE_URL}/v1/permissions/${resourceType}/effective/all`;
// SharePoint Graph API Token (IAM-managed)
export const graphToken = (scopes: string) =>
`${BASE_URL}/api/auth/graph-token?scopes=${encodeURIComponent(scopes)}`;
`${BASE_URL}/v1/auth/graph-token?scopes=${encodeURIComponent(scopes)}`;
// ---------------------------------------------------------------------------
// Knowledge Stores (RAG)
// ---------------------------------------------------------------------------
export const stores = () => `${BASE_URL}/api/get-stores`;
export const store = (id: string) => `${BASE_URL}/api/get-store?id=${encodeURIComponent(id)}`;
export const addStore = () => `${BASE_URL}/api/add-store`;
export const updateStore = () => `${BASE_URL}/api/update-store`;
export const deleteStore = () => `${BASE_URL}/api/delete-store`;
export const refreshStoreVectors = () => `${BASE_URL}/api/refresh-store-vectors`;
export const stores = () => `${BASE_URL}/v1/get-stores`;
export const store = (id: string) => `${BASE_URL}/v1/get-store?id=${encodeURIComponent(id)}`;
export const addStore = () => `${BASE_URL}/v1/add-store`;
export const updateStore = () => `${BASE_URL}/v1/update-store`;
export const deleteStore = () => `${BASE_URL}/v1/delete-store`;
export const refreshStoreVectors = () => `${BASE_URL}/v1/refresh-store-vectors`;
// ---------------------------------------------------------------------------
// Vectors (Embeddings)
// ---------------------------------------------------------------------------
export const vectors = () => `${BASE_URL}/api/get-vectors`;
export const addVector = () => `${BASE_URL}/api/add-vector`;
export const deleteVector = () => `${BASE_URL}/api/delete-vector`;
export const vectors = () => `${BASE_URL}/v1/get-vectors`;
export const addVector = () => `${BASE_URL}/v1/add-vector`;
export const deleteVector = () => `${BASE_URL}/v1/delete-vector`;
// ---------------------------------------------------------------------------
// Workflows & Tasks
// ---------------------------------------------------------------------------
export const workflows = () => `${BASE_URL}/api/get-workflows`;
export const tasks = () => `${BASE_URL}/api/get-tasks`;
export const workflows = () => `${BASE_URL}/v1/get-workflows`;
export const tasks = () => `${BASE_URL}/v1/get-tasks`;
+3 -3
View File
@@ -1244,9 +1244,9 @@ export const initialModelsConfig: TModelsConfig = {
};
export const EndpointURLs = {
[EModelEndpoint.assistants]: `${apiBaseUrl()}/api/assistants/v2/chat`,
[EModelEndpoint.azureAssistants]: `${apiBaseUrl()}/api/assistants/v1/chat`,
[EModelEndpoint.agents]: `${apiBaseUrl()}/api/${EModelEndpoint.agents}/chat`,
[EModelEndpoint.assistants]: `${apiBaseUrl()}/v1/assistants/v2/chat`,
[EModelEndpoint.azureAssistants]: `${apiBaseUrl()}/v1/assistants/v1/chat`,
[EModelEndpoint.agents]: `${apiBaseUrl()}/v1/${EModelEndpoint.agents}/chat`,
} as const;
export const modularEndpoints = new Set<EModelEndpoint | string>([
+3 -3
View File
@@ -158,13 +158,13 @@ if (typeof window !== 'undefined') {
}
// Don't retry auth endpoints
if (originalRequest.url?.includes('/api/signin') === true) {
if (originalRequest.url?.includes('/v1/signin') === true) {
return Promise.reject(error);
}
if (originalRequest.url?.includes('/api/signout') === true) {
if (originalRequest.url?.includes('/v1/signout') === true) {
return Promise.reject(error);
}
if (originalRequest.url?.includes('/api/get-account') === true && originalRequest._retry) {
if (originalRequest.url?.includes('/v1/get-account') === true && originalRequest._retry) {
return Promise.reject(error);
}
+3 -3
View File
@@ -14,10 +14,10 @@ const server = http.createServer((req, res) => {
return;
}
if (req.url === '/api/health' || req.url === '/health') {
if (req.url === '/v1/health' || req.url === '/health') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ status: 'ok', service: 'hanzo-runtime' }));
} else if (req.url === '/api/sandboxes' && req.method === 'POST') {
} else if (req.url === '/v1/sandboxes' && req.method === 'POST') {
// Mock sandbox creation
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
@@ -26,7 +26,7 @@ const server = http.createServer((req, res) => {
language: 'python',
createdAt: new Date().toISOString()
}));
} else if (req.url.startsWith('/api/sandboxes/') && req.method === 'DELETE') {
} else if (req.url.startsWith('/v1/sandboxes/') && req.method === 'DELETE') {
// Mock sandbox deletion
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ success: true }));