kimi-cli 0.39__py3-none-any.whl → 0.41__py3-none-any.whl

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.

Potentially problematic release.


This version of kimi-cli might be problematic. Click here for more details.

Files changed (52) hide show
  1. kimi_cli/CHANGELOG.md +23 -0
  2. kimi_cli/__init__.py +18 -280
  3. kimi_cli/agents/koder/system.md +1 -1
  4. kimi_cli/agentspec.py +104 -0
  5. kimi_cli/cli.py +235 -0
  6. kimi_cli/constant.py +4 -0
  7. kimi_cli/llm.py +69 -0
  8. kimi_cli/prompts/__init__.py +2 -2
  9. kimi_cli/soul/__init__.py +102 -6
  10. kimi_cli/soul/agent.py +157 -0
  11. kimi_cli/soul/approval.py +2 -4
  12. kimi_cli/soul/compaction.py +10 -10
  13. kimi_cli/soul/context.py +5 -0
  14. kimi_cli/soul/globals.py +92 -0
  15. kimi_cli/soul/kimisoul.py +26 -30
  16. kimi_cli/soul/message.py +5 -5
  17. kimi_cli/tools/bash/__init__.py +2 -2
  18. kimi_cli/tools/dmail/__init__.py +1 -1
  19. kimi_cli/tools/file/glob.md +1 -1
  20. kimi_cli/tools/file/glob.py +2 -2
  21. kimi_cli/tools/file/grep.py +3 -2
  22. kimi_cli/tools/file/patch.py +2 -2
  23. kimi_cli/tools/file/read.py +1 -1
  24. kimi_cli/tools/file/replace.py +2 -2
  25. kimi_cli/tools/file/write.py +2 -2
  26. kimi_cli/tools/task/__init__.py +23 -22
  27. kimi_cli/tools/task/task.md +1 -1
  28. kimi_cli/tools/todo/__init__.py +1 -1
  29. kimi_cli/tools/utils.py +1 -1
  30. kimi_cli/tools/web/fetch.py +2 -1
  31. kimi_cli/tools/web/search.py +4 -4
  32. kimi_cli/ui/__init__.py +0 -69
  33. kimi_cli/ui/acp/__init__.py +8 -9
  34. kimi_cli/ui/print/__init__.py +17 -35
  35. kimi_cli/ui/shell/__init__.py +9 -15
  36. kimi_cli/ui/shell/liveview.py +13 -4
  37. kimi_cli/ui/shell/metacmd.py +3 -3
  38. kimi_cli/ui/shell/setup.py +7 -6
  39. kimi_cli/ui/shell/update.py +4 -3
  40. kimi_cli/ui/shell/visualize.py +18 -9
  41. kimi_cli/utils/aiohttp.py +10 -0
  42. kimi_cli/utils/changelog.py +3 -1
  43. kimi_cli/wire/__init__.py +57 -0
  44. kimi_cli/{soul/wire.py → wire/message.py} +4 -39
  45. {kimi_cli-0.39.dist-info → kimi_cli-0.41.dist-info}/METADATA +35 -2
  46. kimi_cli-0.41.dist-info/RECORD +85 -0
  47. kimi_cli-0.41.dist-info/entry_points.txt +3 -0
  48. kimi_cli/agent.py +0 -261
  49. kimi_cli/utils/provider.py +0 -72
  50. kimi_cli-0.39.dist-info/RECORD +0 -80
  51. kimi_cli-0.39.dist-info/entry_points.txt +0 -3
  52. {kimi_cli-0.39.dist-info → kimi_cli-0.41.dist-info}/WHEEL +0 -0
@@ -0,0 +1,85 @@
1
+ kimi_cli/CHANGELOG.md,sha256=123552f382ba5832f923e1c03878e563423d92a7ff5f9a55014686e069e7056c,7648
2
+ kimi_cli/__init__.py,sha256=17c8048d23b3d27c3c4645ebc541d14bd2e42071db6d6df5abee06a7256d7541,4249
3
+ kimi_cli/agents/koder/README.md,sha256=2d9a987110652915cd1a4356caec3eef9380479ce36906c377a1ed177d46690f,96
4
+ kimi_cli/agents/koder/agent.yaml,sha256=f1c5c585e8e0a52419c820d56a4aa928eebdf7bb21f0907d6c02d4ea1c8909d7,709
5
+ kimi_cli/agents/koder/sub.yaml,sha256=e0c1ea34fdb04b0d6dc635709f0f130aff25d7f9fb97e238470143c8145be251,634
6
+ kimi_cli/agents/koder/system.md,sha256=1d8fd4956b2442215396b5e9651771c9da8f9505ccbd3b6d5e91b1ac4ff35418,5001
7
+ kimi_cli/agentspec.py,sha256=fc5d180fe27a50a7d1b616c2ee6cffb823f8d9990f724250110c2d489b89ae9b,3973
8
+ kimi_cli/cli.py,sha256=6e1de173cd73c6d49f8922dd07fc4f177bcfe038416c3fe3e7d464759f7dd50d,6229
9
+ kimi_cli/config.py,sha256=37dd65f2aa03c051dc92d09d9c110361ee35bb8dc94eced2c1e8bf01e3918353,4157
10
+ kimi_cli/constant.py,sha256=78e25b9304cca7b6f70bb08bf0e1fee4b066297a05386e56dd6935ba42027cd9,110
11
+ kimi_cli/llm.py,sha256=4c807741b6073fc18533baf6025f2351035690e94d7993dc9e3ef9a1050e7022,2668
12
+ kimi_cli/metadata.py,sha256=70c01da57529a9f585c0c5f3dd642f92ef16c4e49a107d8da838fa6d4746546a,3933
13
+ kimi_cli/prompts/__init__.py,sha256=6dc5ed2d841f145c09550075f30853cdc51f00d2f5d9aa1097f8edea770536e7,174
14
+ kimi_cli/prompts/compact.md,sha256=6655bd7d8270b24d8f97b51ef7c471cf71d686c56f8ec9a5cc9e47caa3aae87c,1877
15
+ kimi_cli/prompts/init.md,sha256=d271a0df6dd7b330ffec4f645a74c0392dafc1b3bfc1e3f2a77624e96cf6abbe,1380
16
+ kimi_cli/py.typed,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
17
+ kimi_cli/share.py,sha256=4292df7f44177419c45c772a933b5f36e2b7533f8cef9842629a438bc7856dc0,204
18
+ kimi_cli/soul/__init__.py,sha256=c1c09bb719c46db8d95873e4ef9856cbef92f54035829749c779ab0fad3dfc50,4702
19
+ kimi_cli/soul/agent.py,sha256=cc9ae5b903f7048372fe15833ac95ab9b694eefb0b97981321f51be5fe247560,4942
20
+ kimi_cli/soul/approval.py,sha256=48cd230dff81dfd70bd85f1ad2b99604d5569cf617a4c79c444f9772bbc89ce6,2552
21
+ kimi_cli/soul/compaction.py,sha256=dab17979060fceeed4a7a344373833022dc7abac04282364f2a1b20e6edd4581,3558
22
+ kimi_cli/soul/context.py,sha256=5536c54186ca3df22ad33007e37588228fd1097f0cb8aab68b634433e8cd0ad6,5993
23
+ kimi_cli/soul/denwarenji.py,sha256=66b95f052a1fa844e2347972d34e1916a7be24d3e493701b451f5380b0375c9f,1384
24
+ kimi_cli/soul/globals.py,sha256=fe85cfb616671c06f4b9eb9fcbef78929169e18d26a6abb3c6d3efd686593c97,2638
25
+ kimi_cli/soul/kimisoul.py,sha256=44fa91ff54902adc142588c4168a7919ea342759c5e5412cae660fac07802984,11658
26
+ kimi_cli/soul/message.py,sha256=b0fce0a0901fad38f2778b85f82427d4a42906891893a643e537a9268eb6e190,2529
27
+ kimi_cli/soul/toolset.py,sha256=60166d89ef0efac690fa6866e88afe70fbe80ad862ba2524d70ddf657a730d14,744
28
+ kimi_cli/tools/__init__.py,sha256=4d612402814eede7182e0a55e7dd21c4532b5dd44700dc744763a8308c2f74f8,3280
29
+ kimi_cli/tools/bash/__init__.py,sha256=de21b19c714bda53f6c89e3348c4c82fb4278040130fed1d261b3ab203054e8c,3028
30
+ kimi_cli/tools/bash/bash.md,sha256=5d9cc54b3718097951340b0a737c8e1fa308341fd2c4ebd121be94de31dd5f73,2348
31
+ kimi_cli/tools/dmail/__init__.py,sha256=a9186ed4e52c34cab7516060bb6edca73324912233b1581c0d3a40b026400133,1277
32
+ kimi_cli/tools/dmail/dmail.md,sha256=0d18cae387dd52127ddc99e296253c09e68ccba5f343153c0adbe77d7586e759,1912
33
+ kimi_cli/tools/file/__init__.py,sha256=1516fb4c71097f9c14b605e7b9a1872af8786bdcb48323d1fa83bb1419436abb,546
34
+ kimi_cli/tools/file/glob.md,sha256=11fbfaf6033f57b69c6f91077ddd90505036937cd7217600d96992b9a48b7ca7,1400
35
+ kimi_cli/tools/file/glob.py,sha256=24f52f61e0c9dff7eb2e8138238de365d17f90dfff6555b27e741bf5f7bc43a6,5413
36
+ kimi_cli/tools/file/grep.md,sha256=12353db42cf3b5d9d91ac7c0f0b9c2a732e8b050c23a78f4e668db823cca4d50,245
37
+ kimi_cli/tools/file/grep.py,sha256=01794320049b46207aeb28bd7f3dbea373ede891916107cab871ea959e81a335,9787
38
+ kimi_cli/tools/file/patch.md,sha256=f9edbed6c6a03bf7448a51acc1f42622395fd7f1674a814e9a3b2302d3b7b92e,404
39
+ kimi_cli/tools/file/patch.py,sha256=022262263a062bbc3418c132588b5c1e039a0e6c3572af5389193b5aea235027,5228
40
+ kimi_cli/tools/file/read.md,sha256=4c2d83e557daadc0612fb1a613e252b2c8e4df7ae57e6db094e9e75e994cb23b,1066
41
+ kimi_cli/tools/file/read.py,sha256=5d452270c9e0e668276cc3dfad56d5b26c8431a8b0d9b97d0d4484c8e62b5faa,5068
42
+ kimi_cli/tools/file/replace.md,sha256=f429f263fa580f2f6107907a33ba8800dcdbd4fc1d9ff8dc4f858bd76ec6bbc6,267
43
+ kimi_cli/tools/file/replace.py,sha256=615bb2d1e4d14f5f2c3e780af69b0f69b23f4b610f451077c93d57a1ca860cf1,5204
44
+ kimi_cli/tools/file/write.md,sha256=f37b0f4742da57797ec4dd29fbd4fdc9b6617c6be644724a3b16d651c6129cec,324
45
+ kimi_cli/tools/file/write.py,sha256=9aff67ce8817adf223f9bd982c7ad5d8b13f4d33b221147ac3253035d3a2b7a7,4378
46
+ kimi_cli/tools/mcp.py,sha256=12f63c9ee5b82a5b0f23daca0b5ce4ceb3a6190ce5b553ee24e499699521e426,3620
47
+ kimi_cli/tools/task/__init__.py,sha256=e671d9ea87c811104629eaaf8a1f8e9c3c82b0294354683dba6747ea528bdbcd,6032
48
+ kimi_cli/tools/task/task.md,sha256=391cc3553c7d310a323626bae180dd41cb810fb1233583713ebde105f954147a,2280
49
+ kimi_cli/tools/test.py,sha256=c094a91a2d1a5259e192f1147facd5eebd5e5c413787fce167db90e4b41b5119,1442
50
+ kimi_cli/tools/think/__init__.py,sha256=31b06088e2404cb09d42e0acec97c185e4861890bb687f28b41f39cea01b5733,603
51
+ kimi_cli/tools/think/think.md,sha256=ab40d4de1d8adb208384a4ab548e35776283cb0a681c6e208b041fc40ccba724,200
52
+ kimi_cli/tools/todo/__init__.py,sha256=aa02c8afa19d9ae2ef1f6ffee147dc96732a9cb9895aa5e13fe0f9efe753fe00,897
53
+ kimi_cli/tools/todo/set_todo_list.md,sha256=89509503f43ab321d440a04dc133ddc3e29859f68907a42c39e6093f7bfd485c,1654
54
+ kimi_cli/tools/utils.py,sha256=2e00d6f04f91e05a91bfb691e547a76193063fa6769a03f7d3ff992aba9372bf,4596
55
+ kimi_cli/tools/web/__init__.py,sha256=e13108c598828a8a05907a7a821e7ac92f5d63572bb9866dc12ca026094acb42,95
56
+ kimi_cli/tools/web/fetch.md,sha256=56d00bd93b4e379c4f7efe445fce963eb26b8d20f85d4c19097ba6f33bd0019a,67
57
+ kimi_cli/tools/web/fetch.py,sha256=66448121d27d67f75b977c32244c721c2ccff1b2e097c2fe6717e66018d8f747,3183
58
+ kimi_cli/tools/web/search.md,sha256=24049f9e90d37083e0fc78b8b2e3a5f6fadf09bea00f36712b235d1212a2f532,146
59
+ kimi_cli/tools/web/search.py,sha256=2f72c82ed1f775db9fed2ef1ceb1a26184b745805d11f070e198a2c16668c152,4347
60
+ kimi_cli/ui/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
61
+ kimi_cli/ui/acp/__init__.py,sha256=cc8bf39f342de7661134f282369b286bb6c4571b1e0001a0cb216207a62d709c,17354
62
+ kimi_cli/ui/print/__init__.py,sha256=10590ec04b8d0f8d1593471c40fc96d7062854f3fbc81a6822703d8118310fd1,5730
63
+ kimi_cli/ui/shell/__init__.py,sha256=35e3a4a29e8610bc214a696c064746db8d19e991f014904e9ef2bd3845e63947,10708
64
+ kimi_cli/ui/shell/console.py,sha256=bcbf7efd214cba3d2259f2a2c1842250cde96d49e4f9f1e0b60273cf1c366be3,842
65
+ kimi_cli/ui/shell/debug.py,sha256=cd4e7259c83f099b5c6519713be5306580f30d3fa4944e07916d4468e960c9c7,5562
66
+ kimi_cli/ui/shell/keyboard.py,sha256=8735c00363484263681adf885baec824e5f76cb4084bd024651e80190926edc5,3035
67
+ kimi_cli/ui/shell/liveview.py,sha256=f4e6ac37c446740b5c55cf37d5ebd327b5d41334d41d5e54ad8ad15445c1a492,14239
68
+ kimi_cli/ui/shell/metacmd.py,sha256=69ef37801f9d5ce513717d6351966f54f363c5ce41b176e98a0fc8b71fe5a78c,7786
69
+ kimi_cli/ui/shell/prompt.py,sha256=f85446d77b998e2594380c29000b06614e3fae8537db46ec96fc5ddc25490b45,19096
70
+ kimi_cli/ui/shell/setup.py,sha256=36be348c8cdbb908f1b896f7dfd93802df4d76eeb8572d39b81a34dfd5ee2a3c,5374
71
+ kimi_cli/ui/shell/update.py,sha256=56dcb0bd1da82b98c22bfdddca717a2805bd8ac3e93bf23fb3b508549c41fae8,7340
72
+ kimi_cli/ui/shell/visualize.py,sha256=7035d53e41ae59e5df7008759ee4f14e44352cc4ac087c6b67d784a7dd51c733,4291
73
+ kimi_cli/utils/aiohttp.py,sha256=f8f61e3beaf6439e949c33c3a10db3035bf88136e882b09c858ea92a4c888e00,245
74
+ kimi_cli/utils/changelog.py,sha256=bfcf5a5a360b13648bb7a6abc83e427270caa502646b5acc950d62148510641c,3402
75
+ kimi_cli/utils/logging.py,sha256=129298ac214ecd8d913c3431cc05d754f9c4c8c4042c458618bf9e8ddebdb763,399
76
+ kimi_cli/utils/message.py,sha256=ca8f8d3c7dc6d4fce938d1cfe8a7a7343e39ce1e2f0c7b2d76d838edc7d9f187,304
77
+ kimi_cli/utils/path.py,sha256=fdd4fc08999ddc7c610f884b4ba8d27932248b9ed06b5eb4139519edd00b3f75,687
78
+ kimi_cli/utils/pyinstaller.py,sha256=e5d709d0490ef8645bbed2d2363920c59f25bd17c04f471bf4a8c0fa2ebe1801,581
79
+ kimi_cli/utils/string.py,sha256=f8a842ee014b9023d4045392f33ca6f576f5238ad3d40cb6df071a3ce9f5ed9c,365
80
+ kimi_cli/wire/__init__.py,sha256=92514141ef99c2923dacba48e7c96692d636848e3b222de7de9f696691cc1aaa,1427
81
+ kimi_cli/wire/message.py,sha256=72222d3f3d7228a323dbba7b1084f35018104c58e4bb2aa51d0827984791841d,2398
82
+ kimi_cli-0.41.dist-info/WHEEL,sha256=70ab3c2925fe316809860cb034f99ba13c4b49819b339959274aab755cc084a8,78
83
+ kimi_cli-0.41.dist-info/entry_points.txt,sha256=97e051756296e9db3167f6dce61d6c88e58d170314a2d63d18c84c73a5c1333b,44
84
+ kimi_cli-0.41.dist-info/METADATA,sha256=d3865fbce4c1bdaae5bd311dab5cca3569035d80cb65b27185d740596522c5e2,5187
85
+ kimi_cli-0.41.dist-info/RECORD,,
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ kimi = kimi_cli.cli:main
3
+
kimi_cli/agent.py DELETED
@@ -1,261 +0,0 @@
1
- import importlib
2
- import inspect
3
- import string
4
- from pathlib import Path
5
- from typing import Any, NamedTuple
6
-
7
- import fastmcp
8
- import yaml
9
- from kosong.tooling import Toolset
10
- from kosong.tooling.simple import ToolType
11
- from pydantic import BaseModel, Field
12
-
13
- from kimi_cli.config import Config
14
- from kimi_cli.llm import LLM
15
- from kimi_cli.metadata import Session
16
- from kimi_cli.soul.approval import Approval
17
- from kimi_cli.soul.denwarenji import DenwaRenji
18
- from kimi_cli.soul.toolset import CustomToolset
19
- from kimi_cli.tools.mcp import MCPTool
20
- from kimi_cli.utils.logging import logger
21
-
22
-
23
- class AgentSpec(BaseModel):
24
- """Agent specification."""
25
-
26
- extend: str | None = Field(default=None, description="Agent file to extend")
27
- name: str | None = Field(default=None, description="Agent name") # required
28
- system_prompt_path: Path | None = Field(
29
- default=None, description="System prompt path"
30
- ) # required
31
- system_prompt_args: dict[str, str] = Field(
32
- default_factory=dict, description="System prompt arguments"
33
- )
34
- tools: list[str] | None = Field(default=None, description="Tools") # required
35
- exclude_tools: list[str] | None = Field(default=None, description="Tools to exclude")
36
- subagents: dict[str, "SubagentSpec"] | None = Field(default=None, description="Subagents")
37
-
38
-
39
- class SubagentSpec(BaseModel):
40
- """Subagent specification."""
41
-
42
- path: Path = Field(description="Subagent file path")
43
- description: str = Field(description="Subagent description")
44
-
45
-
46
- class BuiltinSystemPromptArgs(NamedTuple):
47
- """Builtin system prompt arguments."""
48
-
49
- KIMI_NOW: str
50
- """The current datetime."""
51
- KIMI_WORK_DIR: Path
52
- """The current working directory."""
53
- KIMI_WORK_DIR_LS: str
54
- """The `ls -la` output of current working directory."""
55
- KIMI_AGENTS_MD: str # TODO: move to first message from system prompt
56
- """The content of AGENTS.md."""
57
-
58
-
59
- class AgentGlobals(NamedTuple):
60
- """Agent globals."""
61
-
62
- config: Config
63
- llm: LLM | None
64
- builtin_args: BuiltinSystemPromptArgs
65
- denwa_renji: DenwaRenji
66
- session: Session
67
- approval: Approval
68
-
69
-
70
- class Agent(NamedTuple):
71
- """The loaded agent."""
72
-
73
- name: str
74
- system_prompt: str
75
- toolset: Toolset
76
-
77
-
78
- def get_agents_dir() -> Path:
79
- return Path(__file__).parent / "agents"
80
-
81
-
82
- DEFAULT_AGENT_FILE = get_agents_dir() / "koder" / "agent.yaml"
83
-
84
-
85
- async def load_agent_with_mcp(
86
- agent_file: Path,
87
- globals_: AgentGlobals,
88
- mcp_configs: list[dict[str, Any]],
89
- ) -> Agent:
90
- agent = load_agent(agent_file, globals_)
91
- assert isinstance(agent.toolset, CustomToolset)
92
- if mcp_configs:
93
- await _load_mcp_tools(agent.toolset, mcp_configs)
94
- return agent
95
-
96
-
97
- def load_agent(
98
- agent_file: Path,
99
- globals_: AgentGlobals,
100
- ) -> Agent:
101
- """
102
- Load agent from specification file.
103
-
104
- Raises:
105
- ValueError: If the agent spec is not valid.
106
- """
107
- agent_spec = _load_agent_spec(agent_file)
108
- assert agent_spec.extend is None, "agent extension should be recursively resolved"
109
- if agent_spec.name is None:
110
- raise ValueError("Agent name is required")
111
- if agent_spec.system_prompt_path is None:
112
- raise ValueError("System prompt path is required")
113
- if agent_spec.tools is None:
114
- raise ValueError("Tools are required")
115
-
116
- system_prompt = _load_system_prompt(
117
- agent_spec.system_prompt_path, agent_spec.system_prompt_args, globals_.builtin_args
118
- )
119
-
120
- tool_deps = {
121
- AgentSpec: agent_spec,
122
- AgentGlobals: globals_,
123
- Config: globals_.config,
124
- BuiltinSystemPromptArgs: globals_.builtin_args,
125
- Session: globals_.session,
126
- DenwaRenji: globals_.denwa_renji,
127
- Approval: globals_.approval,
128
- }
129
- tools = agent_spec.tools
130
- if agent_spec.exclude_tools:
131
- logger.debug("Excluding tools: {tools}", tools=agent_spec.exclude_tools)
132
- tools = [tool for tool in tools if tool not in agent_spec.exclude_tools]
133
- toolset = CustomToolset()
134
- bad_tools = _load_tools(toolset, tools, tool_deps)
135
- if bad_tools:
136
- raise ValueError(f"Invalid tools: {bad_tools}")
137
-
138
- return Agent(
139
- name=agent_spec.name,
140
- system_prompt=system_prompt,
141
- toolset=toolset,
142
- )
143
-
144
-
145
- def _load_agent_spec(agent_file: Path) -> AgentSpec:
146
- assert agent_file.is_file(), "expect agent file to exist"
147
- with open(agent_file, encoding="utf-8") as f:
148
- data: dict[str, Any] = yaml.safe_load(f)
149
-
150
- version = data.get("version", 1)
151
- if version != 1:
152
- raise ValueError(f"Unsupported agent spec version: {version}")
153
-
154
- agent_spec = AgentSpec(**data.get("agent", {}))
155
- if agent_spec.system_prompt_path is not None:
156
- agent_spec.system_prompt_path = agent_file.parent / agent_spec.system_prompt_path
157
- if agent_spec.subagents is not None:
158
- for v in agent_spec.subagents.values():
159
- v.path = agent_file.parent / v.path
160
- if agent_spec.extend:
161
- if agent_spec.extend == "default":
162
- base_agent_file = DEFAULT_AGENT_FILE
163
- else:
164
- base_agent_file = agent_file.parent / agent_spec.extend
165
- base_agent_spec = _load_agent_spec(base_agent_file)
166
- if agent_spec.name is not None:
167
- base_agent_spec.name = agent_spec.name
168
- if agent_spec.system_prompt_path is not None:
169
- base_agent_spec.system_prompt_path = agent_spec.system_prompt_path
170
- for k, v in agent_spec.system_prompt_args.items():
171
- base_agent_spec.system_prompt_args[k] = v
172
- if agent_spec.tools is not None:
173
- base_agent_spec.tools = agent_spec.tools
174
- if agent_spec.exclude_tools is not None:
175
- base_agent_spec.exclude_tools = agent_spec.exclude_tools
176
- if agent_spec.subagents is not None:
177
- base_agent_spec.subagents = agent_spec.subagents
178
- agent_spec = base_agent_spec
179
- return agent_spec
180
-
181
-
182
- def _load_system_prompt(
183
- path: Path, args: dict[str, str], builtin_args: BuiltinSystemPromptArgs
184
- ) -> str:
185
- system_prompt = path.read_text().strip()
186
- logger.debug(
187
- "Substituting system prompt with builtin args: {builtin_args}, spec args: {spec_args}",
188
- builtin_args=builtin_args,
189
- spec_args=args,
190
- )
191
- return string.Template(system_prompt).substitute(builtin_args._asdict(), **args)
192
-
193
-
194
- def _load_tools(
195
- toolset: CustomToolset,
196
- tool_paths: list[str],
197
- dependencies: dict[type[Any], Any],
198
- ) -> list[str]:
199
- bad_tools = []
200
- for tool_path in tool_paths:
201
- tool = _load_tool(tool_path, dependencies)
202
- if tool:
203
- toolset += tool
204
- else:
205
- bad_tools.append(tool_path)
206
- logger.debug("Loaded tools: {tools}", tools=toolset.tools)
207
- if bad_tools:
208
- logger.error("Bad tools: {bad_tools}", bad_tools=bad_tools)
209
- return bad_tools
210
-
211
-
212
- def _load_tool(tool_path: str, dependencies: dict[type[Any], Any]) -> ToolType | None:
213
- logger.debug("Loading tool: {tool_path}", tool_path=tool_path)
214
- module_name, class_name = tool_path.rsplit(":", 1)
215
- try:
216
- module = importlib.import_module(module_name)
217
- except ImportError:
218
- return None
219
- cls = getattr(module, class_name, None)
220
- if cls is None:
221
- return None
222
- args = []
223
- for param in inspect.signature(cls).parameters.values():
224
- if param.kind == inspect.Parameter.KEYWORD_ONLY:
225
- # once we encounter a keyword-only parameter, we stop injecting dependencies
226
- break
227
- # all positional parameters should be dependencies to be injected
228
- if param.annotation not in dependencies:
229
- raise ValueError(f"Tool dependency not found: {param.annotation}")
230
- args.append(dependencies[param.annotation])
231
- return cls(*args)
232
-
233
-
234
- async def _load_mcp_tools(
235
- toolset: CustomToolset,
236
- mcp_configs: list[dict[str, Any]],
237
- ):
238
- """
239
- Raises:
240
- ValueError: If the MCP config is not valid.
241
- RuntimeError: If the MCP server cannot be connected.
242
- """
243
- for mcp_config in mcp_configs:
244
- client = fastmcp.Client(mcp_config)
245
- async with client:
246
- for tool in await client.list_tools():
247
- toolset += MCPTool(tool, client)
248
- return toolset
249
-
250
-
251
- def load_agents_md(work_dir: Path) -> str | None:
252
- paths = [
253
- work_dir / "AGENTS.md",
254
- work_dir / "agents.md",
255
- ]
256
- for path in paths:
257
- if path.is_file():
258
- logger.debug("Loaded agents.md: {path}", path=path)
259
- return path.read_text().strip()
260
- logger.debug("No AGENTS.md found")
261
- return None
@@ -1,72 +0,0 @@
1
- import os
2
-
3
- from kosong.chat_provider import ChaosChatProvider, Kimi, OpenAILegacy
4
- from kosong.chat_provider.chaos import ChaosConfig
5
- from pydantic import SecretStr
6
-
7
- import kimi_cli
8
- from kimi_cli.config import LLMModel, LLMProvider
9
- from kimi_cli.llm import LLM
10
-
11
-
12
- def augment_provider_with_env_vars(provider: LLMProvider, model: LLMModel):
13
- match provider.type:
14
- case "kimi":
15
- if base_url := os.getenv("KIMI_BASE_URL"):
16
- provider.base_url = base_url
17
- if api_key := os.getenv("KIMI_API_KEY"):
18
- provider.api_key = SecretStr(api_key)
19
- if model_name := os.getenv("KIMI_MODEL_NAME"):
20
- model.model = model_name
21
- if max_context_size := os.getenv("KIMI_MODEL_MAX_CONTEXT_SIZE"):
22
- model.max_context_size = int(max_context_size)
23
- case "openai_legacy":
24
- if base_url := os.getenv("OPENAI_BASE_URL"):
25
- provider.base_url = base_url
26
- if api_key := os.getenv("OPENAI_API_KEY"):
27
- provider.api_key = SecretStr(api_key)
28
- case _:
29
- pass
30
-
31
-
32
- def create_llm(
33
- provider: LLMProvider,
34
- model: LLMModel,
35
- *,
36
- stream: bool = True,
37
- session_id: str | None = None,
38
- ) -> LLM:
39
- match provider.type:
40
- case "kimi":
41
- chat_provider = Kimi(
42
- model=model.model,
43
- base_url=provider.base_url,
44
- api_key=provider.api_key.get_secret_value(),
45
- stream=stream,
46
- default_headers={
47
- "User-Agent": kimi_cli.USER_AGENT,
48
- },
49
- )
50
- if session_id:
51
- chat_provider = chat_provider.with_generation_kwargs(prompt_cache_key=session_id)
52
- case "openai_legacy":
53
- chat_provider = OpenAILegacy(
54
- model=model.model,
55
- base_url=provider.base_url,
56
- api_key=provider.api_key.get_secret_value(),
57
- stream=stream,
58
- )
59
- case "_chaos":
60
- chat_provider = ChaosChatProvider(
61
- model=model.model,
62
- base_url=provider.base_url,
63
- api_key=provider.api_key.get_secret_value(),
64
- chaos_config=ChaosConfig(
65
- error_probability=0.8,
66
- error_types=[429, 500, 503],
67
- ),
68
- )
69
- case _:
70
- raise ValueError(f"Unsupported provider: {provider.type}")
71
-
72
- return LLM(chat_provider=chat_provider, max_context_size=model.max_context_size)
@@ -1,80 +0,0 @@
1
- kimi_cli/CHANGELOG.md,sha256=0ded00048bd564f13c14a98e6a8eaf8e0730c02d2ab16b997b68e383626baa0c,7178
2
- kimi_cli/__init__.py,sha256=80ff28778a1d9c1ee9d43be6f4e673fda3b44a0ec1aadc272cb859776f152f0a,11390
3
- kimi_cli/agent.py,sha256=46fc0293489cc1d5daaa9be6b29c8a17bbf8c5a552fd437941eb1f0ae1335a3a,8528
4
- kimi_cli/agents/koder/README.md,sha256=2d9a987110652915cd1a4356caec3eef9380479ce36906c377a1ed177d46690f,96
5
- kimi_cli/agents/koder/agent.yaml,sha256=f1c5c585e8e0a52419c820d56a4aa928eebdf7bb21f0907d6c02d4ea1c8909d7,709
6
- kimi_cli/agents/koder/sub.yaml,sha256=e0c1ea34fdb04b0d6dc635709f0f130aff25d7f9fb97e238470143c8145be251,634
7
- kimi_cli/agents/koder/system.md,sha256=27ef94b525e846f6a8e55222042b6ca8eb8d2663ff7009d7b07c50ed8798bb02,4999
8
- kimi_cli/config.py,sha256=37dd65f2aa03c051dc92d09d9c110361ee35bb8dc94eced2c1e8bf01e3918353,4157
9
- kimi_cli/llm.py,sha256=e4c4a184ce7b78fb60ce29f7b967676dd338131ab05f5ea7c3cb7b3e7c6a64d4,165
10
- kimi_cli/metadata.py,sha256=70c01da57529a9f585c0c5f3dd642f92ef16c4e49a107d8da838fa6d4746546a,3933
11
- kimi_cli/prompts/__init__.py,sha256=56bee1833b9555c71f50d0def3de7fb6d78e018826d925686ce9295815edb666,142
12
- kimi_cli/prompts/compact.md,sha256=6655bd7d8270b24d8f97b51ef7c471cf71d686c56f8ec9a5cc9e47caa3aae87c,1877
13
- kimi_cli/prompts/init.md,sha256=d271a0df6dd7b330ffec4f645a74c0392dafc1b3bfc1e3f2a77624e96cf6abbe,1380
14
- kimi_cli/py.typed,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
15
- kimi_cli/share.py,sha256=4292df7f44177419c45c772a933b5f36e2b7533f8cef9842629a438bc7856dc0,204
16
- kimi_cli/soul/__init__.py,sha256=058102a5dfaa73fab1f78e3e3f9d1a039a47410e197fef6a4482f2b2531b98b0,1561
17
- kimi_cli/soul/approval.py,sha256=3015fddcead40c00a594147e040c45a0b7f86a3f25322b2839a9e3b72944c935,2634
18
- kimi_cli/soul/compaction.py,sha256=03213007626dcb7453d3c5ad08381c83d7e7feb8f8b8a434ab33dc71243512bf,3506
19
- kimi_cli/soul/context.py,sha256=541759a65f8f87a3424a6da160ffb2043046e6f6b714124d94d82a77635df9bc,5855
20
- kimi_cli/soul/denwarenji.py,sha256=66b95f052a1fa844e2347972d34e1916a7be24d3e493701b451f5380b0375c9f,1384
21
- kimi_cli/soul/kimisoul.py,sha256=9b4b7419b03feec2aa1a7ef784bf7e67cb95409316a7031d85ad50b99ebc34f2,11749
22
- kimi_cli/soul/message.py,sha256=16bbdc203c791dc50c7ebbc52d91fae801313920db1029217f30b5516ba5dbf3,2459
23
- kimi_cli/soul/toolset.py,sha256=60166d89ef0efac690fa6866e88afe70fbe80ad862ba2524d70ddf657a730d14,744
24
- kimi_cli/soul/wire.py,sha256=c69a1e45c584b8a43eddf2230f38b414ce7ffb5b43ad18ff822e0cb36e1b42a6,3367
25
- kimi_cli/tools/__init__.py,sha256=4d612402814eede7182e0a55e7dd21c4532b5dd44700dc744763a8308c2f74f8,3280
26
- kimi_cli/tools/bash/__init__.py,sha256=75a61d3e12481dea075229b9fe831029768b38a5575bc2eb7d6c39d71c0459da,2996
27
- kimi_cli/tools/bash/bash.md,sha256=5d9cc54b3718097951340b0a737c8e1fa308341fd2c4ebd121be94de31dd5f73,2348
28
- kimi_cli/tools/dmail/__init__.py,sha256=76b2175bc4acd307db0f761b995a9c2cd8ac12f25296fab14707adb9a1baa13b,1261
29
- kimi_cli/tools/dmail/dmail.md,sha256=0d18cae387dd52127ddc99e296253c09e68ccba5f343153c0adbe77d7586e759,1912
30
- kimi_cli/tools/file/__init__.py,sha256=1516fb4c71097f9c14b605e7b9a1872af8786bdcb48323d1fa83bb1419436abb,546
31
- kimi_cli/tools/file/glob.md,sha256=6aab77c357c203fb2d5cc2092375ce860941e3f7343b59e6ef264f42255163fa,1401
32
- kimi_cli/tools/file/glob.py,sha256=fabd6fbc1480a52d07c5ff3d570e3fb86d455438e97a9970dc44a0e7ff434101,5405
33
- kimi_cli/tools/file/grep.md,sha256=12353db42cf3b5d9d91ac7c0f0b9c2a732e8b050c23a78f4e668db823cca4d50,245
34
- kimi_cli/tools/file/grep.py,sha256=765a7f7c3387f05c2d47781b484c612639e1cfd3a1b77291e3613ce239e46947,9720
35
- kimi_cli/tools/file/patch.md,sha256=f9edbed6c6a03bf7448a51acc1f42622395fd7f1674a814e9a3b2302d3b7b92e,404
36
- kimi_cli/tools/file/patch.py,sha256=09e0a6905e27246d83595557dd8867f53a68b158854cdb3b0b8cd23c255a1926,5205
37
- kimi_cli/tools/file/read.md,sha256=4c2d83e557daadc0612fb1a613e252b2c8e4df7ae57e6db094e9e75e994cb23b,1066
38
- kimi_cli/tools/file/read.py,sha256=c1824f0e7a56a065808414580663ba4363fcef0d374ba5ea2e8848ac411b5a5d,5061
39
- kimi_cli/tools/file/replace.md,sha256=f429f263fa580f2f6107907a33ba8800dcdbd4fc1d9ff8dc4f858bd76ec6bbc6,267
40
- kimi_cli/tools/file/replace.py,sha256=37582cd51534f6b35c08144ec6558906545140512172e204e6b5937e423adbbe,5181
41
- kimi_cli/tools/file/write.md,sha256=f37b0f4742da57797ec4dd29fbd4fdc9b6617c6be644724a3b16d651c6129cec,324
42
- kimi_cli/tools/file/write.py,sha256=6c3b04b31422f95ac06ba4afddf3899ed1c635119082dea57d6ef7315b2e0cd8,4355
43
- kimi_cli/tools/mcp.py,sha256=12f63c9ee5b82a5b0f23daca0b5ce4ceb3a6190ce5b553ee24e499699521e426,3620
44
- kimi_cli/tools/task/__init__.py,sha256=82b1d73280ba3b616c2a0b3432a854e08786289002abc8233f3186b8f3bcd94f,5915
45
- kimi_cli/tools/task/task.md,sha256=eaac7458676271423e53862bb27906ed8df3b86c767abd69e28a5d52f9eecdbf,2280
46
- kimi_cli/tools/test.py,sha256=c094a91a2d1a5259e192f1147facd5eebd5e5c413787fce167db90e4b41b5119,1442
47
- kimi_cli/tools/think/__init__.py,sha256=31b06088e2404cb09d42e0acec97c185e4861890bb687f28b41f39cea01b5733,603
48
- kimi_cli/tools/think/think.md,sha256=ab40d4de1d8adb208384a4ab548e35776283cb0a681c6e208b041fc40ccba724,200
49
- kimi_cli/tools/todo/__init__.py,sha256=a21948c8635c42743e99651297ba20430c82e75a5f862e1952143987811ac009,881
50
- kimi_cli/tools/todo/set_todo_list.md,sha256=89509503f43ab321d440a04dc133ddc3e29859f68907a42c39e6093f7bfd485c,1654
51
- kimi_cli/tools/utils.py,sha256=5331f57c95df817285a5a1ea2921bee3b0bcabf6fc50eb4abcb6587839323443,4580
52
- kimi_cli/tools/web/__init__.py,sha256=e13108c598828a8a05907a7a821e7ac92f5d63572bb9866dc12ca026094acb42,95
53
- kimi_cli/tools/web/fetch.md,sha256=56d00bd93b4e379c4f7efe445fce963eb26b8d20f85d4c19097ba6f33bd0019a,67
54
- kimi_cli/tools/web/fetch.py,sha256=f0e00464e8c5e6fadd7a31b27eded781921bffdaa6fcbd0ca79247e71fe2e61b,3132
55
- kimi_cli/tools/web/search.md,sha256=24049f9e90d37083e0fc78b8b2e3a5f6fadf09bea00f36712b235d1212a2f532,146
56
- kimi_cli/tools/web/search.py,sha256=cba367a80b224c2a80e61c0c33bca6ff61c57b202a2e9f8037e221a60f05c340,4295
57
- kimi_cli/ui/__init__.py,sha256=127928de433021e42fdaab56188457896283cd5e188c7c0f21c2eb718e040495,2386
58
- kimi_cli/ui/acp/__init__.py,sha256=e5a93c3bbbb919fae41cedd829dbe1363ebcb56feb6413c47071692876007d52,17349
59
- kimi_cli/ui/print/__init__.py,sha256=9ea2933a00959eb19a07ed1abb3d1aff0d3dc3ee7e393271125fe210a085ecc5,6734
60
- kimi_cli/ui/shell/__init__.py,sha256=165f60912c29f5bc409a0e53efc921c04893a138a09218597f758212182ad434,10705
61
- kimi_cli/ui/shell/console.py,sha256=bcbf7efd214cba3d2259f2a2c1842250cde96d49e4f9f1e0b60273cf1c366be3,842
62
- kimi_cli/ui/shell/debug.py,sha256=cd4e7259c83f099b5c6519713be5306580f30d3fa4944e07916d4468e960c9c7,5562
63
- kimi_cli/ui/shell/keyboard.py,sha256=8735c00363484263681adf885baec824e5f76cb4084bd024651e80190926edc5,3035
64
- kimi_cli/ui/shell/liveview.py,sha256=0d91dc3f851563ae514310a054b084b13fda06d33819c75b7b818d407e8a99ac,13862
65
- kimi_cli/ui/shell/metacmd.py,sha256=bb24538dbe451b14427697691275ec7d6ffd2e4a724cdc2f43b726ea7d71d744,7778
66
- kimi_cli/ui/shell/prompt.py,sha256=f85446d77b998e2594380c29000b06614e3fae8537db46ec96fc5ddc25490b45,19096
67
- kimi_cli/ui/shell/setup.py,sha256=cd87fef38b213cb6c1adba11851b0bf36059f564fe6002017bb36486446443e6,5282
68
- kimi_cli/ui/shell/update.py,sha256=bc331f832d2c41d5b95f4926c4ff235ef92e70ff76d66173c354f05ee52545dd,7266
69
- kimi_cli/ui/shell/visualize.py,sha256=a5ff51441e80587909e9337c293762e55be24534331c24e71539c7b166ed568b,4032
70
- kimi_cli/utils/changelog.py,sha256=9d9ae05f32e90a53d40626fca437b9a10e8bec5b3e63e9348135969dcab4380e,3380
71
- kimi_cli/utils/logging.py,sha256=129298ac214ecd8d913c3431cc05d754f9c4c8c4042c458618bf9e8ddebdb763,399
72
- kimi_cli/utils/message.py,sha256=ca8f8d3c7dc6d4fce938d1cfe8a7a7343e39ce1e2f0c7b2d76d838edc7d9f187,304
73
- kimi_cli/utils/path.py,sha256=fdd4fc08999ddc7c610f884b4ba8d27932248b9ed06b5eb4139519edd00b3f75,687
74
- kimi_cli/utils/provider.py,sha256=195ae475e3f87fff81f98b2714aa3d38049dcf8194a5ba933290d0e475ba9a10,2553
75
- kimi_cli/utils/pyinstaller.py,sha256=e5d709d0490ef8645bbed2d2363920c59f25bd17c04f471bf4a8c0fa2ebe1801,581
76
- kimi_cli/utils/string.py,sha256=f8a842ee014b9023d4045392f33ca6f576f5238ad3d40cb6df071a3ce9f5ed9c,365
77
- kimi_cli-0.39.dist-info/WHEEL,sha256=70ab3c2925fe316809860cb034f99ba13c4b49819b339959274aab755cc084a8,78
78
- kimi_cli-0.39.dist-info/entry_points.txt,sha256=d5b0f8ebf823d7590e90bf9511c8ab13f73db97cba1e1fc88585d8d7b415bcc2,40
79
- kimi_cli-0.39.dist-info/METADATA,sha256=ebf4fcfa32c5003f018d1cca3ba9e369ddafb65a3cc033df664e5e3c6e5200ff,4152
80
- kimi_cli-0.39.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- [console_scripts]
2
- kimi = kimi_cli:main
3
-