src / toolsProvider.ts
import { text, tool, ToolsProviderController } from "@lmstudio/sdk";
import { z } from "zod";
import { configSchematics } from "./configSchematics";
export async function toolsProvider(ctl: ToolsProviderController) {
const config = ctl.getPluginConfig(configSchematics);
const apiKey = config.get("kinopoiskApiKey");
if (!apiKey) {
console.warn("Kinopoisk API Key is not configured in the plugin settings.");
}
const searchMovieTool = tool({
name: "search_movie_poiskkino_dev",
description: text`
ΠΡΠ΅Ρ ΡΠΈΠ»ΡΠΌΡ, ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΈ ΠΌΡΠ»ΡΡΡΠΈΠ»ΡΠΌΡ ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· API ΠΠΎΠΈΡΠΊΠΠΈΠ½ΠΎ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΡ
ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², Π²ΠΊΠ»ΡΡΠ°Ρ ID ΡΠΈΠ»ΡΠΌΠ°, Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π³ΠΎΠ΄ Π²ΡΠΏΡΡΠΊΠ° ΠΈ ΡΠ΅ΠΉΡΠΈΠ½Π³.
ΠΠ°ΠΆΠ½ΠΎ: ΠΡΠ»ΠΈ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ
Π΅ΡΡΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΠΉ ΡΠΈΠ»ΡΠΌ, ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ 'get_movie_details_poiskkino_dev',
ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΠΆΠ°Π½ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠΈΡΠΊ Π²ΡΠ΄Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π±Π°Π·ΠΎΠ²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
`,
parameters: { query: z.string() },
implementation: async ({ query }, { warn }) => {
if (!apiKey) return "ΠΡΠΈΠ±ΠΊΠ°: ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΠΊΠ°ΠΆΠΈΡΠ΅ API Key Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
ΠΏΠ»Π°Π³ΠΈΠ½Π°.";
const url = new URL("https://api.poiskkino.dev/v1.4/movie/search");
url.searchParams.set("query", query);
try {
const response = await fetch(url.toString(), {
headers: { "X-API-KEY": apiKey },
});
if (!response.ok) {
return `ΠΡΠΈΠ±ΠΊΠ° API: ${response.status} ${response.statusText}`;
}
const data = await response.json();
const results = data.docs?.map((movie: any) => ({
id: movie.id,
name: movie.name,
year: movie.year,
rating: movie.rating,
})) || [];
if (results.length === 0) {
return "ΠΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡ Π·Π°ΠΏΡΠΎΡΡ.";
}
return {
results,
hint: "ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΈΠ»ΡΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ 'get_movie_details_poiskkino_dev' Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌ 'id'."
};
} catch (error: any) {
warn(`PoiskKino API Error: ${error.message}`);
return `ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠΈΡΠΊΠ΅: ${error.message}`;
}
},
});
const getMovieDetailsTool = tool({
name: "get_movie_details_poiskkino_dev",
description: text`
ΠΠΎΠ»ΡΡΠ°Π΅Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΈΠ»ΡΠΌΠ΅, ΡΠ΅ΡΠΈΠ°Π»Π΅ ΠΈΠ»ΠΈ ΠΌΡΠ»ΡΡΡΠΈΠ»ΡΠΌΠ΅ ΠΏΠΎ Π΅Π³ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΌΡ ID ΠΈΠ· ΠΠΎΠΈΡΠΊΠΠΈΠ½ΠΎ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΠΆΠ°Π½ΡΡ, ΡΠ΅ΠΉΡΠΈΠ½Π³, Π³ΠΎΠ΄ Π²ΡΠΏΡΡΠΊΠ°, ΡΠ΅ΠΆΠΈΡΡΠ΅ΡΠΎΠ² ΠΈ Π°ΠΊΡΠ΅ΡΡΠΊΠΈΠΉ ΡΠΎΡΡΠ°Π².
`,
parameters: { id: z.number() },
implementation: async ({ id }, { warn }) => {
if (!apiKey) return "ΠΡΠΈΠ±ΠΊΠ°: ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΠΊΠ°ΠΆΠΈΡΠ΅ API Key Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
ΠΏΠ»Π°Π³ΠΈΠ½Π°.";
const url = `https://api.poiskkino.dev/v1.4/movie/${id}`;
try {
const response = await fetch(url, {
headers: { "X-API-KEY": apiKey },
});
if (!response.ok) {
return `ΠΡΠΈΠ±ΠΊΠ° API: ${response.status} ${response.statusText}`;
}
const data = await response.json();
return {
title: data.name,
year: data.year,
rating: data.rating,
genre: data.genres,
description: data.description,
director: data.directors,
actors: data.actors,
alternativeName: data.alternativeName,
};
} catch (error: any) {
warn(`PoiskKino API Error: ${error.message}`);
return `ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ
: ${error.message}`;
}
},
});
return [searchMovieTool, getMovieDetailsTool];
}
src / toolsProvider.ts
import { text, tool, ToolsProviderController } from "@lmstudio/sdk";
import { z } from "zod";
import { configSchematics } from "./configSchematics";
export async function toolsProvider(ctl: ToolsProviderController) {
const config = ctl.getPluginConfig(configSchematics);
const apiKey = config.get("kinopoiskApiKey");
if (!apiKey) {
console.warn("Kinopoisk API Key is not configured in the plugin settings.");
}
const searchMovieTool = tool({
name: "search_movie_poiskkino_dev",
description: text`
ΠΡΠ΅Ρ ΡΠΈΠ»ΡΠΌΡ, ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΈ ΠΌΡΠ»ΡΡΡΠΈΠ»ΡΠΌΡ ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· API ΠΠΎΠΈΡΠΊΠΠΈΠ½ΠΎ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΡ
ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², Π²ΠΊΠ»ΡΡΠ°Ρ ID ΡΠΈΠ»ΡΠΌΠ°, Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π³ΠΎΠ΄ Π²ΡΠΏΡΡΠΊΠ° ΠΈ ΡΠ΅ΠΉΡΠΈΠ½Π³.
ΠΠ°ΠΆΠ½ΠΎ: ΠΡΠ»ΠΈ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ
Π΅ΡΡΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΠΉ ΡΠΈΠ»ΡΠΌ, ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ 'get_movie_details_poiskkino_dev',
ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΠΆΠ°Π½ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠΈΡΠΊ Π²ΡΠ΄Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π±Π°Π·ΠΎΠ²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
`,
parameters: { query: z.string() },
implementation: async ({ query }, { warn }) => {
if (!apiKey) return "ΠΡΠΈΠ±ΠΊΠ°: ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΠΊΠ°ΠΆΠΈΡΠ΅ API Key Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
ΠΏΠ»Π°Π³ΠΈΠ½Π°.";
const url = new URL("https://api.poiskkino.dev/v1.4/movie/search");
url.searchParams.set("query", query);
try {
const response = await fetch(url.toString(), {
headers: { "X-API-KEY": apiKey },
});
if (!response.ok) {
return `ΠΡΠΈΠ±ΠΊΠ° API: ${response.status} ${response.statusText}`;
}
const data = await response.json();
const results = data.docs?.map((movie: any) => ({
id: movie.id,
name: movie.name,
year: movie.year,
rating: movie.rating,
})) || [];
if (results.length === 0) {
return "ΠΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡ Π·Π°ΠΏΡΠΎΡΡ.";
}
return {
results,
hint: "ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΈΠ»ΡΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ 'get_movie_details_poiskkino_dev' Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌ 'id'."
};
} catch (error: any) {
warn(`PoiskKino API Error: ${error.message}`);
return `ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠΈΡΠΊΠ΅: ${error.message}`;
}
},
});
const getMovieDetailsTool = tool({
name: "get_movie_details_poiskkino_dev",
description: text`
ΠΠΎΠ»ΡΡΠ°Π΅Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΈΠ»ΡΠΌΠ΅, ΡΠ΅ΡΠΈΠ°Π»Π΅ ΠΈΠ»ΠΈ ΠΌΡΠ»ΡΡΡΠΈΠ»ΡΠΌΠ΅ ΠΏΠΎ Π΅Π³ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΌΡ ID ΠΈΠ· ΠΠΎΠΈΡΠΊΠΠΈΠ½ΠΎ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΠΆΠ°Π½ΡΡ, ΡΠ΅ΠΉΡΠΈΠ½Π³, Π³ΠΎΠ΄ Π²ΡΠΏΡΡΠΊΠ°, ΡΠ΅ΠΆΠΈΡΡΠ΅ΡΠΎΠ² ΠΈ Π°ΠΊΡΠ΅ΡΡΠΊΠΈΠΉ ΡΠΎΡΡΠ°Π².
`,
parameters: { id: z.number() },
implementation: async ({ id }, { warn }) => {
if (!apiKey) return "ΠΡΠΈΠ±ΠΊΠ°: ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΠΊΠ°ΠΆΠΈΡΠ΅ API Key Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
ΠΏΠ»Π°Π³ΠΈΠ½Π°.";
const url = `https://api.poiskkino.dev/v1.4/movie/${id}`;
try {
const response = await fetch(url, {
headers: { "X-API-KEY": apiKey },
});
if (!response.ok) {
return `ΠΡΠΈΠ±ΠΊΠ° API: ${response.status} ${response.statusText}`;
}
const data = await response.json();
return {
title: data.name,
year: data.year,
rating: data.rating,
genre: data.genres,
description: data.description,
director: data.directors,
actors: data.actors,
alternativeName: data.alternativeName,
};
} catch (error: any) {
warn(`PoiskKino API Error: ${error.message}`);
return `ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ
: ${error.message}`;
}
},
});
return [searchMovieTool, getMovieDetailsTool];
}