ИИ-агент для 1С на Python и FastAPI: микросервис + LLM
ИИ-агент для 1С на Python и FastAPI: микросервис + LLM
Видео: ИИ-агент для 1С на Python и FastAPI: микросервис + LLM

ИИ-агент для 1С: микросервис на Python и FastAPI

Привет, программисты 1С! Разберём практическую схему подключения большой языковой модели (LLM) к учётной системе 1С, не трогая при этом конфигурацию 1С глубже необходимого. Задача типовая: 1С не умеет напрямую стучаться в облачные API нейросетей, зато отлично умеет ходить по HTTP. Поэтому весь ИИ-агент выносится в отдельный микросервис на Python, а 1С обращается к нему обычным HTTP-запросом — так же, как к любому стороннему REST-сервису.

В статье соберём микросервис на Python с помощью FastAPI, который отправляет запросы к LLM (в примерах — ChatGPT/OpenAI API, но принцип такой же для любой OpenAI-совместимой модели), и обработку в 1С, которая обменивается данными с этим микросервисом. Заодно разберём, почему для интеграции с 1С обычного текстового ответа модели недостаточно — и как получить от неё предсказуемый структурированный ответ через structured output и function calling.

Скачать исходники

Курс «Применение искусственного интеллекта ChatGPT для 1С» — если нужна не разовая интеграция, а системный разбор: ИИ-агенты, RAG и MCP-серверы для 1С на практике.

Микросервис на Python и FastAPI с обращением к LLM

Обновляем PIP

python.exe -m pip install --upgrade pip

Создаём .env файл для хранения ключа 
Прописываем токен, который получили в консоли OpenAI

OPENAI_API_KEY=

Для работы с env установим библиотеку django-environ

pip install django-environ

Устанавливаем актуальный клиент OpenAI

pip install openai

Для работы с HTTP запросами устанавливаем FastAPI

pip install fastapi

Устанавливаем uvicorn – асинхронный web сервер

pip install uvicorn

Создаём скрипт main.py. Обратите внимание: старый синтаксис openai.ChatCompletion.create(...) из библиотеки версии 0.x больше не работает — актуальный клиент создаётся через OpenAI() и вызывается как client.chat.completions.create(...)


# Импортируем необходимые библиотеки
import environ
from fastapi import FastAPI
from pydantic import BaseModel
from openai import OpenAI

env = environ.Env()
environ.Env.read_env()  # читаем переменные из .env

app = FastAPI()
client = OpenAI(api_key=env('OPENAI_API_KEY'))  # актуальный клиент OpenAI (SDK 1.x/2.x)

MODEL = "gpt-5.4-mini"  # проверьте актуальный список моделей в консоли OpenAI


def chat_with_llm(system: str, question: str) -> str:
    result = client.chat.completions.create(
        model=MODEL,
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": question},
        ],
        temperature=0.5,
    )
    return result.choices[0].message.content


class ChatData(BaseModel):
    system: str
    question: str


@app.post('/chatgpt', status_code=200)
async def process_data(payload: ChatData):
    # Получаем данные и проводим их валидацию
    data = payload.model_dump()
    print(data)
    # Выполняем запрос к LLM
    response = chat_with_llm(data["system"], data["question"])
    # Возвращаем обратно результат запроса
    return {'gpt_response': response}

Запускаем сервер и тестируем отправку запросов

uvicorn main:app --reload

Останавливаем сервер и создаём requirements.txt

pip freeze > requirements.txt

Установку всех пакетов из этого файла можно произвести командой

pip install -r requirements.txt

Structured output: делаем ответ ИИ-агента предсказуемым для 1С

Свободный текст от модели — плохой формат для интеграции: 1С придётся разбирать ответ регулярками и гадать, что модель имела в виду. Правильнее заранее описать схему ответа Pydantic-моделью и передать её в response_format — клиент OpenAI сам провалидирует и распарсит ответ модели под эту схему через метод .parse().


from pydantic import BaseModel


class Answer(BaseModel):
    reply: str          # текст ответа для клиента/менеджера
    needs_human: bool    # True, если модель не уверена и нужна проверка человеком


def chat_with_llm_structured(system: str, question: str) -> Answer:
    completion = client.chat.completions.parse(
        model=MODEL,
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": question},
        ],
        response_format=Answer,
        temperature=0.3,
    )
    message = completion.choices[0].message
    if message.refusal:
        raise ValueError(message.refusal)
    return message.parsed

В обработчике эндпоинта достаточно вернуть response.model_dump() — 1С получит гарантированно валидный JSON с полями reply и needs_human, а не произвольный текст.

Function calling: агент сам запрашивает данные 1С

Следующий уровень интеграции — не просто ответить текстом, а дать модели возможность самой запросить данные из 1С (остаток товара, статус заказа, курс валюты) через function calling. Модель решает, когда ей не хватает контекста, и просит вызвать конкретную функцию с конкретными аргументами, а код микросервиса уже сам обращается к 1С (например, через OData) и возвращает результат обратно в диалог.


import json
import openai
from pydantic import BaseModel


class GetStockLevel(BaseModel):
    """Запросить остаток товара в 1С по артикулу"""
    sku: str


tools = [openai.pydantic_function_tool(GetStockLevel)]

messages = [
    {"role": "system", "content": "Ты помощник менеджера, при вопросах об остатках вызывай функцию."},
    {"role": "user", "content": "Есть ли в наличии товар с артикулом A-1025?"},
]

completion = client.chat.completions.create(model=MODEL, messages=messages, tools=tools)
message = completion.choices[0].message

if message.tool_calls:
    tool_call = message.tool_calls[0]
    args = GetStockLevel.model_validate_json(tool_call.function.arguments)

    stock = get_stock_from_1c(args.sku)  # ваш HTTP-запрос к 1С (OData или своя HTTP-служба)

    messages.append(message)
    messages.append({
        "role": "tool",
        "tool_call_id": tool_call.id,
        "content": json.dumps({"sku": args.sku, "stock": stock}),
    })

    final = client.chat.completions.create(model=MODEL, messages=messages)
    print(final.choices[0].message.content)

Это и есть минимальный ИИ-агент для 1С: модель не просто генерирует текст, а совершает действие — запрашивает актуальные данные и только потом формулирует ответ. Дальше схему можно расширять: несколько инструментов (остатки, цены, статус заказа), несколько шагов рассуждения, память диалога.

Обработка в 1С для обращения к ИИ-агенту

Создаем форму с текстовыми реквизитами и размещаем их на форме.

Создаем команду для отправки запросов и размещаем ее в командной панели

Обработчик команды

&НаКлиенте 
Процедура Отправить(Команда) 
	ОчиститьСообщения(); 
	Результат = ""; 
	
	// Проверяем заполнение полей 
	Если Не ЗначениеЗаполнено(Роль) ИЛИ Не ЗначениеЗаполнено(Вопрос) Тогда 
		Сообщить("Заполните обязательные поля ""Роль"" и ""Вопрос"""); 
		Возврат; 
	КонецЕсли; 
	
	// Создаем данные для тела запроса 
	ДанныеЗапроса = Новый Структура; 
	ДанныеЗапроса.Вставить("system", Роль); 
	ДанныеЗапроса.Вставить("question", Вопрос);
	
	// Преобразуем структуру в JSON 
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку(); 
	ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса); 
	ДанныеJSON = ЗаписьJSON.Закрыть(); 
	
	// Отправляем запрос 
	HTTPСоединение = Новый HTTPСоединение("localhost", 8000); 
	HTTPЗапрос = Новый HTTPЗапрос("chatgpt"); 
	HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json"); 
	HTTPЗапрос.УстановитьТелоИзСтроки(ДанныеJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); 
	РезультатЗапроса = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос); 
	
	// Выводим ответ 
	Результат = "Код ответа от сервера: " + РезультатЗапроса.КодСостояния + Символы.ПС + Символы.ВК + РезультатЗапроса.ПолучитьТелоКакСтроку(); 
КонецПроцедуры

Примеры ответов ИИ-агента

Меняем роль, но вопрос оставляем тот же. Честно говоря, я не специалист в хоккее, но похоже, что модель просто придумала ответ — классическая галлюцинация LLM. Именно для таких случаев и нужны приёмы из разделов выше: поле needs_human в structured output и function calling за реальными данными вместо угадывания.

Что дальше

Если нужна модель без оплаты внешнего API — разверните LLM локально на своём железе: vLLM на связке RTX 3090 и Tesla V100 или Qwen 3.6 27B с MTP — обе статьи разбирают запуск локальных моделей с OpenAI-совместимым API, так что код микросервиса выше меняется буквально в пару строк (адрес и ключ). Если задача не «ответить текстом», а «достать и обработать данные 1С», разбор структурированного доступа к данным через LLM есть в статье LLM и 1С: как использовать TextToSQL и Pandas для анализа данных и продаж.

Курс «Применение искусственного интеллекта ChatGPT для 1С» — практика по ИИ-агентам, RAG и MCP-серверам для 1С с нуля.