kibana/x-pack/platform/packages/shared/onechat/onechat-server/index.ts
Pierre Gayvallet f3b4975c8c
[onechat] Introduce plugin and tool registry (#220889)
## Summary

Implements the onechat tool registry RFC.

Fix https://github.com/elastic/search-team/issues/9938
Fix https://github.com/elastic/search-team/issues/10019

This PR introduces the following artifacts:

**plugins:**
- `onechat`

**packages:**
- `@kbn/onechat-common`
- `@kbn/onechat-server`
- `@kbn/onechat-browser`

## Tool APIs overview

### Registering a tool

```ts
class MyPlugin {
  setup(core: CoreSetup, { onechat }: { onechat: OnechatPluginSetup }) {
    onechat.tools.register({
      id: 'my_tool',
      name: 'My Tool',
      description: 'My very first tool',
      meta: {
        tags: ['foo', 'bar'],
      },
      schema: z.object({
        someNumber: z.number().describe('Some random number'),
      }),
      handler: ({ someNumber }, context) => {
        return 42 + someNumber;
      },
    });
  }
}
```

### Executing a tool

Using the `execute` API:

```ts
const { result } = await onechat.tools.execute({
  toolId: 'my_tool',
  toolParams: { someNumber: 9000 },
  request,
});
```

Using a tool descriptor:

```ts
const tool = await onechat.tools.registry.get({ toolId: 'my_tool', request });
const { result } = await tool.execute({ toolParams: { someNumber: 9000 } });
```

With error handling:

```ts
import { isToolNotFoundError } from '@kbn/onechat-common';

try {
  const { result } = await onechat.tools.execute({
    toolId: 'my_tool',
    toolParams: { someNumber: 9000 },
    request,
  });
} catch (e) {
  if (isToolNotFoundError(e)) {
    throw new Error(`run ${e.meta.runId} failed because tool was not found`);
  }
}
```

### Listing tools

```ts
const tools = await onechat.tools.registry.list({ request });
```

*More details and example in the plugin's readme.*

### What is **not** included in this PR:

- tool access control / authorization - we have a dedicated RFC
- dynamic tool registration / permissions checks part/of depends on the
authorization RFC
- feature / capabilities - will come with browser-side and HTTP APIs
- fully defining tool meta - hard to do now
- filter parameters for the tool list API - depends on the meta being
defined

*Those will be follow-ups*. Everything else from the RFC should be
there.

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
2025-05-28 00:45:01 +03:00

46 lines
1.1 KiB
TypeScript

/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
export type {
RegisteredTool,
ToolHandlerFn,
ToolHandlerContext,
ToolProvider,
ToolProviderHasOptions,
ToolProviderGetOptions,
ToolProviderListOptions,
ExecutableTool,
ExecutableToolHandlerParams,
ExecutableToolHandlerFn,
} from './src/tools';
export type { ModelProvider, ScopedModel } from './src/model_provider';
export type {
ScopedRunner,
ScopedRunToolFn,
ScopedRunnerRunToolsParams,
RunContext,
RunContextStackEntry,
RunToolParams,
RunToolFn,
Runner,
RunToolReturn,
} from './src/runner';
export {
OnechatRunEventType,
isToolResponseEvent,
isToolCallEvent,
type OnechatRunEvent,
type RunEventHandlerFn,
type ToolResponseEventData,
type RunEventEmitter,
type RunEventEmitterFn,
type InternalRunEvent,
type OnechatRunEventMeta,
type ToolCallEventData,
type ToolResponseEvent,
type ToolCallEvent,
} from './src/events';