Skip to content

Commit

Permalink
Merge pull request elastic#8 from joemcelroy/add-hook
Browse files Browse the repository at this point in the history
Add API Service
  • Loading branch information
yansavitski authored Feb 12, 2024
2 parents e24d199 + 92665b2 commit e0e87c7
Show file tree
Hide file tree
Showing 4 changed files with 268 additions and 6 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"@dnd-kit/core": "^3.1.1",
"@dnd-kit/sortable": "^4.0.0",
"@dnd-kit/utilities": "^2.0.0",
"@elastic/ai-assist": "0.0.8",
"@elastic/apm-rum": "^5.16.0",
"@elastic/apm-rum-react": "^2.0.2",
"@elastic/charts": "63.0.0",
Expand Down Expand Up @@ -1694,4 +1695,4 @@
"zod-to-json-schema": "^3.22.3"
},
"packageManager": "yarn@1.22.21"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import { RouteDependencies } from '../../plugin';
import { elasticsearchErrorHandler } from '../../utils/elasticsearch_error_handler';
import Assist, { ConversationalChain } from '@elastic/ai-assist';
import { ChatOpenAI } from '@elastic/ai-assist/models';
import { Prompt } from '@elastic/ai-assist';
import { schema } from '@kbn/config-schema';
import Stream from 'stream';

export function registerAIPlaygroundRoutes({ log, router }: RouteDependencies) {
router.post(
{
path: '/internal/enterprise_search/ai_playground/chat',
validate: {
body: schema.object({
data: schema.any(),
messages: schema.any(),
}),
},
},
elasticsearchErrorHandler(log, async (context, request, response) => {
const { client } = (await context.core).elasticsearch;

const aiClient = Assist({
es_client: client.asCurrentUser,
});

const { messages, data } = await request.body;

const model = new ChatOpenAI({
openAIApiKey: data.api_key,
});

const chain = ConversationalChain({
model,
rag: {
index: data.indices,
retriever: (question: string) => {
return {
text_expansion: {
'vector.tokens': {
model_id: '.elser_model_2',
model_text: question,
},
},
};
},
},
prompt: Prompt(data.prompt, {
citations: true,
context: true,
type: 'openai',
}),
});

const stream = await chain.stream(aiClient, messages);

const reader = (stream as ReadableStream).getReader();

class UIStream extends Stream.Readable {
_read() {
const that = this;

function read() {
reader.read().then(({ done, value }: { done: boolean; value?: string }) => {
if (done) {
that.push(null);
return;
}
that.push(value);
read();
});
}
read();
}
}

return response.custom({
body: new UIStream(),
statusCode: 200,
headers: {
'Content-Type': 'text/plain; charset=utf-8',
},
});
})
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import { RouteDependencies } from '../../plugin';

import { registerAIPlaygroundRoutes } from './ai_playground';
import { registerDocumentRoute } from './documents';
import { registerIndexRoutes } from './indices';
import { registerMappingRoute } from './mapping';
Expand All @@ -19,4 +20,5 @@ export const registerEnterpriseSearchRoutes = (dependencies: RouteDependencies)
registerSearchRoute(dependencies);
registerDocumentRoute(dependencies);
registerSearchApplicationsRoutes(dependencies);
registerAIPlaygroundRoutes(dependencies);
};
Loading

0 comments on commit e0e87c7

Please sign in to comment.