talos-ai 0.63.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. talos_ai-0.63.1/LICENSE +37 -0
  2. talos_ai-0.63.1/PKG-INFO +294 -0
  3. talos_ai-0.63.1/README.md +275 -0
  4. talos_ai-0.63.1/pyproject.toml +31 -0
  5. talos_ai-0.63.1/setup.cfg +4 -0
  6. talos_ai-0.63.1/talos_ai.egg-info/PKG-INFO +294 -0
  7. talos_ai-0.63.1/talos_ai.egg-info/SOURCES.txt +86 -0
  8. talos_ai-0.63.1/talos_ai.egg-info/dependency_links.txt +1 -0
  9. talos_ai-0.63.1/talos_ai.egg-info/entry_points.txt +2 -0
  10. talos_ai-0.63.1/talos_ai.egg-info/requires.txt +7 -0
  11. talos_ai-0.63.1/talos_ai.egg-info/top_level.txt +1 -0
  12. talos_ai-0.63.1/talos_cli/__init__.py +1 -0
  13. talos_ai-0.63.1/talos_cli/__main__.py +1677 -0
  14. talos_ai-0.63.1/talos_cli/agent.py +597 -0
  15. talos_ai-0.63.1/talos_cli/auth.py +79 -0
  16. talos_ai-0.63.1/talos_cli/backfill.py +117 -0
  17. talos_ai-0.63.1/talos_cli/bitbucket.py +166 -0
  18. talos_ai-0.63.1/talos_cli/bundled_skills/data-clean/SKILL.md +16 -0
  19. talos_ai-0.63.1/talos_cli/bundled_skills/doc-draft/SKILL.md +19 -0
  20. talos_ai-0.63.1/talos_cli/bundled_skills/email-reply/SKILL.md +17 -0
  21. talos_ai-0.63.1/talos_cli/bundled_skills/invoice-read/SKILL.md +15 -0
  22. talos_ai-0.63.1/talos_cli/bundled_skills/meeting-notes/SKILL.md +16 -0
  23. talos_ai-0.63.1/talos_cli/bundled_skills/pdf-extract/SKILL.md +15 -0
  24. talos_ai-0.63.1/talos_cli/bundled_skills/pr-ready/SKILL.md +18 -0
  25. talos_ai-0.63.1/talos_cli/bundled_skills/translate/SKILL.md +16 -0
  26. talos_ai-0.63.1/talos_cli/bundled_skills/xlsx-summary/SKILL.md +17 -0
  27. talos_ai-0.63.1/talos_cli/capture_hook.sh +24 -0
  28. talos_ai-0.63.1/talos_cli/checkpoints.py +72 -0
  29. talos_ai-0.63.1/talos_cli/config.py +190 -0
  30. talos_ai-0.63.1/talos_cli/context.py +115 -0
  31. talos_ai-0.63.1/talos_cli/docreader.py +180 -0
  32. talos_ai-0.63.1/talos_cli/docwriter.py +83 -0
  33. talos_ai-0.63.1/talos_cli/dpo_export.py +95 -0
  34. talos_ai-0.63.1/talos_cli/gateway.py +317 -0
  35. talos_ai-0.63.1/talos_cli/gitinfo.py +40 -0
  36. talos_ai-0.63.1/talos_cli/guardrails.py +92 -0
  37. talos_ai-0.63.1/talos_cli/hooks.py +91 -0
  38. talos_ai-0.63.1/talos_cli/jobs.py +166 -0
  39. talos_ai-0.63.1/talos_cli/kb.py +456 -0
  40. talos_ai-0.63.1/talos_cli/mcp.py +357 -0
  41. talos_ai-0.63.1/talos_cli/permissions.py +79 -0
  42. talos_ai-0.63.1/talos_cli/personas.py +184 -0
  43. talos_ai-0.63.1/talos_cli/practice_loop.py +134 -0
  44. talos_ai-0.63.1/talos_cli/ratings.py +185 -0
  45. talos_ai-0.63.1/talos_cli/rules.py +160 -0
  46. talos_ai-0.63.1/talos_cli/session_state.py +99 -0
  47. talos_ai-0.63.1/talos_cli/skills.py +106 -0
  48. talos_ai-0.63.1/talos_cli/submit_dataset.py +118 -0
  49. talos_ai-0.63.1/talos_cli/sync.py +172 -0
  50. talos_ai-0.63.1/talos_cli/task_source.py +39 -0
  51. talos_ai-0.63.1/talos_cli/teacher.py +57 -0
  52. talos_ai-0.63.1/talos_cli/tools.py +711 -0
  53. talos_ai-0.63.1/talos_cli/transcript_to_training.py +341 -0
  54. talos_ai-0.63.1/talos_cli/ui.py +159 -0
  55. talos_ai-0.63.1/talos_cli/update.py +209 -0
  56. talos_ai-0.63.1/tests/test_agent.py +152 -0
  57. talos_ai-0.63.1/tests/test_agent_streaming.py +136 -0
  58. talos_ai-0.63.1/tests/test_auth.py +101 -0
  59. talos_ai-0.63.1/tests/test_backfill.py +59 -0
  60. talos_ai-0.63.1/tests/test_bitbucket.py +77 -0
  61. talos_ai-0.63.1/tests/test_checkpoints.py +171 -0
  62. talos_ai-0.63.1/tests/test_config_parse.py +113 -0
  63. talos_ai-0.63.1/tests/test_context.py +112 -0
  64. talos_ai-0.63.1/tests/test_docs.py +105 -0
  65. talos_ai-0.63.1/tests/test_gateway.py +81 -0
  66. talos_ai-0.63.1/tests/test_gitinfo.py +51 -0
  67. talos_ai-0.63.1/tests/test_guardrails_budget.py +54 -0
  68. talos_ai-0.63.1/tests/test_hardening.py +85 -0
  69. talos_ai-0.63.1/tests/test_hooks.py +138 -0
  70. talos_ai-0.63.1/tests/test_jobs.py +131 -0
  71. talos_ai-0.63.1/tests/test_kb.py +137 -0
  72. talos_ai-0.63.1/tests/test_mcp.py +213 -0
  73. talos_ai-0.63.1/tests/test_parallel.py +131 -0
  74. talos_ai-0.63.1/tests/test_personas.py +95 -0
  75. talos_ai-0.63.1/tests/test_ratings.py +105 -0
  76. talos_ai-0.63.1/tests/test_redaction.py +46 -0
  77. talos_ai-0.63.1/tests/test_rules.py +100 -0
  78. talos_ai-0.63.1/tests/test_safety.py +138 -0
  79. talos_ai-0.63.1/tests/test_session_state.py +76 -0
  80. talos_ai-0.63.1/tests/test_skill_personas.py +58 -0
  81. talos_ai-0.63.1/tests/test_streaming.py +44 -0
  82. talos_ai-0.63.1/tests/test_sync.py +87 -0
  83. talos_ai-0.63.1/tests/test_todos.py +141 -0
  84. talos_ai-0.63.1/tests/test_tools.py +249 -0
  85. talos_ai-0.63.1/tests/test_training.py +266 -0
  86. talos_ai-0.63.1/tests/test_ui.py +69 -0
  87. talos_ai-0.63.1/tests/test_update_dist.py +96 -0
  88. talos_ai-0.63.1/tests/test_version.py +18 -0
@@ -0,0 +1,37 @@
1
+ Copyright (c) 2026 Fixit E.E. (https://www.fixit.gr)
2
+ All rights reserved.
3
+
4
+ PROPRIETARY LICENSE
5
+
6
+ This software and associated documentation files (the "Software") are the
7
+ proprietary property of Fixit E.E. and are protected by copyright law.
8
+
9
+ GRANT OF USE
10
+
11
+ Fixit E.E. grants you a personal, non-exclusive, non-transferable, revocable
12
+ license to download, install, and run the Software solely as a client to access
13
+ the Talos services operated by Fixit E.E. (the "Service"), subject to the terms
14
+ below. This permits the public distribution and installation of the Software for
15
+ that purpose (e.g. via pip/pipx).
16
+
17
+ RESTRICTIONS
18
+
19
+ Except as expressly permitted above, no part of this Software may be reproduced,
20
+ redistributed, sold, sublicensed, modified, reverse engineered, or decompiled
21
+ without the prior written permission of Fixit E.E. You may not use the Software
22
+ to build or operate a competing service, nor remove or alter any proprietary
23
+ notices.
24
+
25
+ NO WARRANTY
26
+
27
+ The Software is provided "AS IS", without warranty of any kind, express or
28
+ implied. Fixit E.E. is not liable for any claim, damages, or other liability
29
+ arising from the use of the Software. Fixit E.E. may modify, suspend, or
30
+ discontinue the Service at any time.
31
+
32
+ For licensing inquiries:
33
+ Fixit E.E.
34
+ G. Gennimata 54A, 55132, Kalamaria, Thessaloniki, Greece
35
+ Email: info@fixit.gr
36
+ Phone: +30 2313 251851
37
+ Web: https://www.fixit.gr
@@ -0,0 +1,294 @@
1
+ Metadata-Version: 2.4
2
+ Name: talos-ai
3
+ Version: 0.63.1
4
+ Summary: Talos: Fixit's terminal AI agent for coding and business work, model-routed by the ai.fixit.gr controller
5
+ Author-email: "Fixit E.E." <info@fixit.gr>
6
+ License: Proprietary
7
+ Project-URL: Homepage, https://www.fixit.gr
8
+ Project-URL: Documentation, https://ai.fixit.gr
9
+ Keywords: llm,coding-assistant,fine-tuning
10
+ Requires-Python: >=3.11
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Provides-Extra: teacher
14
+ Requires-Dist: anthropic>=0.40; extra == "teacher"
15
+ Provides-Extra: files
16
+ Requires-Dist: openpyxl>=3.1; extra == "files"
17
+ Requires-Dist: python-docx>=1.1; extra == "files"
18
+ Dynamic: license-file
19
+
20
+ # Talos CLI
21
+
22
+ Fixit's AI agent for your terminal — coding, your stack, and business work. The ai.fixit.gr
23
+ controller routes each request to the right model (chat runs on gpt-oss:120b), so you get a
24
+ strong answer without picking a model. Your reviewed sessions feed the knowledge base and evals.
25
+
26
+ It is a thin, config-driven client. The model, training, and GPU run on the managed Talos
27
+ backend; the CLI only talks to it over HTTPS with your API key. Your data trains your own
28
+ private, tenant-isolated adapter and is never shared with other tenants.
29
+
30
+ ## Install
31
+
32
+ ```bash
33
+ pipx install talos-cli
34
+ talos login
35
+ ```
36
+
37
+ `talos login` opens a device-authorization flow: it prints a URL and a code, you approve in
38
+ the browser at your Talos account, and the token is stored for you. (Advanced: `talos init`
39
+ writes the config by hand instead.)
40
+
41
+ `talos init` writes `~/.talos/config.toml`:
42
+
43
+ | Key | Meaning | Default |
44
+ |-----|---------|---------|
45
+ | `gateway_url` | Talos backend endpoint | `https://ai.fixit.gr` |
46
+ | `api_key` | Your tenant API key | — |
47
+ | `model` | Model alias | `chat-primary` |
48
+ | `code_root` | Where your repos live | `~/Code` |
49
+ | `token_budget` | Weekly cap for the practice loop | `100000` |
50
+ | `persona` | `developer` / `business` / `hybrid` | inferred from role |
51
+ | `show_tokens` | force per-step token + tool detail on/off | by persona |
52
+
53
+ Every value can be overridden by an env var (`TALOS_GATEWAY_URL`, `TALOS_API_KEY`, ...).
54
+
55
+ ### Personas
56
+
57
+ The same Talos serves two audiences; the persona tailors the system prompt and how much detail it
58
+ shows:
59
+
60
+ - **developer** — the coding agent: writes and reviews code, runs tests/builds, and prints the
61
+ per-step token and tool details.
62
+ - **business** — a plain-language business assistant: reads your documents and spreadsheets, writes
63
+ reports and content, and keeps the output quiet (no code, no token spam).
64
+ - **hybrid** — both.
65
+
66
+ The persona is taken from `persona` in your config, otherwise inferred from your profile role,
67
+ otherwise `developer`. `talos persona` shows the current one and the options; `talos persona
68
+ business` sets it; inside a chat, `/persona business` switches live. `show_tokens = true|false`
69
+ overrides the per-step detail regardless of persona (you can also toggle it for a session with
70
+ `/verbose`).
71
+
72
+ ## Commands
73
+
74
+ Just run `talos` with no arguments to drop straight into the interactive session (same as
75
+ `talos chat`) — it opens clean, no command dump. Type `help` (or `/help`) any time to see the
76
+ role-aware list of what you can do: a customer sees chat, knowledge base, profile and sync; an
77
+ admin also sees training, eval, promote and the system commands, built from your key's real
78
+ scopes. If you are not logged in yet it runs `talos login` first. (Piped or non-interactive —
79
+ `talos | head`, CI — it prints the static command list instead.)
80
+
81
+ | Command | What it does |
82
+ |---------|--------------|
83
+ | `talos` | Enter the interactive session directly (type `help` for what your role can do) |
84
+ | `talos login` | Authorize via device code; stores the token |
85
+ | `talos init` | Write or update the config file by hand |
86
+ | `talos status` | Show gateway, model, and your key's client_id and scopes |
87
+ | `talos status --system` | (admin) What is running: training state, GPU, loaded models, services |
88
+ | `talos chat ["prompt"]` | Interactive chat, or one-shot if a prompt is given |
89
+ | `talos backfill` | Convert existing Claude Code transcripts to training rows |
90
+ | `talos submit` | Upload staged training rows to the backend |
91
+ | `talos loop` | Run the bounded practice loop (teacher-reviewed self-training) |
92
+ | `talos dpo-export` | Convert collected DPO rows into prompt/chosen/rejected pairs |
93
+
94
+ ## Agent capabilities
95
+
96
+ In a session Talos can read and edit code, run shell/ssh commands, find files (`glob`),
97
+ fetch web pages (`web_fetch`), drive Bitbucket (`bitbucket`), consult the knowledge base
98
+ (`kb_search`), and read structured
99
+ documents with `read_file` — Excel (`.xlsx`/`.xlsm`), Word (`.docx`), `.csv`/`.tsv`, `.json`
100
+ and `.pdf` (pdf needs `pdftotext`). Spreadsheets and Word files are parsed with the standard
101
+ library, no extra packages.
102
+
103
+ It can also **write** real Office and data files with `write_doc`: `.xlsx` (Excel) and
104
+ `.csv`/`.tsv` from tab-separated rows (numbers stored as numbers, so totals work) and `.docx`
105
+ (Word) with one paragraph per line. `.xlsx`/`.docx` need the optional extra — install with
106
+ `pip install talos-cli[files]` (openpyxl + python-docx); `.csv`/`.tsv` work out of the box. So the
107
+ business skills can read your Excel/Word and hand back a finished spreadsheet or document.
108
+
109
+ ### Bitbucket
110
+
111
+ The `bitbucket` tool lets Talos run the full branch -> PR -> review -> merge workflow with your
112
+ own Bitbucket credentials, locally — it talks to the Bitbucket API directly (same trust model as
113
+ git/ssh), never through the gateway. It can list repos, list and read pull requests with their
114
+ review comments, create a PR, reply to a review, merge, check pipeline/CI status, and create a
115
+ branch. Configure it once:
116
+
117
+ ```toml
118
+ bitbucket_user = "your-bitbucket-username"
119
+ bitbucket_token = "app-password-with-pullrequest-and-repo-scopes"
120
+ bitbucket_workspace = "your-workspace" # optional; lets you pass just the repo slug
121
+ ```
122
+
123
+ (or `TALOS_BITBUCKET_USER` / `TALOS_BITBUCKET_TOKEN` / `TALOS_BITBUCKET_WORKSPACE`). The tool
124
+ defaults to `ask`, so each action is confirmed before it runs. A PR's outcome (merged / declined)
125
+ also becomes a training label for the self-improving loop.
126
+
127
+ ### MCP tool servers
128
+
129
+ Talos can use tools from any [Model Context Protocol](https://modelcontextprotocol.io) server,
130
+ either remote (HTTP) or local (a subprocess over stdio). Declare one block per server in
131
+ `~/.talos/config.toml`:
132
+
133
+ ```toml
134
+ # remote HTTP server
135
+ [mcp.vita4you]
136
+ url = "https://your-host/mcp"
137
+ token = "optional-bearer-token" # sent as Authorization: Bearer ...
138
+ # enabled = false # temporarily turn a server off
139
+ # timeout = 30
140
+
141
+ # local stdio server (a subprocess speaking newline-delimited JSON-RPC)
142
+ [mcp.fixit]
143
+ command = "python3"
144
+ args = ["/home/me/docker/scripts/memory-mcp-server.py"]
145
+ [mcp.fixit.env] # optional environment for the subprocess
146
+ FIXIT_MEMORY_DIR = "/home/me/.claude/projects/.../memory"
147
+ ```
148
+
149
+ On startup Talos connects to each server (`initialize` → `tools/list`), and its tools are offered
150
+ to the model namespaced as `<server>__<tool>` (e.g. `vita4you__get_order_details`). When the model
151
+ calls one, Talos forwards it as an MCP `tools/call` and feeds the result back. MCP tools default to
152
+ `ask` (each external call is confirmed). Both plain-JSON and `text/event-stream` (Streamable HTTP)
153
+ responses are handled, and a `Mcp-Session-Id` is captured and resent. `talos mcp` lists the
154
+ configured servers and tests connectivity; `/mcp` does the same inside a chat. A server that is
155
+ unreachable at startup is skipped with a warning — it never blocks the CLI. Local stdio servers are
156
+ launched as a subprocess and shut down cleanly when the chat ends.
157
+
158
+ ### Streaming
159
+
160
+ In plain chat (`/agent off`) the reply streams in token by token as the model produces it, so you
161
+ see the answer forming instead of waiting for the whole thing; a spinner shows until the first
162
+ token and it falls back to a buffered reply if the gateway is not streaming. The agentic tool-loop
163
+ turn stays buffered because it needs the complete response to detect tool calls.
164
+
165
+ ### Sub-agent delegation
166
+
167
+ For a big task the agent can call `delegate` to hand a focused, self-contained piece of work to a
168
+ fresh sub-agent that has the same tools but its own clean context (e.g. "analyse module X and
169
+ summarise its API"). The sub-agent shares your gateway, permissions and weekly token budget, runs
170
+ with a smaller step cap, and returns its answer to the main agent; it cannot delegate further. This
171
+ keeps the main conversation focused instead of filling it with exploration.
172
+
173
+ ### Sync across machines
174
+
175
+ Your setup follows you. `talos sync push` uploads your config (model, kb_project, token budget),
176
+ shortcuts, per-tool permissions, your global `~/.talos/TALOS.md` and your skills to your account;
177
+ `talos sync pull` restores them on another machine (`talos sync status` shows what is stored). A
178
+ fresh `talos login` pulls them automatically, so a new machine is ready instantly. Secrets — your
179
+ API key and Bitbucket token — are never uploaded, and machine-local paths stay local.
180
+
181
+ ### Profile
182
+
183
+ Tell Talos who you are once and it adapts to you: `talos profile --role developer --about "I run
184
+ a Magento shop" --preferences "answer in Greek, be terse"` (run `talos profile` to view). Your role
185
+ (developer / marketing / founder / ...), a short about, and your preferences are loaded at the start
186
+ of every session and honoured by the agent. It is stored on your account and synced across machines,
187
+ and it is the same data the customer-portal onboarding wizard fills — so even a non-developer gets a
188
+ Talos pointed in the right direction from the first message.
189
+
190
+ ### Memory
191
+
192
+ Talos keeps a persistent memory of durable facts and preferences about you — your role, your stack,
193
+ how you like answers, standing instructions. It loads them at the start of every session and works
194
+ with them in mind, and saves a new one (via its `remember` tool) when you tell it something lasting.
195
+ `/remember` shows what is stored and `/remember <fact>` adds one by hand. Memory lives on your
196
+ account (keyed by your client_id), so it follows you to every machine you log in from; it is distinct
197
+ from the knowledge base (documents you ingest) — this is who *you* are.
198
+
199
+ ### Learned rules
200
+
201
+ Where memory is about *you*, rules are about *how to write the code*. When Talos learns a durable
202
+ convention during a session — from a correction, a repeated review note, a project standard — it
203
+ proposes it with its `propose_rule` tool instead of quietly drifting. Proposals are not applied
204
+ automatically: `talos rules` lists them, `talos rules accept <id>` adds the rule to your
205
+ `~/.talos/TALOS.md` (which Talos loads as project rules, so it takes effect next session), and
206
+ `talos rules reject <id>` files it in a rejected buffer so it is never proposed again. You are the
207
+ gate; nothing changes how Talos behaves until you accept it.
208
+
209
+ ### Knowledge base
210
+
211
+ `kb_search` retrieves relevant facts, conventions and examples from the managed knowledge base
212
+ so the agent is grounded in your stack and project, not just the base model. Set `kb_project`
213
+ in the config to the project whose knowledge you want queried. A shared layer is available to
214
+ every tenant; your own project's knowledge stays isolated to your key.
215
+
216
+ Point it at a git repo: `talos kb index git:<url>[@ref][#subdir]` shallow-clones and ingests it,
217
+ e.g. `talos kb index git:https://github.com/laravel/docs.git@11.x` or `...next.js.git@canary#docs`.
218
+ Re-running re-clones; the ref is part of each document id, so only changed files re-embed and a new
219
+ tag ingests cleanly.
220
+
221
+ You can also feed it from the cloud, privately: `talos kb index rclone:<remote>:<path>` pulls from
222
+ Google Drive, Dropbox, OneDrive, S3 or any of rclone's 70+ backends. It runs on your machine via
223
+ your own `rclone` config — Talos copies the files to a temp dir locally, ingests them through your
224
+ token, and deletes the copy. We never see or store your cloud credentials and never handle your raw
225
+ files; only the embedded chunks land in your isolated tenant. The incremental manifest keeps re-runs
226
+ cheap, so pointing it at a folder repeatedly is a real keep-in-sync flow.
227
+
228
+ Keep it in sync automatically: list your sources in `kb_sync_sources` (local folders or
229
+ `rclone:` cloud stores) and `talos kb sync` ingests them incrementally — pair it with the
230
+ systemd-user timer in `contrib/systemd/` and a file dropped in your Drive/Dropbox shows up in your
231
+ KB a few hours later, no manual step. `talos kb sources` shows what you have configured, whether
232
+ each source is reachable, and how many documents are already tracked — a quick offline view of what
233
+ Talos is learning from, no key required. When you are logged in it also lists the shared knowledge
234
+ Talos ships with (the managed source registry served by the gateway).
235
+
236
+ Feed it with `talos kb add <file|url> ...` or `talos kb index <folder>`: your documents go to
237
+ the gateway in one authenticated call, which chunks and embeds them server-side into your tenant
238
+ — files never leave through anything but the API, and the database is never exposed. Text, code
239
+ and structured files (Excel/Word/CSV/JSON/PDF) and web pages are supported. `--dry-run` previews,
240
+ `--project` targets a project, `--append` keeps existing entries.
241
+
242
+ ### Skills
243
+
244
+ Skills are reusable instruction packs. Create `~/.talos/skills/<name>/SKILL.md` (global) or
245
+ `<project>/.talos/skills/<name>/SKILL.md` with frontmatter:
246
+
247
+ ```
248
+ ---
249
+ name: my-skill
250
+ description: One line shown in the catalog
251
+ ---
252
+ # Instructions the agent follows when this skill applies
253
+ ```
254
+
255
+ Talos lists installed skills by name and description in the system prompt and pulls the full
256
+ instructions on demand (so idle skills cost almost no tokens). `/skills` lists them. Example
257
+ packs live in this repo under `skills/` — copy one into `~/.talos/skills/` to try it. Skills
258
+ work alongside your `TALOS.md` project rules.
259
+
260
+ ## How learning works
261
+
262
+ 1. Your coding sessions are captured locally (a Claude Code hook plus `talos backfill`).
263
+ 2. Coding sessions are converted to chat-format training rows and submitted to the backend.
264
+ 3. The backend trains a private adapter for your tenant on a schedule.
265
+ 4. The improved adapter serves your next sessions.
266
+
267
+ A stronger teacher model reviews the assistant's answers; its corrections become the
268
+ preferred training signal, so the model learns from mistakes rather than its own output.
269
+
270
+ Your own verdict counts too. When you rate an answer in chat with `/good` or `/bad`, that
271
+ verdict shapes the training data: `talos backfill` also reads Talos's own agent sessions
272
+ (`~/.talos/sessions/`), keeps a turn you rated good as a positive example (even a plain answer
273
+ with no code edits), and drops a turn you rated bad. This closes the loop — your feedback is the
274
+ label the next training cycle learns from.
275
+
276
+ Real outcomes are labels too. Talos records what happens at each tool call — whether you accepted
277
+ or rejected a write/edit, a command's exit code, and whether a verification command (tests, linter,
278
+ build) passed. `talos backfill` turns these into free labels: a change you rejected is dropped, a
279
+ turn whose verification passed is kept as a `verified` positive example, a failed verification
280
+ stays unlabeled. So the model is reinforced on work that demonstrably passed and filtered away from
281
+ work that failed or you threw away — no manual thumbs-up needed.
282
+
283
+ ### Training-data quality
284
+
285
+ `talos backfill` only keeps a turn when it edited real source under your `code_root`. Edits to
286
+ memory files, logs, lockfiles, images, build artefacts, and paths like `.claude/`, `vendor/`,
287
+ `node_modules/`, or `.git/` are dropped, and infrastructure shell commands (`ssh`, `rsync`,
288
+ `systemctl`, deploy scripts) are stripped from the answer. The run reports how many noise edits
289
+ and non-code turns it skipped.
290
+
291
+ The practice loop's teacher corrections are preference pairs: the corrected answer is *chosen*,
292
+ the model's own attempt is *rejected*. They are staged locally to `~/.talos/staging/coder-dpo.jsonl`
293
+ as they are produced. `talos dpo-export` turns them into `{prompt, chosen, rejected}` rows
294
+ (`~/.talos/staging/coder-dpo-pairs.jsonl`) ready for DPO/preference training.
@@ -0,0 +1,275 @@
1
+ # Talos CLI
2
+
3
+ Fixit's AI agent for your terminal — coding, your stack, and business work. The ai.fixit.gr
4
+ controller routes each request to the right model (chat runs on gpt-oss:120b), so you get a
5
+ strong answer without picking a model. Your reviewed sessions feed the knowledge base and evals.
6
+
7
+ It is a thin, config-driven client. The model, training, and GPU run on the managed Talos
8
+ backend; the CLI only talks to it over HTTPS with your API key. Your data trains your own
9
+ private, tenant-isolated adapter and is never shared with other tenants.
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ pipx install talos-cli
15
+ talos login
16
+ ```
17
+
18
+ `talos login` opens a device-authorization flow: it prints a URL and a code, you approve in
19
+ the browser at your Talos account, and the token is stored for you. (Advanced: `talos init`
20
+ writes the config by hand instead.)
21
+
22
+ `talos init` writes `~/.talos/config.toml`:
23
+
24
+ | Key | Meaning | Default |
25
+ |-----|---------|---------|
26
+ | `gateway_url` | Talos backend endpoint | `https://ai.fixit.gr` |
27
+ | `api_key` | Your tenant API key | — |
28
+ | `model` | Model alias | `chat-primary` |
29
+ | `code_root` | Where your repos live | `~/Code` |
30
+ | `token_budget` | Weekly cap for the practice loop | `100000` |
31
+ | `persona` | `developer` / `business` / `hybrid` | inferred from role |
32
+ | `show_tokens` | force per-step token + tool detail on/off | by persona |
33
+
34
+ Every value can be overridden by an env var (`TALOS_GATEWAY_URL`, `TALOS_API_KEY`, ...).
35
+
36
+ ### Personas
37
+
38
+ The same Talos serves two audiences; the persona tailors the system prompt and how much detail it
39
+ shows:
40
+
41
+ - **developer** — the coding agent: writes and reviews code, runs tests/builds, and prints the
42
+ per-step token and tool details.
43
+ - **business** — a plain-language business assistant: reads your documents and spreadsheets, writes
44
+ reports and content, and keeps the output quiet (no code, no token spam).
45
+ - **hybrid** — both.
46
+
47
+ The persona is taken from `persona` in your config, otherwise inferred from your profile role,
48
+ otherwise `developer`. `talos persona` shows the current one and the options; `talos persona
49
+ business` sets it; inside a chat, `/persona business` switches live. `show_tokens = true|false`
50
+ overrides the per-step detail regardless of persona (you can also toggle it for a session with
51
+ `/verbose`).
52
+
53
+ ## Commands
54
+
55
+ Just run `talos` with no arguments to drop straight into the interactive session (same as
56
+ `talos chat`) — it opens clean, no command dump. Type `help` (or `/help`) any time to see the
57
+ role-aware list of what you can do: a customer sees chat, knowledge base, profile and sync; an
58
+ admin also sees training, eval, promote and the system commands, built from your key's real
59
+ scopes. If you are not logged in yet it runs `talos login` first. (Piped or non-interactive —
60
+ `talos | head`, CI — it prints the static command list instead.)
61
+
62
+ | Command | What it does |
63
+ |---------|--------------|
64
+ | `talos` | Enter the interactive session directly (type `help` for what your role can do) |
65
+ | `talos login` | Authorize via device code; stores the token |
66
+ | `talos init` | Write or update the config file by hand |
67
+ | `talos status` | Show gateway, model, and your key's client_id and scopes |
68
+ | `talos status --system` | (admin) What is running: training state, GPU, loaded models, services |
69
+ | `talos chat ["prompt"]` | Interactive chat, or one-shot if a prompt is given |
70
+ | `talos backfill` | Convert existing Claude Code transcripts to training rows |
71
+ | `talos submit` | Upload staged training rows to the backend |
72
+ | `talos loop` | Run the bounded practice loop (teacher-reviewed self-training) |
73
+ | `talos dpo-export` | Convert collected DPO rows into prompt/chosen/rejected pairs |
74
+
75
+ ## Agent capabilities
76
+
77
+ In a session Talos can read and edit code, run shell/ssh commands, find files (`glob`),
78
+ fetch web pages (`web_fetch`), drive Bitbucket (`bitbucket`), consult the knowledge base
79
+ (`kb_search`), and read structured
80
+ documents with `read_file` — Excel (`.xlsx`/`.xlsm`), Word (`.docx`), `.csv`/`.tsv`, `.json`
81
+ and `.pdf` (pdf needs `pdftotext`). Spreadsheets and Word files are parsed with the standard
82
+ library, no extra packages.
83
+
84
+ It can also **write** real Office and data files with `write_doc`: `.xlsx` (Excel) and
85
+ `.csv`/`.tsv` from tab-separated rows (numbers stored as numbers, so totals work) and `.docx`
86
+ (Word) with one paragraph per line. `.xlsx`/`.docx` need the optional extra — install with
87
+ `pip install talos-cli[files]` (openpyxl + python-docx); `.csv`/`.tsv` work out of the box. So the
88
+ business skills can read your Excel/Word and hand back a finished spreadsheet or document.
89
+
90
+ ### Bitbucket
91
+
92
+ The `bitbucket` tool lets Talos run the full branch -> PR -> review -> merge workflow with your
93
+ own Bitbucket credentials, locally — it talks to the Bitbucket API directly (same trust model as
94
+ git/ssh), never through the gateway. It can list repos, list and read pull requests with their
95
+ review comments, create a PR, reply to a review, merge, check pipeline/CI status, and create a
96
+ branch. Configure it once:
97
+
98
+ ```toml
99
+ bitbucket_user = "your-bitbucket-username"
100
+ bitbucket_token = "app-password-with-pullrequest-and-repo-scopes"
101
+ bitbucket_workspace = "your-workspace" # optional; lets you pass just the repo slug
102
+ ```
103
+
104
+ (or `TALOS_BITBUCKET_USER` / `TALOS_BITBUCKET_TOKEN` / `TALOS_BITBUCKET_WORKSPACE`). The tool
105
+ defaults to `ask`, so each action is confirmed before it runs. A PR's outcome (merged / declined)
106
+ also becomes a training label for the self-improving loop.
107
+
108
+ ### MCP tool servers
109
+
110
+ Talos can use tools from any [Model Context Protocol](https://modelcontextprotocol.io) server,
111
+ either remote (HTTP) or local (a subprocess over stdio). Declare one block per server in
112
+ `~/.talos/config.toml`:
113
+
114
+ ```toml
115
+ # remote HTTP server
116
+ [mcp.vita4you]
117
+ url = "https://your-host/mcp"
118
+ token = "optional-bearer-token" # sent as Authorization: Bearer ...
119
+ # enabled = false # temporarily turn a server off
120
+ # timeout = 30
121
+
122
+ # local stdio server (a subprocess speaking newline-delimited JSON-RPC)
123
+ [mcp.fixit]
124
+ command = "python3"
125
+ args = ["/home/me/docker/scripts/memory-mcp-server.py"]
126
+ [mcp.fixit.env] # optional environment for the subprocess
127
+ FIXIT_MEMORY_DIR = "/home/me/.claude/projects/.../memory"
128
+ ```
129
+
130
+ On startup Talos connects to each server (`initialize` → `tools/list`), and its tools are offered
131
+ to the model namespaced as `<server>__<tool>` (e.g. `vita4you__get_order_details`). When the model
132
+ calls one, Talos forwards it as an MCP `tools/call` and feeds the result back. MCP tools default to
133
+ `ask` (each external call is confirmed). Both plain-JSON and `text/event-stream` (Streamable HTTP)
134
+ responses are handled, and a `Mcp-Session-Id` is captured and resent. `talos mcp` lists the
135
+ configured servers and tests connectivity; `/mcp` does the same inside a chat. A server that is
136
+ unreachable at startup is skipped with a warning — it never blocks the CLI. Local stdio servers are
137
+ launched as a subprocess and shut down cleanly when the chat ends.
138
+
139
+ ### Streaming
140
+
141
+ In plain chat (`/agent off`) the reply streams in token by token as the model produces it, so you
142
+ see the answer forming instead of waiting for the whole thing; a spinner shows until the first
143
+ token and it falls back to a buffered reply if the gateway is not streaming. The agentic tool-loop
144
+ turn stays buffered because it needs the complete response to detect tool calls.
145
+
146
+ ### Sub-agent delegation
147
+
148
+ For a big task the agent can call `delegate` to hand a focused, self-contained piece of work to a
149
+ fresh sub-agent that has the same tools but its own clean context (e.g. "analyse module X and
150
+ summarise its API"). The sub-agent shares your gateway, permissions and weekly token budget, runs
151
+ with a smaller step cap, and returns its answer to the main agent; it cannot delegate further. This
152
+ keeps the main conversation focused instead of filling it with exploration.
153
+
154
+ ### Sync across machines
155
+
156
+ Your setup follows you. `talos sync push` uploads your config (model, kb_project, token budget),
157
+ shortcuts, per-tool permissions, your global `~/.talos/TALOS.md` and your skills to your account;
158
+ `talos sync pull` restores them on another machine (`talos sync status` shows what is stored). A
159
+ fresh `talos login` pulls them automatically, so a new machine is ready instantly. Secrets — your
160
+ API key and Bitbucket token — are never uploaded, and machine-local paths stay local.
161
+
162
+ ### Profile
163
+
164
+ Tell Talos who you are once and it adapts to you: `talos profile --role developer --about "I run
165
+ a Magento shop" --preferences "answer in Greek, be terse"` (run `talos profile` to view). Your role
166
+ (developer / marketing / founder / ...), a short about, and your preferences are loaded at the start
167
+ of every session and honoured by the agent. It is stored on your account and synced across machines,
168
+ and it is the same data the customer-portal onboarding wizard fills — so even a non-developer gets a
169
+ Talos pointed in the right direction from the first message.
170
+
171
+ ### Memory
172
+
173
+ Talos keeps a persistent memory of durable facts and preferences about you — your role, your stack,
174
+ how you like answers, standing instructions. It loads them at the start of every session and works
175
+ with them in mind, and saves a new one (via its `remember` tool) when you tell it something lasting.
176
+ `/remember` shows what is stored and `/remember <fact>` adds one by hand. Memory lives on your
177
+ account (keyed by your client_id), so it follows you to every machine you log in from; it is distinct
178
+ from the knowledge base (documents you ingest) — this is who *you* are.
179
+
180
+ ### Learned rules
181
+
182
+ Where memory is about *you*, rules are about *how to write the code*. When Talos learns a durable
183
+ convention during a session — from a correction, a repeated review note, a project standard — it
184
+ proposes it with its `propose_rule` tool instead of quietly drifting. Proposals are not applied
185
+ automatically: `talos rules` lists them, `talos rules accept <id>` adds the rule to your
186
+ `~/.talos/TALOS.md` (which Talos loads as project rules, so it takes effect next session), and
187
+ `talos rules reject <id>` files it in a rejected buffer so it is never proposed again. You are the
188
+ gate; nothing changes how Talos behaves until you accept it.
189
+
190
+ ### Knowledge base
191
+
192
+ `kb_search` retrieves relevant facts, conventions and examples from the managed knowledge base
193
+ so the agent is grounded in your stack and project, not just the base model. Set `kb_project`
194
+ in the config to the project whose knowledge you want queried. A shared layer is available to
195
+ every tenant; your own project's knowledge stays isolated to your key.
196
+
197
+ Point it at a git repo: `talos kb index git:<url>[@ref][#subdir]` shallow-clones and ingests it,
198
+ e.g. `talos kb index git:https://github.com/laravel/docs.git@11.x` or `...next.js.git@canary#docs`.
199
+ Re-running re-clones; the ref is part of each document id, so only changed files re-embed and a new
200
+ tag ingests cleanly.
201
+
202
+ You can also feed it from the cloud, privately: `talos kb index rclone:<remote>:<path>` pulls from
203
+ Google Drive, Dropbox, OneDrive, S3 or any of rclone's 70+ backends. It runs on your machine via
204
+ your own `rclone` config — Talos copies the files to a temp dir locally, ingests them through your
205
+ token, and deletes the copy. We never see or store your cloud credentials and never handle your raw
206
+ files; only the embedded chunks land in your isolated tenant. The incremental manifest keeps re-runs
207
+ cheap, so pointing it at a folder repeatedly is a real keep-in-sync flow.
208
+
209
+ Keep it in sync automatically: list your sources in `kb_sync_sources` (local folders or
210
+ `rclone:` cloud stores) and `talos kb sync` ingests them incrementally — pair it with the
211
+ systemd-user timer in `contrib/systemd/` and a file dropped in your Drive/Dropbox shows up in your
212
+ KB a few hours later, no manual step. `talos kb sources` shows what you have configured, whether
213
+ each source is reachable, and how many documents are already tracked — a quick offline view of what
214
+ Talos is learning from, no key required. When you are logged in it also lists the shared knowledge
215
+ Talos ships with (the managed source registry served by the gateway).
216
+
217
+ Feed it with `talos kb add <file|url> ...` or `talos kb index <folder>`: your documents go to
218
+ the gateway in one authenticated call, which chunks and embeds them server-side into your tenant
219
+ — files never leave through anything but the API, and the database is never exposed. Text, code
220
+ and structured files (Excel/Word/CSV/JSON/PDF) and web pages are supported. `--dry-run` previews,
221
+ `--project` targets a project, `--append` keeps existing entries.
222
+
223
+ ### Skills
224
+
225
+ Skills are reusable instruction packs. Create `~/.talos/skills/<name>/SKILL.md` (global) or
226
+ `<project>/.talos/skills/<name>/SKILL.md` with frontmatter:
227
+
228
+ ```
229
+ ---
230
+ name: my-skill
231
+ description: One line shown in the catalog
232
+ ---
233
+ # Instructions the agent follows when this skill applies
234
+ ```
235
+
236
+ Talos lists installed skills by name and description in the system prompt and pulls the full
237
+ instructions on demand (so idle skills cost almost no tokens). `/skills` lists them. Example
238
+ packs live in this repo under `skills/` — copy one into `~/.talos/skills/` to try it. Skills
239
+ work alongside your `TALOS.md` project rules.
240
+
241
+ ## How learning works
242
+
243
+ 1. Your coding sessions are captured locally (a Claude Code hook plus `talos backfill`).
244
+ 2. Coding sessions are converted to chat-format training rows and submitted to the backend.
245
+ 3. The backend trains a private adapter for your tenant on a schedule.
246
+ 4. The improved adapter serves your next sessions.
247
+
248
+ A stronger teacher model reviews the assistant's answers; its corrections become the
249
+ preferred training signal, so the model learns from mistakes rather than its own output.
250
+
251
+ Your own verdict counts too. When you rate an answer in chat with `/good` or `/bad`, that
252
+ verdict shapes the training data: `talos backfill` also reads Talos's own agent sessions
253
+ (`~/.talos/sessions/`), keeps a turn you rated good as a positive example (even a plain answer
254
+ with no code edits), and drops a turn you rated bad. This closes the loop — your feedback is the
255
+ label the next training cycle learns from.
256
+
257
+ Real outcomes are labels too. Talos records what happens at each tool call — whether you accepted
258
+ or rejected a write/edit, a command's exit code, and whether a verification command (tests, linter,
259
+ build) passed. `talos backfill` turns these into free labels: a change you rejected is dropped, a
260
+ turn whose verification passed is kept as a `verified` positive example, a failed verification
261
+ stays unlabeled. So the model is reinforced on work that demonstrably passed and filtered away from
262
+ work that failed or you threw away — no manual thumbs-up needed.
263
+
264
+ ### Training-data quality
265
+
266
+ `talos backfill` only keeps a turn when it edited real source under your `code_root`. Edits to
267
+ memory files, logs, lockfiles, images, build artefacts, and paths like `.claude/`, `vendor/`,
268
+ `node_modules/`, or `.git/` are dropped, and infrastructure shell commands (`ssh`, `rsync`,
269
+ `systemctl`, deploy scripts) are stripped from the answer. The run reports how many noise edits
270
+ and non-code turns it skipped.
271
+
272
+ The practice loop's teacher corrections are preference pairs: the corrected answer is *chosen*,
273
+ the model's own attempt is *rejected*. They are staged locally to `~/.talos/staging/coder-dpo.jsonl`
274
+ as they are produced. `talos dpo-export` turns them into `{prompt, chosen, rejected}` rows
275
+ (`~/.talos/staging/coder-dpo-pairs.jsonl`) ready for DPO/preference training.
@@ -0,0 +1,31 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "talos-ai"
7
+ version = "0.63.1"
8
+ description = "Talos: Fixit's terminal AI agent for coding and business work, model-routed by the ai.fixit.gr controller"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = { text = "Proprietary" }
12
+ authors = [{ name = "Fixit E.E.", email = "info@fixit.gr" }]
13
+ keywords = ["llm", "coding-assistant", "fine-tuning"]
14
+ dependencies = []
15
+
16
+ [project.urls]
17
+ Homepage = "https://www.fixit.gr"
18
+ Documentation = "https://ai.fixit.gr"
19
+
20
+ [project.optional-dependencies]
21
+ teacher = ["anthropic>=0.40"]
22
+ files = ["openpyxl>=3.1", "python-docx>=1.1"]
23
+
24
+ [project.scripts]
25
+ talos = "talos_cli.__main__:main"
26
+
27
+ [tool.setuptools]
28
+ packages = ["talos_cli"]
29
+
30
+ [tool.setuptools.package-data]
31
+ talos_cli = ["capture_hook.sh", "bundled_skills/*/SKILL.md"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+