Kodowanie agentowe zaprojektowane pod kątem kosztów: tworzenie rozwiązań klasy produkcyjnej
Kosztowo optymalizowany kodowanie agencyjne: rozwiązanie typu production-grade z lokalnym LLM, obsługujące routowanie przez LiteLLM, buforowanie promptów oraz punkty końcowe kompatybilne z OpenAI, które pomagają obniżyć koszty.
To przewodnictwo pokazuje, jak przejść od surowców do gotowego systemu w ramach projektu Cost-Engineered Agentic Coding: Budowanie lokalnego proxy LLM klasy produkcyjnej, architektury wielu agentów oraz bezpiecznych narzędzi przy użyciu Zoo Code, TensorX i DeepInfra. Główny nacisk kładziony jest na konkretne kroki realizacyjne, jasne sprawdzenia oraz kod, który można bez problemu umieścić w repozytorium, nie musząc zgadywać intencji twórcy.
Streszczenie dla kierownictwa
W streszczeniu dla kierownictwa należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu systemu. Należy również rejestrować czas wykonywania operacji oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy proces przechodzi z wersji demonstracyjnej do środowisk współdzielonych. W przypadku, gdy kolejnym krokiem jest kod lub wywołanie narzędzia, lepszym rozwiązaniem są ustrukturyzowane wyniki z walidacją schematu niż teksty w formie swobodnej.
1. Przegląd architektury: Wzorzec lokalnego proxya
W przypadku 1. Przegląd architektury: Wzorzec lokalnego proxya należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. W przypadku, gdy następnym krokiem jest kod lub wywołanie narzędzia, lepiej używać ustrukturyzowanych wyników z walidacją schematu niż tekstu w formie swobodnej.
Szyna tłumaczenia protokołu
Dla warstwy tłumaczenia protokołu należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno ścieżkę prawidłowego działania, jak i ścieżkę naprawczą. Próby ponownych działań, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. W przypadku, gdy następnym krokiem jest kod lub wywołanie narzędzia, należy preferować ustrukturyzowane wyniki z walidacją schematu zamiast tekstów w formie swobodnej.
2. Główna konfiguracja: Szczegółowe omówienie litellm_config.yaml
Dla poziomu 2. Konfiguracja zaawansowana: Zagłęb się w plik litellm_config.yaml, zdefiniuj dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Wolno preferować małe, łatwe do przetestowania jednostki nad rozbudowanymi skryptami. Gdy dany krok zawiedzie, powinno to wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji.
W przypadku, gdy następnym krokiem jest kod lub wywołanie narzędzia, lepiej używać ustrukturyzowanych wyników z walidacją schematu niż tekstu w formie swobodnej.
# litellm_config.yaml
litellm_settings:
drop_params: true
modify_params: true
model_list:
# =========================================================================
# WILDCARD CATCH-ALL ROUTES
# Allows on-the-fly usage of any model published by TensorX or DeepInfra
# Example: tensorx/qwen/qwen3.8-2.4t-a95b
# =========================================================================
- model_name: "tensorx/*"
litellm_params:
model: "openai/*"
api_base: https://api.tensorx.ai/v1
api_key: "PLACEHOLDER_TENSORX_KEY"
use_chat_completions_api: true
- model_name: "deepinfra/*"
litellm_params:
model: "openai/*"
api_base: https://api.deepinfra.com/v1/openai
api_key: "PLACEHOLDER_DEEPINFRA_KEY"
use_chat_completions_api: true
# =========================================================================
# TENSORX NAMED SHORT ALIASES
# =========================================================================
- model_name: kimi-k3
litellm_params:
model: openai/moonshotai/kimi-k3
api_base: https://api.tensorx.ai/v1
api_key: "PLACEHOLDER_TENSORX_KEY"
use_chat_completions_api: true
- model_name: glm-5.2
litellm_params:
model: openai/z-ai/glm-5.2
api_base: https://api.tensorx.ai/v1
api_key: "PLACEHOLDER_TENSORX_KEY"
use_chat_completions_api: true
- model_name: kimi-k2.7-code
litellm_params:
model: openai/moonshotai/kimi-k2.7-code
api_base: https://api.tensorx.ai/v1
api_key: "PLACEHOLDER_TENSORX_KEY"
use_chat_completions_api: true
- model_name: glm-5.1
litellm_params:
model: openai/z-ai/glm-5.1
api_base: https://api.tensorx.ai/v1
api_key: "PLACEHOLDER_TENSORX_KEY"
use_chat_completions_api: true
# =========================================================================
# DEEPINFRA NAMED SHORT ALIASES
# =========================================================================
- model_name: deepseek-v4-pro
litellm_params:
model: openai/deepseek-ai/DeepSeek-V4-Pro
api_base: https://api.deepinfra.com/v1/openai
api_key: "PLACEHOLDER_DEEPINFRA_KEY"
use_chat_completions_api: true
- model_name: qwen3-coder-480b
litellm_params:
model: openai/Qwen/Qwen3-Coder-480B-A35B-Instruct
api_base: https://api.deepinfra.com/v1/openai
api_key: "PLACEHOLDER_DEEPINFRA_KEY"
use_chat_completions_api: true
- model_name: qwen3.6-35b
litellm_params:
model: openai/Qwen/Qwen3.6-35B-A3B
api_base: https://api.deepinfra.com/v1/openai
api_key: "PLACEHOLDER_DEEPINFRA_KEY"
use_chat_completions_api: true
- model_name: glm-4.7-flash
litellm_params:
model: openai/zai-org/GLM-4.7-Flash
api_base: https://api.deepinfra.com/v1/openai
api_key: "PLACEHOLDER_DEEPINFRA_KEY"
use_chat_completions_api: true
- model_name: nemotron-3-ultra
litellm_params:
model: openai/nvidia/Nemotron-3-Ultra
api_base: https://api.deepinfra.com/v1/openai
api_key: "PLACEHOLDER_DEEPINFRA_KEY"
use_chat_completions_api: true
# =========================================================================
# PROXY AUTHENTICATION GATEWAY
# =========================================================================
general_settings:
master_key: "PLACEHOLDER_MASTER_KEY"
Kluczowe mechanizmy konfiguracji
Dla krytycznych mechanizmów konfiguracji należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie wykonać dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzuć ciche, częściowe ukończenie zadania. Przy następnym kroku, który polega na pisaniu kodu lub wywoływaniu narzędzia, preferuj strukturyzowane wyniki z walidacją schematu zamiast tekstów w formie swobodnej. Dla krytycznych mechanizmów konfiguracji należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie wykonać dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Przechowuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury.
3. Modelowanie zagrożeń i zabezpieczenia typu Defense-in-Depth
Pracując nad punktem 3. Modelowanie zagrożeń i zabezpieczenia typu Defense-in-Depth, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego awarii. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zdokumentuj zarówno ścieżkę prawidłowego działania, jak i ścieżkę przywracania stanu. Próby ponowne, kontrola przez ludzi oraz obsługa wiadomości nieodebranych stanowią część produktu, a nie elementy dodawane później. Zachowuj w pamięci podręcznej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego prefiksu to częsty powód problemów.
Wzorzec podatności Open Relay
Gdy pracujesz nad wzorcem podatności The Open Relay, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Wolę małe, testowalne jednostki niż rozbudowane skrypty. Gdy jakiś krok się nie powiedzie, błąd powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji. Zachowuj w pamięci tymczasowej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego prefiksu to częsty powód marnotrawstwa zasobów.
Standard łagodzenia skutków w dwóch warstwach
Gdy pracujesz nad Standardem Dwuwarstwowego Łagodzenia, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego awarii. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzuć ciche, częściowe ukończenie zadań. Zachowuj w pamięci podręcznej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego preambułu jest częstą przyczyną marnotrawstwa zasobów. Gdy pracujesz nad Standardem Dwuwarstwowego Łagodzenia, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego awarii. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Przechowuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury.
# Executable Proxy Invocation Command
LITELLM_USE_CHAT_COMPLETIONS_URL_FOR_ANTHROPIC_MESSAGES=true \
litellm --config ~/.claude/litellm_config.yaml \
--host 127.0.0.1 \
--port 4000
# Authentication Enforcement inside litellm_config.yaml
general_settings:
master_key: "sk-7i9UOL9jkji09löOIhM..."
Architektura oddzielenia tajemnic
Architektura oddzielenia tajemnic działa najlepiej, gdy jest traktowana jako mierzalna struktura. Zanim rozszerzysz zakres, zapisz jeden idealny przepis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań. Dokumentuj zarówno ścieżkę prawidłowego działania, jak i ścieżkę przywracania stanu. Próby ponownych działań, kontrola przez ludzi oraz obsługa wiadomości nieodebranych stanowią część produktu, a nie elementy dodawane później. Przydziel budżet tokenów na każdy ruch i sesję. Narzędzia agentowe intensywnie rozszerzają kontekst; sztywne limity zapobiegają temu, by demonstracje przerodziły się w niespodziewane rachunki.
4. Inżynieria kosztów w systemach wieloagentowych: Orchestrator, Zbieracz informacji i Tani programista
- Inżynieria kosztów w systemach wielu agentów: Orchestrator, Scout i Cheap Coder działają najlepiej, gdy traktuje się je jako mierzalną strukturę. Zanim rozszerzysz zakres pracy, zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań. Wolij małe, testowalne jednostki zamiast rozbudowanych skryptów. Gdy jakiś krok zawiedzie, awaria powinna wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji. Określ budżet tokenów na jeden ruch i na jedną sesję. Narzędzia agentowe intensywnie rozszerzają kontekst; sztywne limity zapobiegają temu, by demonstracje przerodziły się w niespodziewane rachunki.
Problem postępującego rozszerzania kontekstu przez agenty
Problem rozprzestrzeniania się kontekstu przez agenty działa najlepiej, gdy traktuje się go jako coś mierzalnego. Zapisz jeden idealny przepis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań, zanim rozszerzysz zakres. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzucaj ciche, częściowe ukończenie zadań. Przydziel budżet tokenów na każdy ruch i sesję. Narzędzia agencyjne intensywnie rozszerzają kontekst; sztywne limity zapobiegają temu, by demonstracje przerodziły się w niespodziewane rachunki. Problem rozprzestrzeniania się kontekstu przez agenty działa najlepiej, gdy traktuje się go jako coś mierzalnego. Zapisz jeden idealny przepis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań, zanim rozszerzysz zakres. Przechowuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny haseł oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury.
Rozwiązanie oparte na trzech agentach
Dla rozwiązania Tri-Agent należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg działania, jak i ścieżkę naprawczą. Próby ponownych działań, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. W przypadku, gdy następnym krokiem jest kod lub wywołanie narzędzia, należy preferować ustrukturyzowane wyniki z walidacją schematu zamiast tekstów w formie swobodnej.
Porównanie kosztów kontekstowych
Aby porównać koszty w kontekście danego zadania, należy zdefiniować dane wejściowe, osobę odpowiedzialną za daną czynność oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić tę czynność na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Lepiej używać małych, łatwych do przetestowania jednostek niż rozbudowanych skryptów. Gdy jakaś czynność zawodzi, powód awarii powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną strukturę procesu. Gdy następna czynność to kod lub wywołanie narzędzia, lepsze są ustrukturyzowane wyniki z walidacją schematu niż tekst w formie swobodnej.
Deklaracje trybu dostosowanego (custom_modes.yaml)
Dla deklaracji trybu dostosowanego (custom_modes.yaml) należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy plikom, zdefiniuj sprawdzenia sukcesu i odrzucaj ciche, częściowe ukończenie zadań.
Przy następnym kroku będącym kodem lub wywołaniem narzędzia preferuj strukturyzowane wyniki z walidacją schematu zamiast tekstów w formie swobodnej.
Dla deklaracji trybu dostosowanego (custom_modes.yaml) należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Przechowuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą audytować.
customModes:
- slug: scout
name: 🔍 Scout
roleDefinition: >-
You are a reconnaissance specialist. The orchestrator cannot read files,
so you read them on its behalf and return the smallest set of facts it
needs to write a precise implementation brief: exact paths, exact symbol
locations, and only the excerpts that matter.
whenToUse: >-
Use as the first subtask whenever the orchestrator does not already know
the exact file paths and code shape involved. Always run a scout before
delegating implementation into a codebase area that has not been mapped.
groups:
- read
customInstructions: >-
WHY YOU EXIST: Your report is pasted into the orchestrator's context,
which runs on the most expensive model in this system. Raw file dumps
read there cost many times what they cost here. Your job is to convert
a lot of cheap reading into a little expensive context.
WHAT TO RETURN: Exact repo-relative paths with line numbers. The signature
or declaration of every symbol that matters. Only excerpts directly relevant
to the task. Maximum budget: ~40 lines of total quoted code across all files.
NEVER paste full files. NEVER suggest solutions or fixes—report facts only.
- slug: cheap-coder
name: 💸 Cheap Coder
roleDefinition: >-
You are a focused implementation worker. You receive a precise,
self-contained task brief from an orchestrator and apply the smallest
correct code change that satisfies it. You do not design architecture,
you do not explore the repository on your own, and you do not invent requirements.
whenToUse: >-
Use for delegated single-purpose implementation subtasks whose target files
and intent are already named in the brief. Do not use for investigation
or architectural design.
groups:
- read
- edit
- command
customInstructions: >-
SCOPE: Work only from the files and excerpts named in your task brief.
Do not search or browse the repository to build your own picture; the
orchestrator already paid for exploration and passed you the result.
If the brief is missing a file or fact, stop and report exactly what is
missing instead of hunting for it.
EDITS: Apply the minimal diff that satisfies the brief. Preserve surrounding
style, type annotations, and conventions. Run only the single verification
command specified in the brief. If verification fails twice, stop and report.
Szybkie instrukcje Orchestratora
Pracując z szybkimi instrukcjami Orchestratora, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zdokumentuj zarówno ścieżkę prawidłowego działania, jak i ścieżkę naprawczą. Próby ponowne, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Zachowuj w pamięci tymczasowej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego nagłówka jest częstą przyczyną marnotrawstwa zasobów.
You cannot read files. Before delegating any implementation into code you have
not yet mapped, delegate a `scout` subtask first and use its report to write the
implementation brief.
Delegate implementation with new_task to `cheap-coder`, never to `code`. Every
brief must be self-contained—the worker cannot see this conversation. Include:
the exact file paths from the scout report, the excerpts the scout returned, the
precise change wanted, and the single verification command to run.
Never paste a scout report into a brief wholesale; pass only the part that
subtask needs.
After an implementation subtask reports success, do not accept its self-assessment.
Delegate a separate `scout` subtask to verify: have it confirm the changed files now
contain what was asked and report the verification command's output verbatim. Decide
on the scout's facts, not the implementer's summary.
Once the scout's verification confirms the change is correct, use
ask_followup_question to ask the user for permission to commit, and separately ask
for permission to push—approval of one is never approval of the other. If the user
approves committing, delegate to `cheap-coder` with a brief naming only the exact
relative paths of the files that actually changed to stage (never `git add .` or
`git add -A`) and the exact commit message to use: a single short line, imperative
mood, no `Co-Authored-By` trailer, no "Generated with" attribution line. Only include
a push step in that brief if the user separately approved pushing.
5. Ekonomia modelu i wykorzystanie pamięci tymczasowej promptów
Gdy pracujesz nad rozdziałem 5. Model Economics and Prompt Caching Leverage, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Wolij małe, testowalne jednostki od rozbudowanych skryptów. Gdy jakiś krok się nie powiedzie, błąd powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji. Zachowuj w pamięci tymczasowej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego wstępu to częsty powód marnotrawstwa zasobów.
Hity modeli: qwen3.8-2.4t-a95b (TensorX)
Podczas pracy nad Model Spotlight: qwen3.8-2.4t-a95b (TensorX), najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie.
Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzuć możliwość cichego, częściowego ukończenia zadania.
Zachowuj w pamięci tymczasowej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego początku wiadomości jest częstą przyczyną marnotrawstwa zasobów.
Mechanizmy przechowywania promptów
Gdy pracujesz nad „The Mechanics of Prompt Caching”, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Obok wyników funkcjonalnych zapisz czas wykonywania oraz koszt tokena lub zapytania. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Zachowuj w pamięci tymczasowej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego wstępu to częsty powód marnotrawstwa zasobów.
Turn 1: [System Prompt + Tool Definitions + File Map] -> Written to Cache ($2.50 / 1M)
Turn 2: [System Prompt + Tool Definitions + File Map] -> CACHE HIT ($0.63 / 1M) -> 75% Savings
Turn 3: [System Prompt + Tool Definitions + File Map] -> CACHE HIT ($0.63 / 1M) -> 75% Savings
6. Telemetria, prywatność i audyt lokalnej eksploatacji
Gdy zajmujesz się tematem 6. Telemetria, prywatność i audyt lokalnej eksploatacji, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Przechowuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Zachowuj w pamięci podręcznej stabilne instrukcje systemowe oraz schematy narzędzi. Ponowne wysyłanie identycznego preambułu jest częstą przyczyną marnotrawstwa zasobów.
Wyniki audytu
Gdy przeglądasz ustalenia audytu, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zdokumentuj zarówno ścieżkę prawidłowego działania, jak i ścieżkę przywracania. Próby ponowne, kontrolne punkty ludzkie oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Zachowuj w pamięci podręcznej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego nagłówka jest częstą przyczyną nadmiernego obciążenia.
Zabezpieczanie telemetrii do poziomu zera
Gdy pracujesz nad wdrożeniem zasad hardeningu telemetrycznego do poziomu zero, najpierw zapisz specyfikację: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego awarii. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Wolno preferować małe, testowalne jednostki zamiast rozbudowanych skryptów. Gdy jakiś krok zawiedzie, awaria powinna wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji. Zachowuj w pamięci tymczasowej stabilne instrukcje systemowe oraz schematy narzędzi. Ponowne wysyłanie identycznego prefiksu to częsty powód zużycia zasobów.
{
"telemetry.telemetryLevel": "off"
}
7. Przewodnik krok po kroku przez konfigurację w produkcji
Gdy przechodzisz przez przewodnik „7. Krok po kroku – ustawianie produkcji”, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzuć możliwość cichego, częściowego ukończenia zadania. Zachowuj w pamięci tymczasowej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego nagłówka jest częstą przyczyną problemów.
Krok 1: Inicjalizacja środowiska
Gdy przechodzisz przez Krok 1: Inicjalizacja środowiska, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zapisz czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy środowisko przechodzi z wersji demonstracyjnej do współdzielonych środowisk. Zachowuj w pamięci tymczasowej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego nagłówka jest częstą przyczyną marnotrawstwa zasobów.
# Start LiteLLM Proxy in foreground
alias claude-proxy='LITELLM_USE_CHAT_COMPLETIONS_URL_FOR_ANTHROPIC_MESSAGES=true litellm --config ~/.claude/litellm_config.yaml --host 127.0.0.1 --port 4000'
# Start LiteLLM Proxy in background with health check
cx-proxy-up() {
if ! ss -ltn | grep -q ":4000 "; then
echo "Starting LiteLLM Proxy on 127.0.0.1:4000..."
LITELLM_USE_CHAT_COMPLETIONS_URL_FOR_ANTHROPIC_MESSAGES=true \
nohup litellm --config ~/.claude/litellm_config.yaml --host 127.0.0.1 --port 4000 > /tmp/litellm-proxy.log 2>&1 &
# Wait for readiness endpoint
until curl -s http://127.0.0.1:4000/health/readiness | grep -q '"status":"healthy"'; do
sleep 0.5
done
echo "LiteLLM Proxy is online and healthy."
else
echo "LiteLLM Proxy is already running on port 4000."
fi
}
# CLI model catalog search tool
cx-find() {
python3 ~/.claude/cx-find.py "$@"
}
source ~/.bashrc
Krok 2: Inicjalizacja proxy
Gdy przechodzisz do kroku 2: Inicjalizacja proxy, najpierw zapisz umowę – wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Przechowuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Zachowuj w pamięci podręcznej stabilne instrukcje systemowe oraz schematy narzędzi. Ponowne wysyłanie identycznego prefiksu jest częstą przyczyną marnotrawstwa zasobów.
cx-proxy-up
ss -ltnp | grep :4000
# Expected output: LISTEN 0 128 127.0.0.1:4000 ...
curl -s http://127.0.0.1:4000/health/readiness
# Expected output: {"status":"healthy","db":"Not connected"}
Krok 3: Konfiguracja profili rozszerzeń kodu Zoo
Gdy przechodzisz do kroku 3: Konfiguruj profile rozszerzeń Zoo Code, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zdokumentuj zarówno ścieżkę prawidłowego działania, jak i ścieżkę naprawczą. Próby ponowne, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Zachowuj w pamięci podręcznej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego preambułu jest częstą przyczyną problemów.
Profile
Gdy pracujesz nad profilami, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Wolij małe, testowalne jednostki od rozbudowanych skryptów. Gdy jakiś krok się nie powiedzie, błąd powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji. Zachowuj w pamięci tymczasowej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego prefiksu to częsty powód marnotrawstwa zasobów.
Krok 4: Powiązania między trybami a profilami
Gdy przechodzisz przez Krok 4: Powiązania między trybem a profilami, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i unikaj cichego ukończenia zadania w sposób niepełny. Zachowuj w pamięci tymczasowej stabilne instrukcje systemu oraz schematy narzędzi. Ponowne wysyłanie identycznego prefiksu to częsty powód marnotrawstwa zasobów. Gdy przechodzisz przez Krok 4: Powiązania między trybem a profilami, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Przechowuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury.
🪃 Orchestrator --> orchestrator profile
🔍 Scout --> worker profile
💸 Cheap Coder --> worker profile
Debug --> orchestrator profile
8. Przewodnik weryfikacji i rozwiązywania problemów
- Przewodnik weryfikacji i rozwiązywania problemów działa najlepiej, gdy traktuje się go jako mierzalną powierzchnię. Zapisz jeden idealny przepis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres. Zdokumentuj zarówno prawidłowy przebieg działania, jak i ścieżkę przywracania do normy. Próby ponownych działań, kontrola przez ludzi oraz obsługa wiadomości nieodebranych stanowią część produktu, a nie elementy dodawane później. Przydziel budżet tokenów na każdy ruch i sesję. Narzędzia typu agentic intensywnie rozszerzają kontekst; sztywne limity zapobiegają temu, by demonstracje przerodziły się w niespodziewane rachunki.
Weryfikacja aktywnych modeli
Weryfikacja aktywnych modeli działa najlepiej, gdy traktuje się ją jako mierzalną powierzchnię. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań, zanim rozszerzysz zakres pracy. Wolij małe, testowalne jednostki nad rozbudowane skrypty. Gdy jakiś krok zawiedzie, awaria powinna wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji. Określ budżet tokenów na jeden ruch i na jedną sesję. Narzędzia typu agentic intensywnie rozszerzają kontekst; sztywne limity zapobiegają temu, by demonstracje przerodziły się w nieoczekiwane rachunki.
curl -si http://localhost:4000/v1/messages \
-H "Authorization: Bearer YOUR_MASTER_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"kimi-k3","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}' \
| grep -i x-litellm
Powszechne kody błędów i sposoby ich rozwiązania
Kody błędów i sposoby ich rozwiązania działają najlepiej, gdy traktuje się je jako mierzalną strukturę. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i unikaj cichego, częściowego ukończenia zadań. Określ budżet tokenów na jeden ruch i jedną sesję. Narzędzia typu agentic intensywnie rozszerzają kontekst; sztywne limity zapobiegają temu, by demonstracje przerodziły się w niespodziewane rachunki.
Błąd: HTTP 400 Brak połączenia z bazą danych. / HTTP 500 Błąd wewnętrzny serwera
Błąd: HTTP 403 Klucz nie upoważniony do dostępu do modelu
Błąd: Bezpieczne zakończenie procesu podczas restartów proxy
OLD_PID=$(ss -ltnp | grep ":4000" | grep -oE "pid=[0-9]+" | cut -d= -f2 | head -1)
if [ -n "$OLD_PID" ]; then
kill "$OLD_PID"
sleep 2
ss -ltn | grep -q ":4000" || echo "Port 4000 cleared successfully."
fi
Wniosek
Lista kontrolna operacyjna
Pozycje pokrewne
- Praktyczne notatki: Budowanie agenta do programowania w prywatnej chmurze: OpenCode + lokalny LLM — Szczegółowy przewodnik po Praktycznych notatkach: Budowanie agenta do programowania w prywatnej chmurze: OpenCode + lokalny LLM: kontrakty, sprawdzenia oraz gotowe fragmenty kodu dla zespołów wdrażających ten model.
- Praktyczne notatki: MCP dla rozwojowców LangGraph: Od podstaw do produkcji — Szczegółowy przewodnik po Praktycznych notatkach: MCP dla rozwojowców LangGraph: Od podstaw do produkcji: kontrakty, sprawdzenia oraz gotowe fragmenty kodu dla zespołów wdrażających ten model.