Files

1 line
12 KiB
JSON

{"repo": "alienstemple/aiagent", "files": {"app/src/main/java/com/whitemonkeys/aiagent/ConsoleAgent.kt": {"e813b00093987a56e6bebe93cade1db1283361bf": {"t": 1785747148.3126109, "n": 5440, "h": "9fc77f77d2afe493", "c": "package com.whitemonkeys.aiagent\n\nimport ai.koog.agents.core.agent.AIAgent\nimport ai.koog.agents.core.agent.config.AIAgentConfig\nimport ai.koog.agents.core.tools.ToolRegistry\nimport ai.koog.agents.core.tools.annotations.LLMDescription\nimport ai.koog.agents.core.tools.annotations.Tool\nimport ai.koog.agents.core.tools.reflect.ToolSet\nimport ai.koog.agents.ext.agent.singleRunStrategy\nimport ai.koog.agents.local.features.eventHandler.feature.handleEvents\nimport ai.koog.prompt.dsl.Prompt\nimport ai.koog.prompt.dsl.prompt\nimport ai.koog.prompt.executor.clients.deepseek.DeepSeekLLMClient\nimport ai.koog.prompt.executor.clients.openai.OpenAIModels\nimport ai.koog.prompt.executor.clients.deepseek.DeepSeekModels\nimport ai.koog.prompt.executor.llms.all.simpleOpenAIExecutor\nimport ai.koog.prompt.llm.LLModel\nimport android.annotation.SuppressLint\nimport io.github.cdimascio.dotenv.Dotenv\nimport io.ktor.client.HttpClient\nimport io.ktor.client.call.body\nimport io.ktor.client.plugins.contentnegotiation.ContentNegotiation\nimport io.ktor.client.plugins.defaultRequest\nimport io.ktor.client.request.header\nimport io.ktor.client.request.post\nimport io.ktor.client.request.setBody\nimport io.ktor.http.ContentType\nimport io.ktor.http.URLBuilder\nimport io.ktor.http.contentType\nimport io.ktor.serialization.kotlinx.json.json\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.json.JsonNamingStrategy\n\n/*\n A simple assistant that can access the web and help you automate web related tasks, e.g. market or competitor research.\n*/\n\n//region JSON instance\n@OptIn(ExperimentalSerializationApi::class)\nprivate val json =\n Json {\n ignoreUnknownKeys = true\n prettyPrint = true\n explicitNulls = false\n namingStrategy = JsonNamingStrategy.SnakeCase\n }\n//endregion\n\n//region Web search DTOs\n@SuppressLint(\"UnsafeOptInUsageError\")\n@Serializable\ndata class WebSearchResult(\n val organic: List<OrganicResult>,\n) {\n @Serializable\n data class OrganicResult(\n val link: String,\n val title: String,\n val description: String,\n val rank: Int,\n val globalRank: Int,\n )\n}\n\n@SuppressLint(\"UnsafeOptInUsageError\")\n@Serializable\ndata class WebPageScrapingResult(\n val body: String, // will be a markdown version of the page\n)\n\n@SuppressLint(\"UnsafeOptInUsageError\")\n@Serializable\ndata class BrightDataRequest(\n val zone: String,\n val url: String,\n val format: String,\n val dataFormat: String? = null,\n)\n//endregion\n\n//region Web search tools\nclass WebSearchTools(\n private val brightDataKey: String,\n) : ToolSet {\n //region HTTP client\n private val httpClient =\n HttpClient {\n defaultRequest {\n url(\"https://api.brightdata.com/request\")\n contentType(ContentType.Application.Json)\n header(\"Authorization\", \"Bearer $brightDataKey\")\n }\n\n install(ContentNegotiation) {\n json(json)\n }\n }\n //endregion\n\n //region Search tool\n @Tool\n @LLMDescription(\"Search for a query on Google.\")\n @Suppress(\"unused\")\n suspend fun search(\n @LLMDescription(\"The query to search\")\n query: String,\n ): WebSearchResult {\n val url =\n URLBuilder(\"https://www.google.com/search\")\n .apply {\n parameters.append(\"brd_json\", \"1\")\n parameters.append(\"q\", query)\n }.buildString()\n\n val request =\n BrightDataRequest(\n zone = \"serp_api1\",\n url = url,\n format = \"raw\",\n )\n\n val response =\n httpClient\n .post {\n setBody(request)\n }\n\n return response.body<WebSearchResult>()\n }\n //endregion\n\n //region Scrape tool\n @Tool\n @LLMDescription(\"Scrape a web page for content\")\n @Suppress(\"unused\")\n suspend fun scrape(\n @LLMDescription(\"The URL to scrape\") url: String,\n ): WebPageScrapingResult {\n val request = BrightDataRequest(\n zone = \"web_unlocker1\",\n url = url,\n format = \"json\",\n dataFormat = \"markdown\",\n )\n val response = httpClient.post { setBody(request) }\n val result = response.body<WebPageScrapingResult>()\n\n // Optional: limit content length to avoid API overflow\n val maxChars = 50_000 // ~12k tokens\n val safeContent = if (result.body.length > maxChars) {\n result.copy(body = result.body.take(maxChars) + \"\\n\\n[Content truncated]\")\n } else {\n result\n }\n\n return safeContent\n }\n}\n//endregion\n\nfun main() {\n\n val deepseekApiKey = \"sk-dcab13bf16de4632a4bdc7e158e1bcbe\"\n\n val deepseekClient = DeepSeekLLMClient(\n apiKey = deepseekApiKey,\n )\n\n val basePrompt = prompt(\"base-prompt\") {\n system(\"Ты — полезный русскоязычный ассистент. Отвечай кратко и по делу.\")\n }\n\n val request = prompt(basePrompt) {\n user(\"Сгенерируй одно краткое приветствие пользователю\")\n }\n\n runBlocking {\n val response = deepseekClient.execute(prompt = request, model = DeepSeekModels.DeepSeekChat)\n println(response) // Полученный ответ от модели\n }\n}\n\n\n\n"}, "0870dd9987f106cccfde2f0a6a1bf7ebd0481786": {"t": 1785770714.6148036, "n": 6263, "h": "25ff7dd29f494948", "c": "package com.whitemonkeys.aiagent\n\nimport ai.koog.agents.core.agent.AIAgent\nimport ai.koog.agents.core.agent.config.AIAgentConfig\nimport ai.koog.agents.core.tools.ToolRegistry\nimport ai.koog.agents.core.tools.annotations.LLMDescription\nimport ai.koog.agents.core.tools.annotations.Tool\nimport ai.koog.agents.core.tools.reflect.ToolSet\nimport ai.koog.agents.ext.agent.singleRunStrategy\nimport ai.koog.agents.local.features.eventHandler.feature.handleEvents\nimport ai.koog.prompt.dsl.prompt\nimport ai.koog.prompt.executor.clients.anthropic.AnthropicModels\nimport ai.koog.prompt.executor.llms.all.simpleAnthropicExecutor\nimport android.annotation.SuppressLint\nimport io.github.cdimascio.dotenv.Dotenv\nimport io.ktor.client.HttpClient\nimport io.ktor.client.call.body\nimport io.ktor.client.plugins.contentnegotiation.ContentNegotiation\nimport io.ktor.client.plugins.defaultRequest\nimport io.ktor.client.request.header\nimport io.ktor.client.request.post\nimport io.ktor.client.request.setBody\nimport io.ktor.http.ContentType\nimport io.ktor.http.URLBuilder\nimport io.ktor.http.contentType\nimport io.ktor.serialization.kotlinx.json.json\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.json.JsonNamingStrategy\n\n/*\n A simple assistant that can access the web and help you automate web related tasks, e.g. market or competitor research.\n*/\n\n//region JSON instance\n@OptIn(ExperimentalSerializationApi::class)\nprivate val json =\n Json {\n ignoreUnknownKeys = true\n prettyPrint = true\n explicitNulls = false\n namingStrategy = JsonNamingStrategy.SnakeCase\n }\n//endregion\n\n//region Web search DTOs\n@SuppressLint(\"UnsafeOptInUsageError\")\n@Serializable\ndata class WebSearchResult(\n val organic: List<OrganicResult>,\n) {\n @Serializable\n data class OrganicResult(\n val link: String,\n val title: String,\n val description: String,\n val rank: Int,\n val globalRank: Int,\n )\n}\n\n@SuppressLint(\"UnsafeOptInUsageError\")\n@Serializable\ndata class WebPageScrapingResult(\n val body: String, // will be a markdown version of the page\n)\n\n@SuppressLint(\"UnsafeOptInUsageError\")\n@Serializable\ndata class BrightDataRequest(\n val zone: String,\n val url: String,\n val format: String,\n val dataFormat: String? = null,\n)\n//endregion\n\n//region Web search tools\nclass WebSearchTools(\n private val brightDataKey: String,\n) : ToolSet {\n //region HTTP client\n private val httpClient =\n HttpClient {\n defaultRequest {\n url(\"https://api.brightdata.com/request\")\n contentType(ContentType.Application.Json)\n header(\"Authorization\", \"Bearer $brightDataKey\")\n }\n\n install(ContentNegotiation) {\n json(json)\n }\n }\n //endregion\n\n //region Search tool\n @Tool\n @LLMDescription(\"Search for a query on Google.\")\n @Suppress(\"unused\")\n suspend fun search(\n @LLMDescription(\"The query to search\")\n query: String,\n ): WebSearchResult {\n val url =\n URLBuilder(\"https://www.google.com/search\")\n .apply {\n parameters.append(\"brd_json\", \"1\")\n parameters.append(\"q\", query)\n }.buildString()\n\n val request =\n BrightDataRequest(\n zone = \"serp_api1\",\n url = url,\n format = \"raw\",\n )\n\n val response =\n httpClient\n .post {\n setBody(request)\n }\n\n return response.body<WebSearchResult>()\n }\n //endregion\n\n //region Scrape tool\n @Tool\n @LLMDescription(\"Scrape a web page for content\")\n @Suppress(\"unused\")\n suspend fun scrape(\n @LLMDescription(\"The URL to scrape\") url: String,\n ): WebPageScrapingResult {\n val request = BrightDataRequest(\n zone = \"web_unlocker1\",\n url = url,\n format = \"json\",\n dataFormat = \"markdown\",\n )\n val response = httpClient.post { setBody(request) }\n val result = response.body<WebPageScrapingResult>()\n\n // Optional: limit content length to avoid API overflow\n val maxChars = 50_000 // ~12k tokens\n val safeContent = if (result.body.length > maxChars) {\n result.copy(body = result.body.take(maxChars) + \"\\n\\n[Content truncated]\")\n } else {\n result\n }\n\n return safeContent\n }\n}\n//endregion\n\nsuspend fun main() {\n // Load from the resources folder, custom filename\n val dotenv = Dotenv.configure()\n .directory(\"./src/main/resources\")\n .filename(\"API_KEY.env\")\n .load()\n\n val anthropicApiKey =\n dotenv[\"ANTHROPIC_API_KEY\"] ?: System.getenv(\"ANTHROPIC_API_KEY\")\n ?: error(\"ANTHROPIC_API_KEY is not set in .env or environment\")\n\n val brightDataKey =\n dotenv[\"BRIGHT_DATA_KEY\"] ?: System.getenv(\"BRIGHT_DATA_KEY\")\n ?: error(\"BRIGHT_DATA_KEY is not set in .env or environment\")\n\n val agentConfig = AIAgentConfig(\n prompt =\n prompt(\"web_search_prompt\") {\n system(\"You are a helpful assistant that helps users to find information on the internet.\")\n },\n model = AnthropicModels.Sonnet_4,\n maxAgentIterations = 30,\n )\n\n //region Tool registry\n val webSearchTools = WebSearchTools(brightDataKey)\n\n val toolRegistry =\n ToolRegistry {\n tools(webSearchTools)\n }\n\n\n val agent =\n AIAgent<String,String>(\n promptExecutor = simpleAnthropicExecutor(anthropicApiKey),\n strategy = singleRunStrategy(),\n toolRegistry = toolRegistry,\n agentConfig = agentConfig,\n ) {\n handleEvents {\n onToolCall { ctx ->\n println(\"Tool called: tool ${ctx.tool.name}, args ${ctx.toolArgs}\")\n }\n }\n }\n\n val result = agent.run(\"Who is the president of the United States as of today?, tell me as well from which website you scraped the information\")\n println(result)\n}\n\n\n\n"}}}}