ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 418
Obunachilar
Ma'lumot yo'q24 soatlar
-17 kunlar
-430 kunlar
Postlar arxiv
1 419
sql\CASE WHEN ${t.type} = 'tool-getLocation' THEN ${t.tool_toolCallId} IS NOT NULL AND ${t.tool_state} IS NOT NULL ELSE TRUE END\,
),
check(
"data_weather_fields_required",
sql\CASE WHEN ${t.type} = 'data-weather' THEN ${t.data_weather_location} IS NOT NULL AND ${t.data_weather_weather} IS NOT NULL AND ${t.data_weather_temperature} IS NOT NULL ELSE TRUE END\,
),
],
);
export type MyDBUIMessagePart = typeof parts.$inferInsert;
export type MyDBUIMessagePartSelect = typeof parts.$inferSelect;
ืืชืืื ื ืฉืืจ ืืืืื ืฉื ืงืจืืช parts ืืืฉืจ ืืื ืืืืขื ืืฉ ืืจืื ืืืงืื. ืืืื ืื ืืืืื ืขืืืืืช ืืื "ืกืื" ืืืง ืืืืชืจ ืืื ืืื ืืื ืคืืื ืฆืืืื ืืฉ ืฉืชื ืขืืืืืช ืขืืืจ ืืงืื ืืืคืื ืฉื ืืืชื ืืื. ืืฉืฉืืืชื ืืช ืงืืื ืขื ืืกืืืื ืืื ืืชื ืืืชื ืืืืืฉ "This is over-engineered for most AI conversation needs".
ืืืืจืื ืืืฉืืช ื ืืกืคืืช? ื ืืกืืชื ืืืง ืืืืืฉืืช ืคื ืืจืืฆืื ืืฉืชืฃ ืืื ืืื? ืืืืื ืื ืืฉืชืฃ ืืชืืืืืช ืืืืืจื ืื ืืจืฉืชืืช ืืืืจืชืืืช.1 419
"messages",
{
id: varchar()
.primaryKey()
.$defaultFn(() => generateId()),
chatId: varchar()
.references(() => chats.id, { onDelete: "cascade" })
.notNull(),
createdAt: timestamp().defaultNow().notNull(),
role: varchar().$type<MyUIMessage["role"]>().notNull(),
},
(table) => [
index("messages_chat_id_idx").on(table.chatId),
index("messages_chat_id_created_at_idx").on(table.chatId, table.createdAt),
],
);
export const parts = pgTable(
"parts",
{
id: varchar()
.primaryKey()
.$defaultFn(() => generateId()),
messageId: varchar()
.references(() => messages.id, { onDelete: "cascade" })
.notNull(),
type: varchar().$type<MyUIMessage["parts"][0]["type"]>().notNull(),
createdAt: timestamp().defaultNow().notNull(),
order: integer().notNull().default(0),
// Text fields
text_text: text(),
// Reasoning fields
reasoning_text: text(),
// File fields
file_mediaType: varchar(),
file_filename: varchar(), // optional
file_url: varchar(),
// Source url fields
source_url_sourceId: varchar(),
source_url_url: varchar(),
source_url_title: varchar(), // optional
// Source document fields
source_document_sourceId: varchar(),
source_document_mediaType: varchar(),
source_document_title: varchar(),
source_document_filename: varchar(), // optional
// shared tool call columns
tool_toolCallId: varchar(),
tool_state: varchar().$type<ToolUIPart["state"]>(),
tool_errorText: varchar().$type<ToolUIPart["state"]>(),
// tools inputs and outputss are stored in separate cols
tool_getWeatherInformation_input:
jsonb().$type<getWeatherInformationInput>(),
tool_getWeatherInformation_output:
jsonb().$type<getWeatherInformationOutput>(),
tool_getLocation_input: jsonb().$type<getLocationInput>(),
tool_getLocation_output: jsonb().$type<getLocationOutput>(),
// Data parts
data_weather_id: varchar().$defaultFn(() => generateId()),
data_weather_location: varchar().$type<MyDataPart["weather"]["location"]>(),
data_weather_weather: varchar().$type<MyDataPart["weather"]["weather"]>(),
data_weather_temperature:
real().$type<MyDataPart["weather"]["temperature"]>(),
providerMetadata: jsonb().$type<MyProviderMetadata>(),
},
(t) => [
// Indexes for performance optimisation
index("parts_message_id_idx").on(t.messageId),
index("parts_message_id_order_idx").on(t.messageId, t.order),
// Check constraints
check(
"text_text_required_if_type_is_text",
// This SQL expression enforces: if type = 'text' then text_text IS NOT NULL
sql\CASE WHEN ${t.type} = 'text' THEN ${t.text_text} IS NOT NULL ELSE TRUE END\,
),
check(
"reasoning_text_required_if_type_is_reasoning",
sql\CASE WHEN ${t.type} = 'reasoning' THEN ${t.reasoning_text} IS NOT NULL ELSE TRUE END\,
),
check(
"file_fields_required_if_type_is_file",
sql\CASE WHEN ${t.type} = 'file' THEN ${t.file_mediaType} IS NOT NULL AND ${t.file_url} IS NOT NULL ELSE TRUE END\,
),
check(
"source_url_fields_required_if_type_is_source_url",
sql\CASE WHEN ${t.type} = 'source_url' THEN ${t.source_url_sourceId} IS NOT NULL AND ${t.source_url_url} IS NOT NULL ELSE TRUE END\,
),
check(
"source_document_fields_required_if_type_is_source_document",
sql\CASE WHEN ${t.type} = 'source_document' THEN ${t.source_document_sourceId} IS NOT NULL AND ${t.source_document_mediaType} IS NOT NULL AND ${t.source_document_title} IS NOT NULL ELSE TRUE END\,
),
check(
"tool_getWeatherInformation_fields_required",
sql\CASE WHEN ${t.type} = 'tool-getWeatherInformation' THEN ${t.tool_toolCallId} IS NOT NULL AND ${t.tool_state} IS NOT NULL ELSE TRUE END\,
),
check(
"tool_getLocation_fields_required",1 419
ืคืจืืืืืืจืงืื ืื'ื ืืืื ืืฉืืืจืช ืืืืขืืช ืืืกืืก ืื ืชืื ืื
ืืื ืืคืขืจืื ืืื ืกืคืจืืืช ืืืชืืืช ืืขืจืืืช ืืฉืืืืืช AI ืืื ืืืืคื ืื ืืขืจืืืช ืืื ืฉืืืจืืช ืืืืขืืช ืืืกืืก ืื ืชืื ืื. ืืืื ื ืจืื ืฉืืืฉ ืชืื ืืืช ืืจืืืืืช ืืืื ื ืืื ืขื ืื ืืฉืื ืืืกืชืื.
ื ืชืืื ืขื OpenAI Agents SDK, ืกืคืจืื ืืืกืืช ืืืฉื ืฉื OpenAI. ืืืช ืืืืืื ืืชืื ืืชืืขืื ืฉืืื:
import asyncio
from agents import Agent, Runner, SQLiteSession
async def main():
agent = Agent(name="Assistant", instructions="Reply very concisely.")
# Create session instance
session = SQLiteSession("conversation_123", "chats.db")
# First turn
result = await Runner.run(agent, "What city is the Golden Gate Bridge in?", session=session)
print(result.final_output)
# San Francisco
# Second turn - agent automatically remembers previous context
result = await Runner.run(agent, "What state is it in?", session=session)
print(result.final_output)
# California
if __name__ == '__main__':
asyncio.run(main())
ืืกืคืจืื ืฉืืืจืช ืืช ืื ืืืืืขืืช ืืืฉื ืืช ืืืกืืก ื ืชืื ืื SQLite ืื ืืืืืจืื. ืืืฃ ืืชืืขืื ืื ืืฆืืขืื ืื ืืืชืื Custom Session Backend ืื ืื ื ืจืืฆื ืืืฉืชืืฉ ืืกืคืจืื ืืคืจืืืงืฉื ืืื ืืฉืืืจ ืืช ืืฉืืืืช ื Postgresql ืื ืจืืืก, ืืื ืื ืื ืืกืคืงืื ืืื. ืืื ืืกื ืืืกืืก ืื ืชืื ืื ืฉื ืืฆืจ ืื ื ืืืื ืืืืืช ืฉื ืืืื ืฉื ืฉืืืืช ืืืืื ืฉื ืืืืขืืช:
sqlite> .tables
agent_messages agent_sessions
sqlite> select * from agent_messages ;
1|conversation_123|{"content": "What city is the Golden Gate Bridge in?", "role": "user"}|2025-07-30 13:35:36
2|conversation_123|{"id": "msg_688a1fa7fbe0819b9f4096e23741045f0d855ca99eba94a7", "content": [{"annotations": [], "text": "San Francisco.", "type": "output_text", "logprobs": []}], "role": "assistant", "status": "completed", "type": "message"}|2025-07-30 13:35:36
3|conversation_123|{"content": "What state is it in?", "role": "user"}|2025-07-30 13:35:37
4|conversation_123|{"id": "msg_688a1fa8fde0819b958bac6b45c84f900d855ca99eba94a7", "content": [{"annotations": [], "text": "California.", "type": "output_text", "logprobs": []}], "role": "assistant", "status": "completed", "type": "message"}|2025-07-30 13:35:37
sqlite> select * from agent_sessions ;
conversation_123|2025-07-30 13:35:36|2025-07-30 13:35:37
ืื ืืืืขื ื ืฉืืจืช ืืชืืจ JSON ืืื ืกืืืื ืืกืืืจืช. ืืฉ ืคื ืืชืจืื ืฉืืืืืืฉ ืคืฉืื ืืื ืืืื ืื ื ืืืงืื ื ืืกืคืื ืืืืืขื ืืืื ืงื ืืืืกืืฃ ืืืืขืืช ืืืฉืืช ืขื ืืืชื ืืืงืื, ืืื ืื ืืืกืจืื ืฉืงืฉื ืืืจืืฅ ืฉืืืืชืืช ืขื JSON ืื ืืืืื ื ืืื ืืช ืฉื ืืชืืื.
ืกืคืจืื ืฉื ืื ืืื RubyLLM ืืฉืคืช ืจืืื ืฉืืชืืืจืช ืขื ืจืืืืก ืืืฆืืขื ืืช ืืืื ื ืืื:
rails g model Chat model_id:string user:references
rails g model Message chat:references role:string content:text model_id:string input_tokens:integer output_tokens:integer tool_call:references
rails g model ToolCall message:references tool_call_id:string:index name:string arguments:jsonb
ืืฉืื ืื ืืจืืฉืื ืฉืื ืื ื ืจืืืื ืืื ืืืืืจื ืืืฉืชืืฉ ืืกืืืื ืืกืืืจืช, ืืื ืืืืขื ืืฉ ืชืืื, role, ืืืงื ืื ืืืืื ืืืื ืืฆืจ ืืืชื, ืืื ืืกืฃ ืืฉ ืื ื ืืืื ืฉื ืืคืขืืช ืืืื ืฉืฉืืืจืช ืืช ืืคืจืืืจืื ืืฉืืืช ืื ืืืืื ืฉื ืงืจืื. ืื ToolCall ืืืืืจ ืืฉืชื ืืืืขืืช, ืืืืืขื ืฉืืคืขืืื ืืช ืืืื ืืืืืืขื ืขื ืืชืืฆืื. ืืฉ ืคื ืฆืขื ืงืืืื ืืืืื ืช ืืืืืืช ืืืืืข ืืืืืืจ ืืืกืืกื ื ืชืื ืื ืืืืชืืื. ืืืงืื ืืืจืื ืืืืืขื ืืื ืงืืฆืื ืื ืชืืื ืืช ืืืฉืืจื ืืืืื ื ืคืจืืช ืฉื ืงืืฆืื ืืฆืืจืคืื ืืื ืื ืื Active Storage. ืืฉืชืืฉืื ืฉืจืืฆืื ืืืืืื ืืืืกืืฃ ืขืื ืขืืืืืช ืืืืืช ืืืืืขืืช ืืื metadata.
ืกืคืจืื ืฉืืืฉืืช ืืกืงืืจื ืืื Vercel AI SDK ืืืื ืืฆืืขื ืืช ืืคืืชืจืื ืืืืจืื ืืืืื. ืื ื ืจืืืช ืกืืืื ืืืืืืื ืฉืืื:
import {
check,
index,
integer,
jsonb,
pgTable,
real,
text,
timestamp,
varchar,
} from "drizzle-orm/pg-core";
import { MyDataPart, MyUIMessage, MyProviderMetadata } from "../message-type";
import { generateId, ToolUIPart } from "ai";
import { sql } from "drizzle-orm";
import {
getLocationInput,
getLocationOutput,
getWeatherInformationInput,
getWeatherInformationOutput,
} from "@/ai/tools";
export const chats = pgTable("chats", {
id: varchar()
.primaryKey()
.$defaultFn(() => generateId()),
});
export const messages = pgTable(1 419
ืืืื ื ืืืืืื ืจ: ืืืื ื ืืชืื ืฉืจืช MCP
ืืขืืืื ืขื AI ืื ืขื ืฉืืืื ืขืืืจ ื AI ืืืฆืืจ ืงืื ืืื ืืืชืจ ืืื ืืืืืืช ืืืคืขืื "ืืืื" - ืืืืืจ ืืืงืฉ ืืกืืืืช ืืคืืชืื ืืขืฉืืช ืืฉืื, ืืงืื ืืช ืืชืืฆืื ืืืืืฉืื ืืืฆืืจ ืืงืกื ืืคื ืืชืืฆืื ืฉืืชืงืืื. ืกืืืืืช ืคืืชืื ืืฉืืืืืช AI ืืืืขืืช ืืืชืืืจ ืืืืื ืืืฆืื ืืื ืืจื ืืจืืืืงืืืจื ืฉื ืงืจืืช MCP, ืงืืฆืืจ ืฉื Model Context Protocol.
ืื ืืชื ืขืืืืื ืืกืืืืช ืคืืชืื ืืฉืืืืช AI ืืืชื ืกืืชื ืืืฆื ืกืืื ืฉื ืืกืืืื ืืืจ ืจืืืชื ืขืืืื ืขื ืืืื - ืื ืืกืืื ืฉืืืงืฉ ืืงืื ืชืืื ืฉื ืงืืืฅ, ืืืจืืฅ ืคืงืืื ืืฉืืจืช ืืคืงืืื ืื ืืคืืื ืืืชืืืจ ืืืกืืก ืื ืชืื ืื, ืืืืืืื ืื ืืืื ืืจื ื. ืืืง ืืืืืื ืืืืขื ืืืื ืื ืืกืืืื, ืืช ืืืงื ืืืื ืืชืงื ืชื ืืขืฆืืื ืืจื ืืืื ืืจื ื. ืืืืืช ืฉืืืื ืงื ืื ืืืชืื ืืืื ืืืื ืืขืฆืืื.
ืืืจ (ื 31.7) ืืขืฉืจ ืืืืงืจ ืืจืื ืืื ืืฉืืืช ืืื ืคืชืืื ืืื ืืืชืื ืฉืจืช MCP ืืืืขืืืช ืืืชื ืืืื ืืจื ื ืืชืฉืชืืช ืฉื Cloudflare Worker. ืื ืื ื ื ืจืื:
1. ืืื ืืคืชืื ืคืจืืืงื MCP Server ืืืฉ ืืืืืคืกืงืจืืคื.
2. ื ืืืจ ืืช ืืืื ื ืฉื ืฉืจืช MCP ืฉืืืืข ืืขืืื ืขื ืงืืืืืคืืืืจ ืืจื ืกืคืจืืืช ืืกืืื ืื ืฉืืื.
3. ื ืืืจ ืืช ืฉืจืช ื MCP ืืืืกืื KV ืืงืืืืืคืืืืจ ืื ืจืื ืื ืืืืื ืืื ืกืืืื ืฉื ืืฉืจืช ืืืื ืืืืข ืงืืืข ืฉื ืฉืืจ.
4. ื ืืืจ ืขื ืืืชื ืืืงืฆืื ืื ืืื ืืื ืขืืื ื ืืืื ืืืฉื ืืฉืจืช ืขื OAuth.
ืืจืืื ืืืคืืฉืื ืืื ืชืืื ืฉืืื ืคืชืืื ืขื ืืืื ืืงืื ืืฉืืืืช ืืืืจืืช ืฉืืื. ืื ืชืืื ืืงืืื ืืื ืื ืืชื ืื ืืกืคืืงืื ืืืืืข ืชืืชืื ืื ืื ืืจืื ืฉืืืืจ ืืืืจ.
ืื ืืชื ืืงืืืฆื ืื ืืฉ ืืื ืืืจ ืืช ืืืื ืง ืืืื ืืืืคืืฉืื ืืงืืืืื, ืืื ืขืืืื ืื ื ืื ืกืชื ืื ืฆืจืื ืจืง ืืืืื ืืช ืืืืื ืืชืืื ืืขืืื ืืื:
https://tocode.ravpage.co.il/tocodeai
ืืืชื ืืงืืืื ืืช ืืืื ืง ืืืื ืืฉืจ ืืืืื ืืื ืื ืืืื ืืช ืืืคืืฉืื ืืืืื ืื ืืฉืื AI.
ื ืชืจืื ืืืื.
1 419
ืคืขืจื ืฉืคื
ืืฉืื ืื ืืืฆืจ ืื ืื ืื ืืืืงืืช ืืืชื ืืืกืื ืืืืงื "ื ืื ืกืื ืืชืืืช ืืืืจ ื ืื ืก ืืืืืืืื ืฉืืคืฉืจ ืืจืืืช ืืช ืื ืืืืืขืืช" ืื ืืืื ืืชืืจ ืื ืฉืื ืืื ืขืืฉื ืืื ืื ืื ืขืืืจ ืืืชืื ืืืืงื ืืืืืืืืช.
ืืืฉืืืืง ืืืืืืฆืื ืืืชื ืืืกืื ืืืืงื ืืช ืืฉืืืื ืืืคืืจืืื ืืืชืจ ืฉื ืืืืืงื ืื ืขืืืจ ืืืืฉ ืืื ืืจืื ืืืชืจ ืงืฉื ืืงืจืื ืืืจ ืจืฆืฃ ืฉื ืืืืงืืช ืืืืืื ืื ืืืงื ื ืืื ืื.
ืืคื ื ืฉื ืืืฉืื ืืืชืื ืืกืื ืืื ื ืืืื ืืืืื ืฉืื ืื ื ืืืื ืื - ืื ืื ืื ื ืืืชืืื, ืืื ืื ืื ื ืืืชืืื ืืืืืื ืืืจื. ืืื AI ืืืื ืืืื ืืขืืืจ ืืขืืืจ ืืื ืืฉืคืืช ืืื ืื ืืขืืจ ืืื ืืืจืฉ ืืจืื ืืฉืืืืช ืฉื ืงืื ืืงืกื ืืืืื ืืืืืช ืขืจื ืืื ืืื-ืืืืงืื.
1 419
ืื ื ืืชืื ืชืช ืคืจืื ื-ืื ื ืืคืืืืช ืฉ AI ืืืงื ืื ืืช ืืขืืืื
ืืชืื ืชืช ืคืจืื ื ืื ื ืืชืื ืืจืืื-
> ืืชืืืชื ืืืฉืชืืฉ ืืืื AI ืืงืืืื ืืื ืืืืจืฃ. ืื ื ืื ืืืืขืช ืืืคื ืืืชืืื. ืื ื ืืืืื ืฉืืงืจืื ืืขืืืื ืฉืื ืชืืื ืืืืชืจืช.
ืกืืืื ืืชืืืืืช ืฉื ืืื ืฉืื ืื ืฆืจืื ืืืคืชืืข ืืฃ ืืื ืืืืชื ื ืืืฉืื ืืืฉืืืจ ืืืชื ืืจืืฉ ืืืืืฉืืจ ืืคืืงืกืื ืืขืืืื ืขื ืืืื ืืื:
1. ืืฉืงืืขื ืืืืืื ื Basics: ืชืืืื ืืจืืืืงืืืจื, ืชืืืื ืืื ืืืืงืื ืืฉืื ืื ืฉื ืืืขืจืืช ืขืืืืื ืืื, ืชืืืื ืื ืื ืงืื ื ืงื ืืืื ื ืจืื ืงืื ืฉืงืฉื ืืชืืืง. ืืืื ืืื ืืืชืื ืืืขืจืื ืงืื ืืฆืืจื ืฉื ืืชื ืช ืืชืืืืงื ืืืืจื ืืื.
2. ื AI ืืฉ ื ืืืื ืืืชืื ืคืืชืจืื ืืช ืฉืขืืืืื ืืืืฆืขืืช ืฉืืคืื ืชืื ืืืช ืืืืจืืช. ืจืื ืืืื ืืคืืชืจืื ืืช ืืืื ืืืืื ืืื ืื ืื ืืชืืืืื ื Use Case. ืืืื ืืืืืช ืคืืชืจืื ืืช ืืืืื ืืื ืืืืื ืืืืจืืฉ ืืช ืืคืืชืจืื ืืช ืื ืืื ืื. ืฉืืื ืื ืฉ AI ืืืชื ืืืื useEffect ืื ืืฉืื ืฆืจืื ืืื ืืืืข ืืืืง ืคืืชืจืื ืืงืืืคืื ื ืืืช. ืืชืืงืื ืืืืืื ืืืืช ืืื.
3. ืื, AI ืืื ืื "ืืื ืืจืืืช ืืืจืืช" ืืื ืืื ืืืชืืจ ืืช ืืืื ืื ืืืช. ืื ืฉืจืง ืจืืฆื ืืืื ืืขืืืื ืืื ืืืืืืง ืืืงื ืงืื ืืืืื ืืจื ื ืืฆืืจื ืืืฆืื ืขืืืื ืืืจืช.
ืืืื ืฉืื ืืืื. ืืืื ืืฉืจืืช ืฉืืืกืืจื ืืืืจืืช ืฉืืืคืชืื. ืืื ืืงืจื ืืืจ. ืืื ืฉ AI ืืืชืื ืืืชืจ ืงืื ืื ื ืฆืืจื ืืืชืจ ืืคืชืืื ืืจืื ืืืืื ืฉืืืืื ืืขืจืื ืืช ืืงืื ืฉื ืืฆืจ, ืืกืืจ ืืืชื ืืืงืื ืืืืฆืืจ ืืื ืื ืืืืื ืืืชืจ.
1 419
ืืื ืจืขืืื ืืช ืืืชืจ ืืืืื ืืืฉืืืช ืืืืื ืืื ืืืืื
ืืืฆืจื ืงืจืกืจ ืกืืคืจื ืืจืืืื ืฉืืื ืืื ืืฉืื ืืืฉืงืืข ืืืฉืืืช ืงืื ืืืืืืืืช ืขื ืืื ืืืืจืืื ืืช ืืคืืฆ'ืจ ืืขืืจ ืืจืง ืืฉืืืช ืงืื. ืืงืจืกืจ ืืืื ืื ืงืืคืฅ ืืืงืื ืืื ืฉืชืจืฆื ืืขืจืื, ืืฉื ื ืงืื ืืฉื ืื ืืืืง ืงืื. ืืืืขืื ืฉืืื ืืื ืฉืชืื ืืช ืืขืจื ืืขื ื ืงืืืืช ืืืืื (ืืฉืืื) ืืืจืื ืืืฉื ืืืืืืื ืืืืชื ืืืืื.
ืืืฉ ืืื ืื ืืขื.
ืืืื ืืฉืื ื ืืืชื ืงืื ืขื LLM ืื ื ืจืืื ืืช ืืชืืคืขื ืืื ืืืืจืืจ: ื LLM ืืฆืืื ืืื ืืช ืคืืฆ'ืจืื ืืืจ ืืฉืืชืฉืชืืช ืื ืืื ืืคืืฆ'ืจ ืืืืฉ, ืืื ืืื ืื ืืืื ืืฉืื ืื ืืืืืืื ืืืืืืช ืืฆืืจืชืืืช ืืืื ืืงืื, ืืืืืืช ืฉืืืคืฉืจื ืื ืืื ืืช ืืช ืืกื ืืื ืฉื ืืคืืฆ'ืจืื.
ืืืืจื ืืืื - ืื ืืฉืืืช ืืงืื ืขื ืืื ืืฉืืงืช ืืฉืืง ืืื, ืืืืื ืืฉ ืื ืืขื ื ืงืืืืช ืืฉืืื ืืืจืื ืืชืืื ืืืืืืืืช ืฉื ืงืื, ืื ืื ื ืื ืืืืขืื ืืฆืืจื ืืืืืืืืช ืืชื ืฆืจืื ืืืฉืื ืืืชื ืฆืจืื ืืจืืฅ ืืืืืืืืช ืื ื ืจืืฅ ืชืืื ืืืืืืืืช ืืื ืฆืจืื ืืืฉืื ืืชื ืืืจืื ืืืืืฅ ืขื ืืืืืื (ืืืงืจื ืฉื ืืื ืื ืืคืชืืจ Escape), ืืืฉืื ืืืืชืื ืงืื ืืืจ. ืืคืชืืื ืจืืื ืืจืืืฉืื ืฉืื ืื ืื ืื ืขืืืจ ืืื ืืืืื: ืื ืขืฉื ืืช ืืืฉืืื ืืื ืขืืฉืื ืื ืืืืืื ืืื ืืจืื ืืกืื ืืงืก ืืฆืคืืื ืืงืื ืฉื ืืชื ืืืืืืืืช ืืืืื ืืขืืืจ ืืงืื ืจืขืืื ืืช ืืืืืืฉืื. ืืืขืื ืฉืื ื ืืื ืื ืืืืื ืืืืืื ืืืืืื ืืจื ืฆืคืืื ืืืืจืื. ืื ืื ืืฉ ืืืจืืช ืืขื ืืื ืืช ืฉื ืจืืืื ืืฆืคืื ืืงืื ืฉื ืืชื, ืืจืื ืืืฉืื ืืืจ.
ืืืงืื ืืฆืคืืช ืืงืจืกืจ ืื ืงืืคืืืืื ืืืชื ืงืื ืื ื ืืื ืืืจืื ืฉืชืืืื ืื ืกืืช ืืืืชืจ ืืขืืจื ืืื ืืืชืงืื ืืคืืชืื:
1. ืืืืจ ืขื AI ืืืืื ืืื, ืืืชืื ืืื ืืืืื ืืืจ - ืื ืืื ืชืืืืฃ ืืืงืืื. ืืื ืืก, ืืืจื ืฉืืคืืฆ'ืจ ืขืืื ืฉืืืจืื ืืช ืืงืื ืืขื ืฃ ืืืจ ืืืื, ืืืืจืื ืืขื ืฃ ืืืงืืจื ืืืงืืืืื ืืืคืก ืืช ืืคืืชืจืื.
2. ืืชืช ื AI ืืืชืื ืืช ืืงืื ืืจื Agent Mode ืืืืื ืืฆื ืืื ืืขืืืจ ืขื ืืงืื ืืืฉืืื ืขืืื ืฉืืืืช. ืืืืืื ืืืืฅ ืืืชื ื ืืืืื ืืืืฉืื ืืืชืจ ืืืฉืจ ืฆืคืืื ืืืืฉืื ืืืจ ืขืืฉื.
3. ืืชืช ื AI ืืืชืื ืืช ืืงืื ืืืืืืืง ืืช ืืชืืฆืื ืืืืื ืฉืืื ื ืคืจื ืืืคืืคื, ืืฉื ืืืงืฉ ืืกืืจ ืขื ืืงืื ืฉื ืืชื ืืชืจืืืืื ืฉืืขืืจื ืืื ืืืืื ืืืชื ืืื ืืืชืจ.
4. ืืืชืื ืชืืขืื ืืคื ื ืฉื AI ืืงืืื ืืืชืช ื AI ืืืืฉ. ืฉืืงื ืขื ืืืจืกืืืช ืฉืื ืืช ืฉื ืืชืืขืื ืืชืจืื ืืืืืฉืื ืฉืื ืื ืฉื AI.
5. ืืืกืชืื ืขื ืืืืืฉ ืกืคืฆืืคื ืืืืชืื ืื ืชืืขืื, ืืืจื ืื ืืืืืืง ืืช ืืชืืขืื ืฉืืชืืชื ืืืืืืืฉ ืืืืื ืฉืืื ื ืคืจื ืืืืงืฉ ืคืืืืง.
6. ืืชืช ื AI ืืืืฉ ืืืืขืชืืง ืืืื ื ืืงืื ืื ืคืขื ืคืื ืงืฆืื ืื ืืืืง ืงืฆืจ ืืคืืื ื Copy/Paste. ืืงืจืื, ืืืืื ืฉืืื ืชื ืืืชืช Code Review ื AI ืขื ืื ืืืืง ืืื.
ืื ืื ื ืืืื ืฉืื ืืืช ืืืืฆืขืืช ืฉืื ืืื ืืืงืืช ืืืชืจ ืืื ืืืืชืืื ื ื AI ืืืชื ืงืื ืชืื ืืื ืืืืฆืืช ืขื Tab. ืืื ืืกืืจ - ืื ืื ื AI ืขืืืจ ืืืชืื ืงืื ืืืจ ืืืชืจ, ืืื ืื ืืื ืืขืืืจ ืื ื ืืืืื ืืืจ ืืืชืจ.
1 419
ืืืค ืจืืื: ืืืืื ืืืื ืืงืกืื ืืืืจืืืช
ืืจืืื ืืื ืืขืื ืืืคืจืื ืืืจืืืช ืืืืืื ืขื ืืืชื ืคืงืืืช split ืฉืื ืื ื ืืืืจืื ืื ืืฉืคืืช ืืืจืืช:
3.3.5 :027 > "hello world".split
=> ["hello", "world"]
ืืื ืืฉืืืฆืืื ืืขืืื ืืืืืืืืช ืืงืื ืืช ืืงืื ืืื ืืชืืื ืืืืื. ืื ื ืขืื ื ืืกืืื ืขื ืืฉืคื ืืืชืจ ืืืชืืจ:
3.3.5 :029 > "Don't. go. there".split
=> ["Don't.", "go.", "there"]
ืฉืืื ืขืืื ืืจืื ืืืชืจ ืืื ืืื ืื ืงืืืืช ืฉืฆืืืืืช ืืืืืื. ืืจื ืืืช ืืกืืจ ืืช ืื ืืื ืืืคืฉ "ืืชืืืืช" ืืืงืื "ืืคืจืืืช" ืืืฉืืื ืื ืืฉ ืื ื ืืช scan:
3.3.5 :032 > "Don't. go. there".scan(/\p{L}+(?:'\p{L}+)*/u)
=> ["Don't", "go", "there"]
ื scan ืื ื ื ืืชื ืืืืื ืจืืืืืจื, ืืืงืจื ืฉืื ื ืืืืื ืจืืืืืจื ืฉืืืคืฉ ืืืชืืืช, ืืืจื ืื ืืืื ืืจืฉ (ืืืื ืืืืื ืืื Don't) ืืื ืขืื ืืืชืืืช. ืื ืขืืืจ ืืื ืืงืื ืจืง ืืช ืืืืื, ืืื ืขืืฉืื ืื ืื ืื ืื ื ืจืืฆืื ืื ืืช ืืืื ืืงืก ืฉื ืื ืืืคืข? ืื ืืคืฉืจ ืคืฉืื ืืืคืฉ ืืช ืืืื ืืงืก ืืืจื ืฉืืืจ ืืฆืื ื ืืช ืืืชืืื ืื ืืคืขืืื ืืฉ ืืืืื ืืคืืืืช:
3.3.5 :036 > text = "Don't means Don't - Don't press the button"
=> "Don't means Don't - Don't press the button"
3.3.5 :037 > third_word = text.scan(/\p{L}+(?:'\p{L}+)*/u)[2]
=> "Don't"
3.3.5 :038 > index_of_third_word = text.index(third_word)
=> 0
ืื ืืืืืจ 0 ืื ืืืืื ืืฉืืืฉืืช ืืื ืืืืื ืืจืืฉืื ื.
ืืจื ืืืช ืฉืขืืื ืื ืืื ืืคืชืืจ ืืช ืื ืืจืืื ืืื ืืืฆืืจ Enumerator ืฉื ืืืชืืืืช ืืืืืื ืืจืืืืืจื. ืืื ืืชืืื ื ืืื ืืงืื ืืช ืืืงืกื ืืื ืืช ืืื ืืงืก ืืืชืืื ืฉืื, ืืืืื ืฉืื ืื ื ืืจืืื ืืคืฉืจ ืืืืกืืฃ ืืช ืื ืืืืืงื String ืืื ืฉืืคืฉืจ ืืืื ืืงืจืื ืืงืื ืขื ืื ืืืจืืืช. ืื ื ืืงืื:
3.3.5 :039 > class String
3.3.5 :040 > def tokenize
3.3.5 :041 > regex = Regexp.new(/\p{L}+(?:'\p{L}+)*/u)
3.3.5 :042 >
3.3.5 :043 > Enumerator.new do |y|
3.3.5 :044 > pos = 0
3.3.5 :045 > while m = regex.match(self, pos)
3.3.5 :046 > y << m
3.3.5 :047 > pos = m.end(0)
3.3.5 :048 > end
3.3.5 :049 > end
3.3.5 :050 > end
3.3.5 :051 > end
3.3.5 :056 > text.tokenize.to_a
=>
[#<MatchData "Don't">,
#<MatchData "means">,
#<MatchData "Don't">,
#<MatchData "Don't">,
#<MatchData "press">,
#<MatchData "the">,
#<MatchData "button">]
ืขืืฉืื ืืฉืืื ืืงืื ืืช ืื ืืืืืื ืืืื ืืงืก ืืืชืืื ืฉื ืื ืืืื ืื ื ืืืชื:
3.3.5 :057 > text.tokenize.map { |m| [m.to_s, m.begin(0)] }
=> [["Don't", 0], ["means", 6], ["Don't", 12], ["Don't", 20], ["press", 26], ["the", 32], ["button", 36]]
ืืืฉืืื ืืงืื ืืช ืืื ืืงืก ืืืชืืื ืฉื ืืืืื ืืฉืืืฉืืช ืื ื ืืืชื:
3.3.5 :060 > text.tokenize.drop(2).first.begin(0)
=> 121 419
ืืื ืงืืื ืืืืืจ ืื PR ืฉื 700 ืฉืืจืืช?
ืืฉ ืชืืงืื ื ืืืืื ืฉืืืจืฉืื ืฉืืืขืืช ืฉื ืืืงืจ ืขื ืฉืื ืื ื ืืืฆืืื ืืช ืืคืกืืง ืืื ืฉืฆืจืื ืืืืกืืฃ ืืคืืชืจ ืืช ืื ืืืขืื.
ืืืฉ ืืืืื ืฉืืืงื ืฉืืืขืืช ืืชืงื ืื ืืชืืงืื ืืืจืฉ ืืฉืืื ืืืืฉ ืขื ืืืื ื ืืืกืืกื ืฉื ืืืขืจืืช.
ืืฉ ืคืืฆ'ืจืื ืฉืืืื ืงื ืืืชืื ืืืืืืง, ืืืืจืื ืฉื ืฆืืจื ืืขืืื ืงืฉื ืืฉืืื ืืืืื ืื ืื ืขืืืืื ืืื ืืืฆืืื.
ืืฉ ืืขืจืืืช ืฉืืืืืืช ืืืื ืืืืข ืฉื ืืงืืืืช ืืื ืฉืื ืื ื DB ืฆืจืื ืืขืฉืืช ืืคืื ืฆืื, ืืืฉ ืกืืืจืืืคืื ืฉืขืืืื ืืื ืืื ืืงืืืืช ืืืื ืฉืื ืืขืื ืืฉืืืจ ืืช ืื ื DB ืืืื ืืช ืืืืฉ.
ืชืืงืื ืืขืืืช ืืืฆืืขืื ืื ืื ืืืงืจ ืขื ืืืืขืช ืืื ืืืืืื ืืืฉื ืืื ืื ืืชืืืช ืืชืจ ืืชืงื ื ืืืฉืืช.
ืคืืชืื ืชืืื ื ืื ืขืืืื ืฉืืืจืืืช ืืืืื ืกืืืื ืฉื ืืฉืืืืช ืืจืืืช ืงืืฉื ืฉืื ืืช. ืืืื ืืืืืช ืฉืืขืชืื ืืืื AI ืฉืืืื ืืคืชืืจ ืืช ืื ืืืขืืืช ืืืื ืืื ืืื ืชืืื ืื ืื ื ืื ืฉื. ืืฉืืืฉืื ืืืืจ ืฉืืื ื ืืชื ืืงืืื ืืืชืื 100% ืืงืื ืืืขืจืืช ืื ืืชืืจ Flow ืืกืืื ืืขืืืื ืขื AI ืฉ"ืชืืื ืขืืื" ืื ื ืืืงื ืฆืขื ืืืืจื.
ืืฉ AI ืืกืืื ืืืชืื ืืช ืืงืื ืฉืื ื ืจืืฆื ืื ื ืฉืื ืืฉืื ืืช ืืงืื ืืคืจืืืงื. ืืฉ AI ืื ืืฆืืื ืืืชืื ืืช ืืงืื ืฉืื ื ืจืืฆื ืื ืืคืืื ืื ื ืขืื ืื ืืืืข ืื ืื ื ืจืืฆื ืื ื ืฉืื ืืจืืืช ืืื ืืืจืกืืืช ืืืกืืฃ ืืืืืจ ืืื ืื ืืืชืื ืืฉืื ืืืจ ืืขืฆืื. ืืฉ AI ืขืืืจ ืื ืืืฆืื ืืื ืื ื ืฉืื ืืืืืืข ืืช ืืชืืงืื ืฉืื, ืืืฉ AI ืื ืืฆืืื ืืคืชืืจ ืืช ืืืื ืื ื ืื ืืืงื ืืื ืืืชืงื ืืขืฆืื. ืืืฉ AI ืืชืขืงืฉ ืืืชืื ืคืืชืจืื ืฉื 700 ืฉืืจืืช ืฉืื ื ืื ืืืื ืืืืื ืืืขืื ืื ื ืืืืจ ืื ืชืืื ืืืืื ืืืืืง ืืช ืืืขืื.
ืืืืจื ืืื ืื ืืชืช ืืงืืื ืืืชืื 100% ืืืงืื. ืืืืจื ืืื ืืืฉืชืืฉ ืืงืืื ืืื ืืืชืงืื ืืืจ ืืืชืจ ืืืื ืืช ืืขืจืืืช ืืฆืืืืช ืืืชืจ, ืืคืืช ืืืชืจ ืืืืืืช ืืืชืจ.
1 419
ืืืคืฉ ืืช ื"ื ืืื"
ืืื ืืืชืจืื ืืช ืฉื ืืคืชืืื ืื ืืกืื ืฉืืชืืืืื ืืขืืื ืขื AI ืืื ืืืืืืช ืืืืืื ืืื ืงืืืืืืก "ื ืืื" ืืงืืืืืืก ืืกืืจืื. ืืจืกื ื ืืืื ืกืืคืง ืืืืื ืืืืืช ืืืื ื ืืคืืกื ืฉืคืจืกื ืขื ืคืืชืื ืืคืืืงืฆืืืช Cross Platform ืขื React Native.
ืืจืกื ืืืืข ืืคืจืืืงื ืืื ืืืืืจ React Native ืืื ืขื ื ืืกืืื ืฉื ืืขืฉืจ ืฉื ืื ืืคืืชืื ืชืืื ื. ืืื ืืชืืื ืขื Vibe Coding, ื ืชื ื AI ืืื ืืช ืืื, ืืื ื ืื ืก ืืืกืชืื ืขื ืืงืื, ืืืื ืฉืืฉ ืคื ืืขืื ืืืื ืฉืืื ืืชืืจ ืืช ืื "ืืื ืขื ื AI ืืืฆืขื ื ืจืืคืงืืืจ ืืื ืคืืฆ'ืจ ืืืืฉืื ืขื ืฉืืงืื ืืืื ื ืงื". ืืชืืืื ืขืฆืื ืืื ืืืืื ืชื ืืื ืฆืคืืื ืืกืจื - ืืื ืฉืืื ืืช ื AI ืฉืืืืช ืื AI ืืืื ืืืชื ืจืืืงื ื React Native, ืชืื ืืื ืฉืืื ืืกืืืจ ืื ืคืืฆ'ืจ ืืืขืจืืช ืืืจื ืืฉืืืืช ืฉื ืืจืกื ืื ืืืฆืข ืืช ืืจืืคืงืืืจืื ื ืืืืจืกื ืืืชืจ ืคืฉืืื.
ืืืืืืช ืืจืืืช ืขืืืื ืืืืืื ืืืจ ืืืื ืื ืืืืืืช ืฉืื ืืืืคื ืืคืฉืจ ืืฉืคืจ ืชืืื ืืืชื ืืฉืืื, ืืื ืขืืฉืื ืืื ืืฉืืขืืชืืช ืืืชืจ ืืชืืืืช. ืืื ืืืคืฉืจืช ืื ืจืง ืืงืื ืื ืืืืืช ืงืื AI, ืืื ืื ืืืจืืฉ ืื AI ืฉืืคืืจืื ืกืคืฆืืคืืื ืืื ืืงืื ืืืื ืืืคื ืืื ืืืชืจ.
ืืื ืืื ืืื ื ืืื ืืืฉืชืืฉ ื AI ืืื ืืืืื ืื AI ืืืจ ืื ืืืืืื ืืื ืืื ืืืชื ืืืชืื ืงืื ืืื ืืืชืจ? ืื ื ืื ืืืืข. ืืื ืชืืื ืื ืขืื ืืฉืื ืฉืฉืืื ืื ื ืืืชืืงืฆืข ืื. ืืื ืฉื Feedback Loop ืฉื ืืชืืืช ืงืื ืืชืงืฆืจ ืื ืื ืื ื ืืืืืื ืื ืกืืช ืขืื ืคืจืืืคืืื ืืขืื Refactor-ืื ืขื ืฉื ืืืข ืืืืชื ืงืื ืฉืืืฃ ืืขืืื ืขืืื.
(ื .ื. ืืืชื ืจืขืืื ื ืืื ืื ืืืืฅ ืืขืืื ืืงืื - ืื ืฉืื ืฉืื ืืกืื ืืืืคืืฉ ืขืืืื ืืืืขืื ืืชื ืืืคืืฉ ืขืืืื "ืื ืืจืืืฉ ื ืืื" ืืฆืจืื ืืฉื ืืช ืืฉืื; ืื ืฉืื ืฉืื ืืกืื ืืคืชืืืช ืขืกืงืื ืืืืขืื ืืชื ืขืกืง "ืื ืืจืืืฉ ื ืืื" ืืฆืจืื ืืฉื ืืช ืืืืื; ืื ืฉืื ืฉืื ืืกืื ืืฉืืืืง ืืืขื ืืืืื ืืชื ืงืืคืืื ืฉืืืืงื ืื ืขืืื ืืฆืจืื ืืฉื ืืช. ืืื ืืืงืจืื ืื ืื ื ืืืืจืื ืขื ืชืืืืืื ืฉืืืจืฉืื ืืชืืื ืืืืืื ืื ืืื. ืืฉืฆืจืื ืืฉื ืืช ืืืืื ืื ืื ื ืืจืืืืืื ืืื ืฉืืฉื ืื ืืืืื ืืืชืจ ืืืงืื, ืืืฉืฆืจืื ืืืชืืื ืื ืื ื ืืจืืืืืื ืืื ืฉื ืชืืื ืขื ืืืฉืืช ืืชืืฆืื).
1 419
ืชืฉืืืช ืื - ืืืืืื ืืช ืฉื ืืขืฉืืจ ืืื
ืืืจื ื ืชื ื ื AI ืืืชืื ืคืืฆ'ืจ ืฉืืืืง ืจืืืืื ืืืชืืื ืื ืกืืฃ ืฉื ืฉื ืืคื ื ืฉืืืจื. ื AI ืืชื ืืช ืืงืื ืืื ืืชื ืื ืืช ืืืืืงื ืืืื:
test 'Person name with only spaces is trimmed to empty' do
b = Person.new(name: ' ')
b.save
assert_equal('', b.name)
end
ืืืืืงื ืขืืจื ืืื ื ืงืืืืชื ืืช ื PR. ืืืขืื ืืืืืื? ืืืขืจืืช ืืฉ ืืืืืืฆืื ืฉืืืืืืช ืฉ name ืื ืืืื ืืืืืช ืจืืง.
ืืงืจืืื ืฉื ืื ืืจืืจ ืื ืงืืจื ืคื - ืคืงืืืช save ืฉื ืจืืืืก ืืืืืจื ืขืจื ืืืืืื ื ืื ืืฉืืืจื ืืฆืืืื ืื ื ืืฉืื. ืืฃ ืืื ืื ืืกืชืื ืขื ืขืจื ืื ืืืขืฆื ื AI ืืคืขืื save ืจืง ืืฉืืื ืืืืจืื ืืช ืืงืื ืฉืื ืฉืืืืง ืจืืืืื ืืื ืืื ืืืืื ืฉืืจืืื ื ืืืง. ืืื ืขืืฉืื ืืฉืืจื ื ืืงืื ืืืงืฉ. ืื ืืขืชืื AI ืื ืื ืืื ืืืชืงื ืืืืืงื ืืืืช ืื ืขืืืืื ืืืฉืื ืฉืืืืืื ืืืืืช ืืืืืงืื Person ืขื ืฉืืืช ืจืืงืื.
ืืฉ ืื ืืขื ืืคืชืื AI ืฉืืชื ื ื AI ืืกืืจ ืืช ืื. ืื ื ืืืื ืฉืื ื ืื ืืื ืืื ืืืืงืจืื ืืืื ืื ื ื ืื ืก ืืงืื ืืืชืงื ืืื ืืช ืืช ืืฉืืจื ืืืืฆืขืืช:
test 'Person name with only spaces is trimmed to empty' do
b = Person.new(name: ' ')
b.valid? # trigger validation to trim b.name
assert_equal('', b.name)
end
ืืื ืืงืจื ืืขืื ืื ืื ืืืืคื ืืคืืชืื ืืขืืจืช AI - ืืฉืืืจืื ืขืืืืื ืื ื ืืืื ืืืชืืงื ืืืื ืืฉืืืจ ืขื ืืงืื ื ืงื ืื ืืช ืขืืืืช ืืืงืืื ืขืืฉื ื AI.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
